[AFD] Mark the socket as named pipe, so NtWriteFile actually knows what to do with it.
[reactos.git] / drivers / network / afd / afd / main.c
index eb050bd..04e2865 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id$
+/*
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
  * FILE:             drivers/net/afd/afd/main.c
@@ -27,7 +27,7 @@ void OskitDumpBuffer( PCHAR Data, UINT Len ) {
 
     for( i = 0; i < Len; i++ ) {
         if( i && !(i & 0xf) ) DbgPrint( "\n" );
-        if( !(i & 0xf) ) DbgPrint( "%08x: ", (UINT)(Data + i) );
+        if( !(i & 0xf) ) DbgPrint( "%p: ", (Data + i) );
         DbgPrint( " %02x", Data[i] & 0xff );
     }
     DbgPrint("\n");
@@ -46,6 +46,8 @@ AfdGetDisconnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PAFD_FCB FCB = FileObject->FsContext;
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (FCB->DisconnectOptionsSize == 0)
@@ -75,6 +77,8 @@ AfdSetDisconnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PVOID DisconnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT DisconnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!DisconnectOptions)
@@ -82,13 +86,16 @@ AfdSetDisconnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->DisconnectOptions)
     {
-        ExFreePool(FCB->DisconnectOptions);
+        ExFreePoolWithTag(FCB->DisconnectOptions, TAG_AFD_DISCONNECT_OPTIONS);
         FCB->DisconnectOptions = NULL;
         FCB->DisconnectOptionsSize = 0;
         FCB->FilledDisconnectOptions = 0;
     }
 
-    FCB->DisconnectOptions = ExAllocatePool(PagedPool, DisconnectOptionsSize);
+    FCB->DisconnectOptions = ExAllocatePoolWithTag(PagedPool,
+                                                   DisconnectOptionsSize,
+                                                   TAG_AFD_DISCONNECT_OPTIONS);
+
     if (!FCB->DisconnectOptions)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
@@ -111,6 +118,8 @@ AfdSetDisconnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PUINT DisconnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!DisconnectOptionsSize)
@@ -124,12 +133,15 @@ AfdSetDisconnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->DisconnectOptions)
     {
-        ExFreePool(FCB->DisconnectOptions);
+        ExFreePoolWithTag(FCB->DisconnectOptions, TAG_AFD_DISCONNECT_OPTIONS);
         FCB->DisconnectOptionsSize = 0;
         FCB->FilledDisconnectOptions = 0;
     }
 
-    FCB->DisconnectOptions = ExAllocatePool(PagedPool, *DisconnectOptionsSize);
+    FCB->DisconnectOptions = ExAllocatePoolWithTag(PagedPool,
+                                                   *DisconnectOptionsSize,
+                                                   TAG_AFD_DISCONNECT_OPTIONS);
+
     if (!FCB->DisconnectOptions) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     FCB->DisconnectOptionsSize = *DisconnectOptionsSize;
@@ -145,6 +157,8 @@ AfdGetDisconnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PAFD_FCB FCB = FileObject->FsContext;
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (FCB->DisconnectDataSize == 0)
@@ -175,6 +189,8 @@ AfdSetDisconnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PVOID DisconnectData = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT DisconnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!DisconnectData)
@@ -182,13 +198,16 @@ AfdSetDisconnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->DisconnectData)
     {
-        ExFreePool(FCB->DisconnectData);
+        ExFreePoolWithTag(FCB->DisconnectData, TAG_AFD_DISCONNECT_DATA);
         FCB->DisconnectData = NULL;
         FCB->DisconnectDataSize = 0;
         FCB->FilledDisconnectData = 0;
     }
 
-    FCB->DisconnectData = ExAllocatePool(PagedPool, DisconnectDataSize);
+    FCB->DisconnectData = ExAllocatePoolWithTag(PagedPool,
+                                                DisconnectDataSize,
+                                                TAG_AFD_DISCONNECT_DATA);
+
     if (!FCB->DisconnectData)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
@@ -211,6 +230,8 @@ AfdSetDisconnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PUINT DisconnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!DisconnectDataSize)
@@ -224,12 +245,15 @@ AfdSetDisconnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->DisconnectData)
     {
-        ExFreePool(FCB->DisconnectData);
+        ExFreePoolWithTag(FCB->DisconnectData, TAG_AFD_DISCONNECT_DATA);
         FCB->DisconnectDataSize = 0;
         FCB->FilledDisconnectData = 0;
     }
 
-    FCB->DisconnectData = ExAllocatePool(PagedPool, *DisconnectDataSize);
+    FCB->DisconnectData = ExAllocatePoolWithTag(PagedPool,
+                                                *DisconnectDataSize,
+                                                TAG_AFD_DISCONNECT_DATA);
+
     if (!FCB->DisconnectData)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
@@ -247,6 +271,8 @@ AfdGetTdiHandles(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PULONG HandleFlags = LockRequest(Irp, IrpSp, TRUE, NULL);
     PAFD_TDI_HANDLE_DATA HandleData = Irp->UserBuffer;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!HandleFlags)
@@ -287,6 +313,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     DeviceExt = DeviceObject->DeviceExtension;
     FileObject = IrpSp->FileObject;
+    FileObject->Flags |= FO_NAMED_PIPE;
     //Disposition = (IrpSp->Parameters.Create.Options >> 24) & 0xff;
 
     Irp->IoStatus.Information = 0;
@@ -299,20 +326,20 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
         //EaLength = sizeof(FILE_FULL_EA_INFORMATION) + EaInfo->EaNameLength + EaInfo->EaValueLength;
 
-        AFD_DbgPrint(MID_TRACE,("EaInfo: %x, EaInfoValue: %x\n",
+        AFD_DbgPrint(MID_TRACE,("EaInfo: %p, EaInfoValue: %p\n",
                                 EaInfo, EaInfoValue));
     }
 
     AFD_DbgPrint(MID_TRACE,("About to allocate the new FCB\n"));
 
-    FCB = ExAllocatePool(NonPagedPool, sizeof(AFD_FCB));
+    FCB = ExAllocatePoolWithTag(NonPagedPool, sizeof(AFD_FCB), TAG_AFD_FCB);
     if( FCB == NULL ) {
         Irp->IoStatus.Status = STATUS_NO_MEMORY;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return STATUS_NO_MEMORY;
     }
 
-    AFD_DbgPrint(MID_TRACE,("Initializing the new FCB @ %x (FileObject %x Flags %x)\n",
+    AFD_DbgPrint(MID_TRACE,("Initializing the new FCB @ %p (FileObject %p Flags %x)\n",
                             FCB, FileObject, ConnectInfo ? ConnectInfo->EndpointFlags : 0));
 
     RtlZeroMemory( FCB, sizeof( *FCB ) );
@@ -335,16 +362,17 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     InitializeListHead( &FCB->DatagramList );
     InitializeListHead( &FCB->PendingConnections );
 
-    AFD_DbgPrint(MID_TRACE,("%x: Checking command channel\n", FCB));
+    AFD_DbgPrint(MID_TRACE,("%p: Checking command channel\n", FCB));
 
     if( ConnectInfo ) {
         FCB->TdiDeviceName.Length = ConnectInfo->SizeOfTransportName;
         FCB->TdiDeviceName.MaximumLength = FCB->TdiDeviceName.Length;
-        FCB->TdiDeviceName.Buffer =
-            ExAllocatePool( NonPagedPool, FCB->TdiDeviceName.Length );
+        FCB->TdiDeviceName.Buffer = ExAllocatePoolWithTag(NonPagedPool,
+                                                          FCB->TdiDeviceName.Length,
+                                                          TAG_AFD_TRANSPORT_ADDRESS);
 
         if( !FCB->TdiDeviceName.Buffer ) {
-            ExFreePool(FCB);
+            ExFreePoolWithTag(FCB, TAG_AFD_FCB);
             AFD_DbgPrint(MID_TRACE,("Could not copy target string\n"));
             Irp->IoStatus.Status = STATUS_NO_MEMORY;
             IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
@@ -374,8 +402,11 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     }
 
     if( !NT_SUCCESS(Status) ) {
-        if( FCB->TdiDeviceName.Buffer ) ExFreePool( FCB->TdiDeviceName.Buffer );
-        ExFreePool( FCB );
+        if (FCB->TdiDeviceName.Buffer)
+        {
+            ExFreePoolWithTag(FCB->TdiDeviceName.Buffer, TAG_AFD_TRANSPORT_ADDRESS);
+        }
+        ExFreePoolWithTag(FCB, TAG_AFD_FCB);
         FileObject->FsContext = NULL;
     }
 
@@ -395,6 +426,8 @@ AfdCleanupSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     UINT Function;
     PIRP CurrentIrp;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if( !SocketAcquireStateLock( FCB ) ) return LostSocket(Irp);
 
     for (Function = 0; Function < MAX_FUNCTIONS; Function++)
@@ -445,7 +478,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     /* Cancel our pending requests */
     for( i = 0; i < IN_FLIGHT_REQUESTS; i++ ) {
         if( InFlightRequest[i]->InFlightRequest ) {
-            AFD_DbgPrint(MID_TRACE,("Cancelling in flight irp %d (%x)\n",
+            AFD_DbgPrint(MID_TRACE,("Cancelling in flight irp %u (%p)\n",
                                     i, InFlightRequest[i]->InFlightRequest));
             IoCancelIrp(InFlightRequest[i]->InFlightRequest);
         }
@@ -469,7 +502,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
         ObDereferenceObject(Qelt->Object.Object);
         ZwClose(Qelt->Object.Handle);
 
-        ExFreePool(Qelt);
+        ExFreePoolWithTag(Qelt, TAG_AFD_ACCEPT_QUEUE);
     }
 
     SocketStateUnlock( FCB );
@@ -477,41 +510,41 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     if( FCB->EventSelect )
         ObDereferenceObject( FCB->EventSelect );
 
-    if( FCB->Context )
-        ExFreePool( FCB->Context );
+    if (FCB->Context)
+        ExFreePoolWithTag(FCB->Context, TAG_AFD_SOCKET_CONTEXT);
 
-    if( FCB->Recv.Window )
-        ExFreePool( FCB->Recv.Window );
+    if (FCB->Recv.Window)
+        ExFreePoolWithTag(FCB->Recv.Window, TAG_AFD_DATA_BUFFER);
 
-    if( FCB->Send.Window )
-        ExFreePool( FCB->Send.Window );
+    if (FCB->Send.Window)
+        ExFreePoolWithTag(FCB->Send.Window, TAG_AFD_DATA_BUFFER);
 
-    if( FCB->AddressFrom )
-        ExFreePool( FCB->AddressFrom );
+    if (FCB->AddressFrom)
+        ExFreePoolWithTag(FCB->AddressFrom, TAG_AFD_TDI_CONNECTION_INFORMATION);
 
-    if( FCB->ConnectCallInfo )
-        ExFreePool( FCB->ConnectCallInfo );
+    if (FCB->ConnectCallInfo)
+        ExFreePoolWithTag(FCB->ConnectCallInfo, TAG_AFD_TDI_CONNECTION_INFORMATION);
 
-    if( FCB->ConnectReturnInfo )
-        ExFreePool( FCB->ConnectReturnInfo );
+    if (FCB->ConnectReturnInfo)
+        ExFreePoolWithTag(FCB->ConnectReturnInfo, TAG_AFD_TDI_CONNECTION_INFORMATION);
 
-    if( FCB->ConnectData )
-        ExFreePool( FCB->ConnectData );
+    if (FCB->ConnectData)
+        ExFreePoolWithTag(FCB->ConnectData, TAG_AFD_CONNECT_DATA);
 
-    if( FCB->DisconnectData )
-        ExFreePool( FCB->DisconnectData );
+    if (FCB->DisconnectData)
+        ExFreePoolWithTag(FCB->DisconnectData, TAG_AFD_DISCONNECT_DATA);
 
-    if( FCB->ConnectOptions )
-        ExFreePool( FCB->ConnectOptions );
+    if (FCB->ConnectOptions)
+        ExFreePoolWithTag(FCB->ConnectOptions, TAG_AFD_CONNECT_OPTIONS);
 
-    if( FCB->DisconnectOptions )
-        ExFreePool( FCB->DisconnectOptions );
+    if (FCB->DisconnectOptions)
+        ExFreePoolWithTag(FCB->DisconnectOptions, TAG_AFD_DISCONNECT_OPTIONS);
 
-    if( FCB->LocalAddress )
-        ExFreePool( FCB->LocalAddress );
+    if (FCB->LocalAddress)
+        ExFreePoolWithTag(FCB->LocalAddress, TAG_AFD_TRANSPORT_ADDRESS);
 
-    if( FCB->RemoteAddress )
-        ExFreePool( FCB->RemoteAddress );
+    if (FCB->RemoteAddress)
+        ExFreePoolWithTag(FCB->RemoteAddress, TAG_AFD_TRANSPORT_ADDRESS);
 
     if( FCB->Connection.Object )
     {
@@ -526,7 +559,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     {
         if (ZwClose(FCB->AddressFile.Handle) == STATUS_INVALID_HANDLE)
         {
-            DbgPrint("INVALID ADDRESS FILE HANDLE VALUE: %x %x\n", FCB->AddressFile.Handle, FCB->AddressFile.Object);
+            DbgPrint("INVALID ADDRESS FILE HANDLE VALUE: %p %p\n", FCB->AddressFile.Handle, FCB->AddressFile.Object);
         }
     }
 
@@ -534,14 +567,16 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     {
         if (ZwClose(FCB->Connection.Handle) == STATUS_INVALID_HANDLE)
         {
-            DbgPrint("INVALID CONNECTION HANDLE VALUE: %x %x\n", FCB->Connection.Handle, FCB->Connection.Object);
+            DbgPrint("INVALID CONNECTION HANDLE VALUE: %p %p\n", FCB->Connection.Handle, FCB->Connection.Object);
         }
     }
 
-    if( FCB->TdiDeviceName.Buffer )
-        ExFreePool(FCB->TdiDeviceName.Buffer);
+    if (FCB->TdiDeviceName.Buffer)
+    {
+        ExFreePoolWithTag(FCB->TdiDeviceName.Buffer, TAG_AFD_TRANSPORT_ADDRESS);
+    }
 
-    ExFreePool(FCB);
+    ExFreePoolWithTag(FCB, TAG_AFD_FCB);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
@@ -552,6 +587,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     return STATUS_SUCCESS;
 }
 
+static IO_COMPLETION_ROUTINE DisconnectComplete;
 static
 NTSTATUS
 NTAPI
@@ -563,6 +599,8 @@ DisconnectComplete(PDEVICE_OBJECT DeviceObject,
     PIRP CurrentIrp;
     PLIST_ENTRY CurrentEntry;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB))
         return STATUS_FILE_CLOSED;
 
@@ -643,7 +681,6 @@ DoDisconnect(PAFD_FCB FCB)
                            FCB->Connection.Object,
                            &FCB->DisconnectTimeout,
                            FCB->DisconnectFlags,
-                           &FCB->DisconnectIrp.Iosb,
                            DisconnectComplete,
                            FCB,
                            FCB->ConnectCallInfo,
@@ -679,6 +716,8 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     PLIST_ENTRY CurrentEntry;
     PIRP CurrentIrp;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!(DisReq = LockRequest(Irp, IrpSp, FALSE, NULL)))
