Alexandre Julliard : mountmgr.sys: Create a hard disk device for PhysicalDrive0.

Alexandre Julliard julliard at winehq.org
Mon Jan 7 08:38:56 CST 2008


Module: wine
Branch: master
Commit: 07e92a7dad0c881efda10b5f3c914c178b0bbcf9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=07e92a7dad0c881efda10b5f3c914c178b0bbcf9

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jan  4 14:21:27 2008 +0100

mountmgr.sys: Create a hard disk device for PhysicalDrive0.

---

 dlls/mountmgr.sys/mountmgr.c |   50 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 3bc9534..f6c0f20 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -58,11 +58,58 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
     return irp->IoStatus.u.Status;
 }
 
+/* handler for ioctls on the harddisk device */
+static NTSTATUS WINAPI harddisk_ioctl( DEVICE_OBJECT *device, IRP *irp )
+{
+    IO_STACK_LOCATION *irpsp = irp->Tail.Overlay.s.u.CurrentStackLocation;
+
+    TRACE( "ioctl %x insize %u outsize %u\n",
+           irpsp->Parameters.DeviceIoControl.IoControlCode,
+           irpsp->Parameters.DeviceIoControl.InputBufferLength,
+           irpsp->Parameters.DeviceIoControl.OutputBufferLength );
+
+    switch(irpsp->Parameters.DeviceIoControl.IoControlCode)
+    {
+    default:
+        FIXME( "unsupported ioctl %x\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
+        irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+    return irp->IoStatus.u.Status;
+}
+
+/* driver entry point for the harddisk driver */
+static NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
+{
+    static const WCHAR harddisk0W[] = {'\\','D','e','v','i','c','e',
+                                       '\\','H','a','r','d','d','i','s','k','0',0};
+    static const WCHAR physdrive0W[] = {'\\','?','?','\\','P','h','y','s','i','c','a','l','D','r','i','v','e','0',0};
+
+    UNICODE_STRING nameW, linkW;
+    DEVICE_OBJECT *device;
+    NTSTATUS status;
+
+    driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = harddisk_ioctl;
+
+    RtlInitUnicodeString( &nameW, harddisk0W );
+    RtlInitUnicodeString( &linkW, physdrive0W );
+    if (!(status = IoCreateDevice( driver, 0, &nameW, 0, 0, FALSE, &device )))
+        status = IoCreateSymbolicLink( &linkW, &nameW );
+    if (status)
+    {
+        FIXME( "failed to create device error %x\n", status );
+        return status;
+    }
+
+    return status;
+}
+
 /* main entry point for the mount point manager driver */
 NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
 {
     static const WCHAR device_mountmgrW[] = {'\\','D','e','v','i','c','e','\\','M','o','u','n','t','P','o','i','n','t','M','a','n','a','g','e','r',0};
     static const WCHAR link_mountmgrW[] = {'\\','?','?','\\','M','o','u','n','t','P','o','i','n','t','M','a','n','a','g','e','r',0};
+    static const WCHAR harddiskW[] = {'\\','D','r','i','v','e','r','\\','H','a','r','d','d','i','s','k',0};
 
     UNICODE_STRING nameW, linkW;
     DEVICE_OBJECT *device;
@@ -82,5 +129,8 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
         return status;
     }
 
+    RtlInitUnicodeString( &nameW, harddiskW );
+    status = IoCreateDriver( &nameW, harddisk_driver_entry );
+
     return status;
 }




More information about the wine-cvs mailing list