Module: wine Branch: master Commit: 7ac931acf29dbf80ffbb27fed51c46bbd4bf3504 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7ac931acf29dbf80ffbb27fed5...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Dec 18 19:46:06 2007 +0100
ntoskrnl.exe: Added implementation for IoCreateDriver and IoDeleteDriver.
---
dlls/ntoskrnl.exe/ntoskrnl.c | 47 +++++++++++++++++++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 4 +- include/ddk/wdm.h | 2 + 3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 10ac0a1..0399fb4 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -268,6 +268,53 @@ PIO_WORKITEM WINAPI IoAllocateWorkItem( PDEVICE_OBJECT DeviceObject )
/*********************************************************************** + * IoCreateDriver (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init ) +{ + DRIVER_OBJECT *driver; + DRIVER_EXTENSION *extension; + NTSTATUS status; + + if (!(driver = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(*driver) + sizeof(*extension) ))) + return STATUS_NO_MEMORY; + + if ((status = RtlDuplicateUnicodeString( 1, name, &driver->DriverName ))) + { + RtlFreeHeap( GetProcessHeap(), 0, driver ); + return status; + } + + extension = (DRIVER_EXTENSION *)(driver + 1); + driver->Size = sizeof(*driver); + driver->DriverInit = init; + driver->DriverExtension = extension; + extension->DriverObject = driver; + extension->ServiceKeyName = driver->DriverName; + + status = driver->DriverInit( driver, name ); + + if (status) + { + RtlFreeUnicodeString( &driver->DriverName ); + RtlFreeHeap( GetProcessHeap(), 0, driver ); + } + return status; +} + + +/*********************************************************************** + * IoDeleteDriver (NTOSKRNL.EXE.@) + */ +void WINAPI IoDeleteDriver( DRIVER_OBJECT *driver ) +{ + RtlFreeUnicodeString( &driver->DriverName ); + RtlFreeHeap( GetProcessHeap(), 0, driver ); +} + + +/*********************************************************************** * IoCreateDevice (NTOSKRNL.EXE.@) */ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size, diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 3117509..8749d37 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -338,7 +338,7 @@ @ stub IoCreateController @ stdcall IoCreateDevice(ptr long ptr long long long ptr) @ stub IoCreateDisk -@ stub IoCreateDriver +@ stdcall IoCreateDriver(ptr ptr) @ stub IoCreateFile @ stub IoCreateFileSpecifyDeviceObjectHint @ stub IoCreateNotificationEvent @@ -354,7 +354,7 @@ @ stub IoCsqRemoveNextIrp @ stub IoDeleteController @ stdcall IoDeleteDevice(ptr) -@ stub IoDeleteDriver +@ stdcall IoDeleteDriver(ptr) @ stub IoDeleteSymbolicLink @ stub IoDetachDevice @ stub IoDeviceHandlerObjectSize diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 0e26ac2..931a130 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -878,8 +878,10 @@ void WINAPI ExFreePool(PVOID); void WINAPI ExFreePoolWithTag(PVOID,ULONG);
NTSTATUS WINAPI IoCreateDevice(DRIVER_OBJECT*,ULONG,UNICODE_STRING*,DEVICE_TYPE,ULONG,BOOLEAN,DEVICE_OBJECT**); +NTSTATUS WINAPI IoCreateDriver(UNICODE_STRING*,PDRIVER_INITIALIZE); NTSTATUS WINAPI IoCreateSymbolicLink(UNICODE_STRING*,UNICODE_STRING*); void WINAPI IoDeleteDevice(DEVICE_OBJECT*); +void WINAPI IoDeleteDriver(DRIVER_OBJECT*); NTSTATUS WINAPI IoDeleteSymbolicLink(UNICODE_STRING*); PEPROCESS WINAPI IoGetCurrentProcess(void);