@@ -797,7 +836,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
                 return UnlockAndMaybeComplete(FCB, STATUS_INVALID_PARAMETER, Irp, 0);
             }
 
-            ExFreePool(FCB->RemoteAddress);
+            ExFreePoolWithTag(FCB->RemoteAddress, TAG_AFD_TRANSPORT_ADDRESS);
 
             FCB->RemoteAddress = NULL;
         }
@@ -809,6 +848,54 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
 }
 
+NTSTATUS
+AfdQueryFsDeviceInfo(PDEVICE_OBJECT DeviceObject, PFILE_FS_DEVICE_INFORMATION Buffer, PULONG Length)
+{
+    if (*Length >= sizeof(FILE_FS_DEVICE_INFORMATION))
+    {
+        Buffer->Characteristics = 0;
+        Buffer->DeviceType = FILE_DEVICE_NAMED_PIPE;
+
+        *Length -= sizeof(FILE_FS_DEVICE_INFORMATION);
+
+        return STATUS_SUCCESS;
+    }
+    else
+    {
+        ASSERT(*Length >= sizeof(FILE_FS_DEVICE_INFORMATION));
+        return STATUS_INFO_LENGTH_MISMATCH;
+    }
+}
+
+static NTSTATUS NTAPI
+AfdQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
+{
+    FS_INFORMATION_CLASS InfoClass;
+    PVOID Buffer;
+    ULONG Length;
+    NTSTATUS Status = STATUS_INVALID_INFO_CLASS;
+
+    Buffer = Irp->AssociatedIrp.SystemBuffer;
+    Length = IrpSp->Parameters.QueryVolume.Length;
+    InfoClass = IrpSp->Parameters.QueryVolume.FsInformationClass;
+
+    switch (InfoClass)
+    {
+    case FileFsDeviceInformation:
+        Status = AfdQueryFsDeviceInfo(DeviceObject, Buffer, &Length);
+        break;
+    default:
+        break;
+    }
+
+    Irp->IoStatus.Status = Status;
+    Irp->IoStatus.Information = IrpSp->Parameters.QueryVolume.Length - Length;
+    IoCompleteRequest(Irp, IO_NETWORK_INCREMENT);
+
+    return Status;
+}
+
+static DRIVER_DISPATCH AfdDispatch;
 static NTSTATUS NTAPI
 AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
