From: Bernhard Übelacker bernhardu@mailbox.org
--- dlls/ntoskrnl.exe/ntoskrnl.c | 38 ++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 17 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index d2407d99448..fa048b2e3e9 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -3906,14 +3906,29 @@ static void WINAPI ldr_notify_callback(ULONG reason, LDR_DLL_NOTIFICATION_DATA * } }
+static WCHAR* get_absolute_imagepath( WCHAR *path, DWORD size, DWORD offset ) +{ + WCHAR buffer[MAX_PATH]; + LPWSTR str; + + GetWindowsDirectoryW(buffer, MAX_PATH); + + str = HeapAlloc(GetProcessHeap(), 0, + (size - offset + lstrlenW(buffer)) * sizeof(WCHAR)); + lstrcpyW(str, buffer); + lstrcatW(str, path + offset); + HeapFree( GetProcessHeap(), 0, path ); + return str; +} + /* load the .sys module for a device driver */ static HMODULE load_driver( const WCHAR *driver_name, const UNICODE_STRING *keyname ) { - static const WCHAR driversW[] = {'\','d','r','i','v','e','r','s','\',0}; - static const WCHAR systemrootW[] = {'\','S','y','s','t','e','m','R','o','o','t','\',0}; - static const WCHAR postfixW[] = {'.','s','y','s',0}; - static const WCHAR ntprefixW[] = {'\','?','?','\',0}; - static const WCHAR ImagePathW[] = {'I','m','a','g','e','P','a','t','h',0}; + static const WCHAR driversW[] = L"\drivers\"; + static const WCHAR systemrootW[] = L"\SystemRoot\"; + static const WCHAR postfixW[] = L".sys"; + static const WCHAR ntprefixW[] = L"\??\"; + static const WCHAR ImagePathW[] = L"ImagePath"; HKEY driver_hkey; HMODULE module; LPWSTR path = NULL, str; @@ -3944,18 +3959,7 @@ static HMODULE load_driver( const WCHAR *driver_name, const UNICODE_STRING *keyn }
if (!wcsnicmp( path, systemrootW, 12 )) - { - WCHAR buffer[MAX_PATH]; - - GetWindowsDirectoryW(buffer, MAX_PATH); - - str = HeapAlloc(GetProcessHeap(), 0, (size -11 + lstrlenW(buffer)) - * sizeof(WCHAR)); - lstrcpyW(str, buffer); - lstrcatW(str, path + 11); - HeapFree( GetProcessHeap(), 0, path ); - path = str; - } + str = path = get_absolute_imagepath( path, size, 11 ); else if (!wcsncmp( path, ntprefixW, 4 )) str = path + 4; else