* FILE: drivers/filesystems/msfs/create.c
* PURPOSE: Mailslot filesystem
* PROGRAMMER: Eric Kohl
+ * Nikita Pechenkin (n.pechenkin@mail.ru)
*/
/* INCLUDES ******************************************************************/
DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
- Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
+ Ccb = ExAllocatePoolWithTag(NonPagedPool, sizeof(MSFS_CCB), 'cFsM');
if (Ccb == NULL)
{
Irp->IoStatus.Status = STATUS_NO_MEMORY;
if (current_entry == &DeviceExtension->FcbListHead)
{
- ExFreePool(Ccb);
+ ExFreePoolWithTag(Ccb, 'cFsM');
KeUnlockMutex(&DeviceExtension->FcbListLock);
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
MsfsCreateMailslot(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
- PEXTENDED_IO_STACK_LOCATION IoStack;
+ PIO_STACK_LOCATION IoStack;
PFILE_OBJECT FileObject;
PMSFS_DEVICE_EXTENSION DeviceExtension;
PMSFS_FCB Fcb;
DPRINT("MsfsCreateMailslot(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
- IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
DeviceExtension = DeviceObject->DeviceExtension;
FileObject = IoStack->FileObject;
Buffer = IoStack->Parameters.CreateMailslot.Parameters;
DPRINT("Mailslot name: %wZ\n", &FileObject->FileName);
- Fcb = ExAllocatePool(NonPagedPool, sizeof(MSFS_FCB));
+ Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(MSFS_FCB), 'fFsM');
if (Fcb == NULL)
{
Irp->IoStatus.Status = STATUS_NO_MEMORY;
Fcb->Name.Length = FileObject->FileName.Length;
Fcb->Name.MaximumLength = Fcb->Name.Length + sizeof(UNICODE_NULL);
- Fcb->Name.Buffer = ExAllocatePool(NonPagedPool, Fcb->Name.MaximumLength);
+ Fcb->Name.Buffer = ExAllocatePoolWithTag(NonPagedPool,
+ Fcb->Name.MaximumLength,
+ 'NFsM');
if (Fcb->Name.Buffer == NULL)
{
- ExFreePool(Fcb);
+ ExFreePoolWithTag(Fcb, 'fFsM');
Irp->IoStatus.Status = STATUS_NO_MEMORY;
Irp->IoStatus.Information = 0;
RtlCopyUnicodeString(&Fcb->Name, &FileObject->FileName);
- Ccb = ExAllocatePool(NonPagedPool, sizeof(MSFS_CCB));
+ Ccb = ExAllocatePoolWithTag(NonPagedPool, sizeof(MSFS_CCB), 'cFsM');
if (Ccb == NULL)
{
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
+ ExFreePoolWithTag(Fcb->Name.Buffer, 'NFsM');
+ ExFreePoolWithTag(Fcb, 'fFsM');
Irp->IoStatus.Status = STATUS_NO_MEMORY;
Irp->IoStatus.Information = 0;
Fcb->MaxMessageSize = Buffer->MaximumMessageSize;
Fcb->MessageCount = 0;
Fcb->TimeOut = Buffer->ReadTimeout;
- KeInitializeEvent(&Fcb->MessageEvent,
- NotificationEvent,
- FALSE);
InitializeListHead(&Fcb->MessageListHead);
KeInitializeSpinLock(&Fcb->MessageListLock);
+ KeInitializeSpinLock(&Fcb->QueueLock);
+ InitializeListHead(&Fcb->PendingIrpQueue);
+ IoCsqInitialize(&Fcb->CancelSafeQueue,
+ MsfsInsertIrp,
+ MsfsRemoveIrp,
+ MsfsPeekNextIrp,
+ MsfsAcquireLock,
+ MsfsReleaseLock,
+ MsfsCompleteCanceledIrp);
+
KeLockMutex(&DeviceExtension->FcbListLock);
current_entry = DeviceExtension->FcbListHead.Flink;
while (current_entry != &DeviceExtension->FcbListHead)
if (current_entry != &DeviceExtension->FcbListHead)
{
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
- ExFreePool(Ccb);
+ ExFreePoolWithTag(Fcb->Name.Buffer, 'NFsM');
+ ExFreePoolWithTag(Fcb, 'fFsM');
+ ExFreePoolWithTag(Ccb, 'cFsM');
KeUnlockMutex(&DeviceExtension->FcbListLock);
MSFS_MESSAGE,
MessageListEntry);
RemoveEntryList(Fcb->MessageListHead.Flink);
- ExFreePool(Message);
+ ExFreePoolWithTag(Message, 'rFsM');
}
Fcb->MessageCount = 0;
KeAcquireSpinLock(&Fcb->CcbListLock, &oldIrql);
RemoveEntryList(&Ccb->CcbListEntry);
KeReleaseSpinLock(&Fcb->CcbListLock, oldIrql);
- ExFreePool(Ccb);
+ ExFreePoolWithTag(Ccb, 'cFsM');
FileObject->FsContext2 = NULL;
if (Fcb->ReferenceCount == 0)
{
DPRINT("ReferenceCount == 0: Deleting mailslot data\n");
RemoveEntryList(&Fcb->FcbListEntry);
- ExFreePool(Fcb->Name.Buffer);
- ExFreePool(Fcb);
+ ExFreePoolWithTag(Fcb->Name.Buffer, 'NFsM');
+ ExFreePoolWithTag(Fcb, 'fFsM');
}
KeUnlockMutex(&DeviceExtension->FcbListLock);