@@ -818,9 +905,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
     PFILE_OBJECT FileObject = IrpSp->FileObject;
 #endif
 
-    AFD_DbgPrint(MID_TRACE,("AfdDispatch: %d\n", IrpSp->MajorFunction));
+    AFD_DbgPrint(MID_TRACE,("AfdDispatch: %u\n", IrpSp->MajorFunction));
     if( IrpSp->MajorFunction != IRP_MJ_CREATE) {
-        AFD_DbgPrint(MID_TRACE,("FO %x, IrpSp->FO %x\n",
+        AFD_DbgPrint(MID_TRACE,("FO %p, IrpSp->FO %p\n",
                                 FileObject, IrpSp->FileObject));
         ASSERT(FileObject == IrpSp->FileObject);
     }
@@ -849,6 +936,10 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
     case IRP_MJ_READ:
         return AfdConnectedSocketReadData( DeviceObject, Irp, IrpSp, TRUE );
 
+    /* query volume info */
+    case IRP_MJ_QUERY_VOLUME_INFORMATION:
+        return AfdQueryVolumeInformation(DeviceObject, Irp, IrpSp);
+
     case IRP_MJ_DEVICE_CONTROL:
     {
         switch( IrpSp->Parameters.DeviceIoControl.IoControlCode ) {
@@ -1082,7 +1173,8 @@ CleanupPendingIrp(PAFD_FCB FCB, PIRP Irp, PIO_STACK_LOCATION IrpSp, PAFD_ACTIVE_
     }
 }
 
-VOID NTAPI
+VOID
+NTAPI
 AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
                  PIRP Irp)
 {
@@ -1199,12 +1291,14 @@ AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
 
     SocketStateUnlock(FCB);
 
-    DbgPrint("WARNING!!! IRP cancellation race could lead to a process hang! (Function: %d)\n", Function);
+    DbgPrint("WARNING!!! IRP cancellation race could lead to a process hang! (Function: %u)\n", Function);
 }
 
+static DRIVER_UNLOAD AfdUnload;
 static VOID NTAPI
 AfdUnload(PDRIVER_OBJECT DriverObject)
 {
+    UNREFERENCED_PARAMETER(DriverObject);
 }
 
 NTSTATUS NTAPI
@@ -1215,6 +1309,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
     PAFD_DEVICE_EXTENSION DeviceExt;
     NTSTATUS Status;
 
+    UNREFERENCED_PARAMETER(RegistryPath);
     /* register driver routines */
     DriverObject->MajorFunction[IRP_MJ_CLOSE] = AfdDispatch;
     DriverObject->MajorFunction[IRP_MJ_CREATE] = AfdDispatch;
@@ -1222,6 +1317,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
     DriverObject->MajorFunction[IRP_MJ_WRITE] = AfdDispatch;
     DriverObject->MajorFunction[IRP_MJ_READ] = AfdDispatch;
     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AfdDispatch;
+    DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = AfdDispatch;
     DriverObject->DriverUnload = AfdUnload;
 
     Status = IoCreateDevice(DriverObject,
@@ -1242,7 +1338,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
     KeInitializeSpinLock( &DeviceExt->Lock );
     InitializeListHead( &DeviceExt->Polls );
 
-    AFD_DbgPrint(MID_TRACE,("Device created: object %x ext %x\n",
+    AFD_DbgPrint(MID_TRACE,("Device created: object %p ext %p\n",
                             DeviceObject, DeviceExt));
 
     return Status;