From: Aric Stewart Subject: [PATCH 01/03] ntoskrnl: Build a more intelligent and correct RegistryPath if possible Message-Id: Date: Fri, 22 Jul 2016 13:45:21 -0500 Signed-off-by: Aric Stewart --- dlls/ntoskrnl.exe/ntoskrnl.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 8003ba1..4ed06b8 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -817,6 +817,38 @@ PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG majorfunc, PDEVICE_OBJECT device, return irp; } +static void build_driver_keypath(UNICODE_STRING *name, UNICODE_STRING *keypath) +{ + static const WCHAR driverW[] = {'\\','D','r','i','v','e','r','\\',0}; + static const WCHAR servicesW[] = {'\\','R','e','g','i','s','t','r','y', + '\\','M','a','c','h','i','n','e', + '\\','S','y','s','t','e','m', + '\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t', + '\\','S','e','r','v','i','c','e','s', + '\\',0}; + WCHAR *name_ptr; + WCHAR *str; + + /* Check what prefix is present */ + if ( strncmpW( name->Buffer, servicesW, strlenW(servicesW) ) == 0) + { + FIXME( "Driver name is malformed as the keypath\n" ); + RtlDuplicateUnicodeString( 1, name, keypath ); + return; + } + if ( strncmpW( name->Buffer, driverW, strlenW(driverW) ) == 0 ) + name_ptr = &name->Buffer[7]; + else + { + FIXME( "Driver name does not properly begin with \\Driver\\" ); + name_ptr = name->Buffer; + } + + str = HeapAlloc( GetProcessHeap(), 0, sizeof(servicesW) + strlenW(name_ptr)*sizeof(WCHAR)); + lstrcpyW( str, servicesW ); + lstrcatW( str, name_ptr ); + RtlInitUnicodeString( keypath, str ); +} /*********************************************************************** * IoCreateDriver (NTOSKRNL.EXE.@) @@ -844,9 +876,9 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init ) driver->DriverInit = init; driver->DriverExtension = extension; extension->DriverObject = driver; - extension->ServiceKeyName = driver->DriverName; + build_driver_keypath( &driver->DriverName, &extension->ServiceKeyName ); - status = driver->DriverInit( driver, name ); + status = driver->DriverInit( driver, &extension->ServiceKeyName ); if (status) { @@ -865,6 +897,7 @@ void WINAPI IoDeleteDriver( DRIVER_OBJECT *driver ) TRACE("(%p)\n", driver); RtlFreeUnicodeString( &driver->DriverName ); + RtlFreeUnicodeString( &driver->DriverExtension->ServiceKeyName ); RtlFreeHeap( GetProcessHeap(), 0, driver ); }