Author: gedmurphy Date: Wed Apr 9 08:43:34 2008 New Revision: 32897
URL: http://svn.reactos.org/svn/reactos?rev=32897&view=rev Log: Test code for loading and unloading a driver via 3 different methods. SCM, native methods and via the relatively unknown NtSetSystemInformation methods. Needs rbuild files to test in ros.
Added: trunk/rostests/win32/DriverLoading/ trunk/rostests/win32/DriverLoading/Application/ trunk/rostests/win32/DriverLoading/Application/Application.vcproj (with props) trunk/rostests/win32/DriverLoading/Application/DriverTester.h (with props) trunk/rostests/win32/DriverLoading/Application/main.c (with props) trunk/rostests/win32/DriverLoading/Application/umode.c (with props) trunk/rostests/win32/DriverLoading/Application/undoc.c (with props) trunk/rostests/win32/DriverLoading/Driver/ trunk/rostests/win32/DriverLoading/Driver/Driver.vcproj (with props) trunk/rostests/win32/DriverLoading/Driver/driver.c (with props) trunk/rostests/win32/DriverLoading/DriverTester.sln (with props)
Added: trunk/rostests/win32/DriverLoading/Application/Application.vcproj URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Applic... ============================================================================== --- trunk/rostests/win32/DriverLoading/Application/Application.vcproj (added) +++ trunk/rostests/win32/DriverLoading/Application/Application.vcproj [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,214 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="Application" + ProjectGUID="{EABF0755-CD33-43CC-9062-DD5C5E0AC229}" + RootNamespace="app" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="false" + DebugInformationFormat="4" + CallingConvention="2" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="ntdll.lib" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="1" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CallingConvention="2" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="ntdll.lib" + LinkIncremental="2" + GenerateDebugInformation="false" + SubSystem="1" + OptimizeReferences="0" + EnableCOMDATFolding="0" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\main.c" + > + </File> + <File + RelativePath=".\umode.c" + > + </File> + <File + RelativePath=".\undoc.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\DriverTester.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject>
Propchange: trunk/rostests/win32/DriverLoading/Application/Application.vcproj ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Application/DriverTester.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Applic... ============================================================================== --- trunk/rostests/win32/DriverLoading/Application/DriverTester.h (added) +++ trunk/rostests/win32/DriverLoading/Application/DriverTester.h [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,72 @@ +#define _WIN32_WINNT 0x0500 +#include <windows.h> +#include <stdio.h> +#include <winternl.h> + +#define DRIVER_NAME L"TestDriver" + +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS)0xC0000061L) + +typedef LONG NTSTATUS; + +// +// umode methods +// +BOOL RegisterDriver(LPCWSTR lpDriverName, LPCWSTR lpPathName); +BOOL StartDriver(LPCWSTR lpDriverName); +BOOL StopDriver(LPCWSTR lpDriverName); +BOOL UnregisterDriver(LPCWSTR lpDriverName); + +// +// undoc methods +// +BOOL ConvertPath(LPCWSTR lpPath, LPWSTR lpDevice); +BOOL LoadVia_SystemLoadGdiDriverInformation(LPWSTR lpDriverPath); +BOOL LoadVia_SystemExtendServiceTableInformation(LPWSTR lpDriverPath); +BOOL NtStartDriver(LPCWSTR lpService); +BOOL NtStopDriver(LPCWSTR lpService); + + +// +// undocumented stuff +// +#define SystemLoadGdiDriverInformation 26 +#define SystemExtendServiceTableInformation 38 +NTSYSAPI NTSTATUS NTAPI +NtSetSystemInformation(IN INT SystemInformationClass, + IN PVOID SystemInformation, + IN ULONG SystemInformationLength ); +NTSTATUS +NtUnloadDriver(IN PUNICODE_STRING DriverServiceName); + +typedef struct _SYSTEM_GDI_DRIVER_INFORMATION +{ + UNICODE_STRING DriverName; + PVOID ImageAddress; + PVOID SectionPointer; + PVOID EntryPoint; + PIMAGE_EXPORT_DIRECTORY ExportSectionPointer; + ULONG ImageLength; +} SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION; + +typedef enum _OBJECT_INFORMATION_CLASS { + ObjectBasicInformation, + ObjectNameInformation, + ObjectTypeInformation, + ObjectAllTypesInformation, + ObjectHandleInformation +} OBJECT_INFO_CLASS; + +NTSTATUS NtQueryObject(IN HANDLE Handle, + IN OBJECT_INFO_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength); + + +typedef struct _OBJECT_NAME_INFORMATION { + UNICODE_STRING Name; +} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; + +
Propchange: trunk/rostests/win32/DriverLoading/Application/DriverTester.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Application/main.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Applic... ============================================================================== --- trunk/rostests/win32/DriverLoading/Application/main.c (added) +++ trunk/rostests/win32/DriverLoading/Application/main.c [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,157 @@ +#include "DriverTester.h" + +static BOOL +Initialize(LPCWSTR lpDriverPath) +{ + if (!RegisterDriver(DRIVER_NAME, lpDriverPath)) + { + wprintf(L"[%lu] Failed to install %s\n", GetLastError(), DRIVER_NAME); + return FALSE; + } + + return TRUE; +} + +static BOOL +Uninitialize(LPCWSTR lpDriverPath) +{ + if (!UnregisterDriver(DRIVER_NAME)) + { + wprintf(L"[%lu] Failed to unregister %s\n", GetLastError(), DRIVER_NAME); + return FALSE; + } + + return TRUE; +} + +static BOOL +UsermodeMethod(LPCWSTR lpDriverPath) +{ + wprintf(L"\nStarting %s.sys via the SCM\n", DRIVER_NAME); + + if (!StartDriver(DRIVER_NAME)) + { + wprintf(L"[%lu] Failed to start %s\n", GetLastError(), DRIVER_NAME); + UnregisterDriver(DRIVER_NAME); + return FALSE; + } + + wprintf(L"\tStarted\n"); + + wprintf(L"Stopping %s.sys via the SCM\n", DRIVER_NAME); + + if (!StopDriver(DRIVER_NAME)) + { + wprintf(L"[%lu] Failed to stop %s\n", GetLastError(), DRIVER_NAME); + UnregisterDriver(DRIVER_NAME); + return FALSE; + } + + wprintf(L"\tStopped\n"); + + return TRUE; +} + +static BOOL +UndocumentedMethod(LPCWSTR lpDriverPath) +{ + wprintf(L"\nStarting %s.sys via native API\n", DRIVER_NAME); + + if (!NtStartDriver(DRIVER_NAME)) + { + wprintf(L"[%lu] Failed to start %s\n", GetLastError(), DRIVER_NAME); + UnregisterDriver(DRIVER_NAME); + return FALSE; + } + + wprintf(L"\tStarted\n"); + + wprintf(L"Stopping %s.sys via native API\n", DRIVER_NAME); + + if (!NtStopDriver(DRIVER_NAME)) + { + wprintf(L"[%lu] Failed to stop %s\n", GetLastError(), DRIVER_NAME); + UnregisterDriver(DRIVER_NAME); + return FALSE; + } + + wprintf(L"\tStopped\n"); + + return TRUE; +} + + +static BOOL +SneakyUndocumentedMethods(LPCWSTR lpDriverPath) +{ + WCHAR szDevice[MAX_PATH]; + + if (ConvertPath(lpDriverPath, szDevice)) + { + wprintf(L"\nStarting %s.sys via NtSetSystemInformation with SystemLoadGdiDriverInformation\n", DRIVER_NAME); + if (LoadVia_SystemLoadGdiDriverInformation(szDevice)) + { + wprintf(L"\tStarted\n"); + + NtStopDriver(DRIVER_NAME); + } + + wprintf(L"\nStarting %s.sys via NtSetSystemInformation with SystemExtendServiceTableInformation\n", DRIVER_NAME); + if (LoadVia_SystemExtendServiceTableInformation(szDevice)) + { + wprintf(L"\tStarted\n"); + + NtStopDriver(DRIVER_NAME); + } + + return TRUE; + } + + return FALSE; +} + + +int __cdecl wmain(int argc, wchar_t *argv[]) +{ + WCHAR buf[MAX_PATH]; + + if (argc != 2) + { + wprintf(L"Usage: DriverTester.exe <path>"); + return -1; + } + + if (!SearchPathW(NULL, + argv[1], + L".sys", + MAX_PATH, + buf, + NULL)) + { + wprintf(L"%s does not exist", argv[1]); + return -1; + } + + if (Initialize(argv[1])) + { + // + // Load using conventional SCM methods + // + UsermodeMethod(argv[1]); + + // + // Load using undocumented NtLoad/UnloadDriver + // + UndocumentedMethod(argv[1]); + + // + // Load using hidden unknown methods + // + SneakyUndocumentedMethods(argv[1]); + + Uninitialize(argv[1]); + } + + return 0; +} +
Propchange: trunk/rostests/win32/DriverLoading/Application/main.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Application/umode.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Applic... ============================================================================== --- trunk/rostests/win32/DriverLoading/Application/umode.c (added) +++ trunk/rostests/win32/DriverLoading/Application/umode.c [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,162 @@ +#include "DriverTester.h" + + +BOOL +RegisterDriver(LPCWSTR lpDriverName, + LPCWSTR lpPathName) +{ + SC_HANDLE hSCManager; + SC_HANDLE hService; + + hSCManager = OpenSCManagerW(NULL, + NULL, + SC_MANAGER_ALL_ACCESS); + if (!hSCManager) + return FALSE; + +retry: + hService = CreateServiceW(hSCManager, + lpDriverName, + lpDriverName, + SERVICE_ALL_ACCESS, + SERVICE_KERNEL_DRIVER, + SERVICE_DEMAND_START, + SERVICE_ERROR_NORMAL, + lpPathName, + NULL, + NULL, + NULL, + NULL, + NULL); + + if (hService) + { + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + return TRUE; + } + else + { + DWORD err = GetLastError(); + + if (err == ERROR_SERVICE_MARKED_FOR_DELETE) + { + StopDriver(DRIVER_NAME); + goto retry; + } + + CloseServiceHandle(hSCManager); + + // return TRUE if the driver is already registered + return (err == ERROR_SERVICE_EXISTS); + } +} + +BOOL +StartDriver(LPCWSTR lpDriverName) +{ + SC_HANDLE hSCManager; + SC_HANDLE hService; + BOOL bRet; + + hSCManager = OpenSCManagerW(NULL, + NULL, + SC_MANAGER_ALL_ACCESS); + if (!hSCManager) + return FALSE; + + hService = OpenServiceW(hSCManager, + lpDriverName, + SERVICE_ALL_ACCESS); + if (!hService) + { + CloseServiceHandle(hSCManager); + return FALSE; + } + + bRet = StartServiceW(hService, 0, NULL); + if (!bRet) + { + if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING) + { + wprintf(L"%s.sys already running\n", DRIVER_NAME); + bRet = TRUE; + } + } + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + + return bRet; +} + +BOOL +StopDriver(LPCWSTR lpDriverName) +{ + SC_HANDLE hSCManager; + SC_HANDLE hService; + SERVICE_STATUS serviceStatus; + BOOL bRet; + + hSCManager = OpenSCManagerW(NULL, + NULL, + SC_MANAGER_ALL_ACCESS); + if (!hSCManager) + return FALSE; + + hService = OpenServiceW(hSCManager, + lpDriverName, + SERVICE_ALL_ACCESS); + if (!hService) + { + CloseServiceHandle(hSCManager); + return FALSE; + } + + bRet = ControlService(hService, + SERVICE_CONTROL_STOP, + &serviceStatus); + if (!bRet) + { + if (GetLastError() == ERROR_SERVICE_NOT_ACTIVE) + { + wprintf(L"%s.sys wasn't running\n", DRIVER_NAME); + bRet = TRUE; + } + } + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + + return bRet; +} + +BOOL +UnregisterDriver(LPCWSTR lpDriverName) +{ + SC_HANDLE hService; + SC_HANDLE hSCManager; + BOOL bRet; + + hSCManager = OpenSCManagerW(NULL, + NULL, + SC_MANAGER_ALL_ACCESS); + if (!hSCManager) + return FALSE; + + hService = OpenServiceW(hSCManager, + lpDriverName, + SERVICE_ALL_ACCESS); + if (!hService) + { + CloseServiceHandle(hSCManager); + return FALSE; + } + + bRet = DeleteService(hService); + + CloseServiceHandle(hService); + CloseServiceHandle(hSCManager); + + return bRet; +}
Propchange: trunk/rostests/win32/DriverLoading/Application/umode.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Application/undoc.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Applic... ============================================================================== --- trunk/rostests/win32/DriverLoading/Application/undoc.c (added) +++ trunk/rostests/win32/DriverLoading/Application/undoc.c [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,276 @@ +#include "DriverTester.h" + +static BOOL +SetPrivilege(BOOL bSet) +{ + TOKEN_PRIVILEGES tp; + HANDLE hToken; + LUID luid; + + if (!OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES, + &hToken)) + { + return FALSE; + } + + if(!LookupPrivilegeValue(NULL, + SE_LOAD_DRIVER_NAME, + &luid)) + { + CloseHandle(hToken); + return FALSE; + } + + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + + if (bSet) + { + tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + } + else + { + tp.Privileges[0].Attributes = 0; + } + + AdjustTokenPrivileges(hToken, + FALSE, + &tp, + sizeof(TOKEN_PRIVILEGES), + NULL, + NULL); + if (GetLastError() != ERROR_SUCCESS) + { + CloseHandle(hToken); + return FALSE; + } + + CloseHandle(hToken); + + return TRUE; +} + + +BOOL +ConvertPath(LPCWSTR lpPath, + LPWSTR lpDevice) +{ + LPWSTR lpFullPath = NULL; + DWORD size; + + if (lpPath) + { + size = GetLongPathNameW(lpPath, + 0, + 0); + if (!size) + return FALSE; + + size = (size + 1) * sizeof(WCHAR); + + lpFullPath = HeapAlloc(GetProcessHeap(), + 0, + size); + if (!lpFullPath) + return FALSE; + + if (GetLongPathNameW(lpPath, + lpFullPath, + size)) + { + HANDLE hDevice; + POBJECT_NAME_INFORMATION pObjName; + NTSTATUS Status; + DWORD len; + + hDevice = CreateFileW(lpFullPath, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + HeapFree(GetProcessHeap(), 0, lpFullPath); + + if(hDevice == INVALID_HANDLE_VALUE) + { + wprintf(L"[%x] Failed to open %s\n", GetLastError(), DRIVER_NAME); + return FALSE; + } + + size = MAX_PATH * sizeof(WCHAR); + pObjName = HeapAlloc(GetProcessHeap(), 0, size); + if (!pObjName) + return FALSE; + + Status = NtQueryObject(hDevice, + ObjectNameInformation, + pObjName, + size, + &size); + if (Status == STATUS_SUCCESS) + { + len = pObjName->Name.Length / sizeof(WCHAR); + wcsncpy(lpDevice, pObjName->Name.Buffer, len); + lpDevice[len] = UNICODE_NULL; + + HeapFree(GetProcessHeap(), 0, pObjName); + + return TRUE; + } + + HeapFree(GetProcessHeap(), 0, pObjName); + } + } + + return FALSE; +} + + +BOOL +NtStartDriver(LPCWSTR lpService) +{ + WCHAR szDriverPath[MAX_PATH]; + UNICODE_STRING DriverPath; + NTSTATUS Status = -1; + + wcscpy(szDriverPath, + L"\Registry\Machine\System\CurrentControlSet\Services\"); + wcscat(szDriverPath, + lpService); + + RtlInitUnicodeString(&DriverPath, + szDriverPath); + + if (SetPrivilege(TRUE)) + { + Status = NtLoadDriver(&DriverPath); + if (Status != STATUS_SUCCESS) + { + DWORD err = RtlNtStatusToDosError(Status); + wprintf(L"NtUnloadDriver failed [%lu]\n", err); + } + + SetPrivilege(FALSE); + } + + return (Status == STATUS_SUCCESS); +} + + +BOOL +NtStopDriver(LPCWSTR lpService) +{ + WCHAR szDriverPath[MAX_PATH]; + UNICODE_STRING DriverPath; + NTSTATUS Status = -1; + + wcscpy(szDriverPath, + L"\Registry\Machine\System\CurrentControlSet\Services\"); + wcscat(szDriverPath, + lpService); + + RtlInitUnicodeString(&DriverPath, + szDriverPath); + + if (SetPrivilege(TRUE)) + { + Status = NtUnloadDriver(&DriverPath); + if (Status != STATUS_SUCCESS) + { + DWORD err = RtlNtStatusToDosError(Status); + wprintf(L"NtUnloadDriver failed [%lu]\n", err); + } + + SetPrivilege(FALSE); + } + + return (Status == STATUS_SUCCESS); +} + + +// +// We shouldn't be able to call this from umode. +// Returns true if +// +BOOL +LoadVia_SystemLoadGdiDriverInformation(LPWSTR lpDriverPath) +{ + NTSTATUS Status; + SYSTEM_GDI_DRIVER_INFORMATION Buffer; + DWORD bufSize; + + bufSize = sizeof(SYSTEM_GDI_DRIVER_INFORMATION); + + ZeroMemory(&Buffer, bufSize); + RtlInitUnicodeString(&Buffer.DriverName, lpDriverPath); + + if (SetPrivilege(TRUE)) + { + Status = NtSetSystemInformation(SystemLoadGdiDriverInformation, + &Buffer, + bufSize); + if (Status == STATUS_PRIVILEGE_NOT_HELD) + { + wprintf(L"SystemLoadGdiDriverInformation can only be used in kmode.\n"); + } + else if (Status == STATUS_SUCCESS) + { + wprintf(L"SystemLoadGdiDriverInformation incorrectly loaded the driver\n"); + NtUnloadDriver(&Buffer.DriverName); + + return TRUE; + } + else + { + DWORD err = RtlNtStatusToDosError(Status); + wprintf(L"LoadVia_SystemLoadGdiDriverInformation failed [%lu]\n", err); + } + + SetPrivilege(FALSE); + } + + return FALSE; +} + + +BOOL +LoadVia_SystemExtendServiceTableInformation(LPWSTR lpDriverPath) +{ + NTSTATUS Status; + UNICODE_STRING Buffer; + DWORD bufSize; + + RtlInitUnicodeString(&Buffer, lpDriverPath); + bufSize = sizeof(UNICODE_STRING); + + if (SetPrivilege(TRUE)) + { + Status = NtSetSystemInformation(SystemExtendServiceTableInformation, + &Buffer, + bufSize); + if (Status == STATUS_PRIVILEGE_NOT_HELD) + { + wprintf(L"SystemExtendServiceTableInformation can only be used in kmode.\n"); + } + else if (Status == STATUS_SUCCESS) + { + wprintf(L"SystemExtendServiceTableInformation incorrectly loaded the driver\n"); + NtUnloadDriver(&Buffer); + + return TRUE; + } + else + { + DWORD err = RtlNtStatusToDosError(Status); + wprintf(L"LoadVia_SystemExtendServiceTableInformation failed [%lu] - 0x%x\n", err, Status); + } + + SetPrivilege(FALSE); + } + + return FALSE; +} +
Propchange: trunk/rostests/win32/DriverLoading/Application/undoc.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Driver/Driver.vcproj URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Driver... ============================================================================== --- trunk/rostests/win32/DriverLoading/Driver/Driver.vcproj (added) +++ trunk/rostests/win32/DriverLoading/Driver/Driver.vcproj [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,213 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="Driver" + ProjectGUID="{983A51E3-3E69-4C26-B34B-7F17089CD4E3}" + RootNamespace="driver" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="_DEBUG;_CONSOLE;_X86_" + MinimalRebuild="true" + BasicRuntimeChecks="0" + RuntimeLibrary="3" + BufferSecurityCheck="false" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CallingConvention="2" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="ntoskrnl.lib hal.lib" + OutputFile="$(OutDir)$(ProjectName).sys" + LinkIncremental="2" + EnableUAC="false" + GenerateDebugInformation="true" + SubSystem="3" + Driver="1" + EntryPointSymbol="DriverEntry" + RandomizedBaseAddress="0" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + WholeProgramOptimization="false" + PreprocessorDefinitions="NDEBUG;_CONSOLE;_X86_" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + CallingConvention="2" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="ntoskrnl.lib hal.lib" + OutputFile="$(OutDir)$(ProjectName).sys" + LinkIncremental="1" + EnableUAC="false" + GenerateDebugInformation="true" + SubSystem="3" + Driver="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + EntryPointSymbol="DriverEntry" + RandomizedBaseAddress="0" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\driver.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject>
Propchange: trunk/rostests/win32/DriverLoading/Driver/Driver.vcproj ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/Driver/driver.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Driver... ============================================================================== --- trunk/rostests/win32/DriverLoading/Driver/driver.c (added) +++ trunk/rostests/win32/DriverLoading/Driver/driver.c [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,18 @@ +#include <ntddk.h> + +VOID +DriverUnload(PDRIVER_OBJECT pDriverObject) +{ + DbgPrint("Test driver unloaded sucessfully\n"); +} + +NTSTATUS +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +{ + DriverObject->DriverUnload = DriverUnload; + + DbgPrint("Test driver loaded sucessfully\n"); + + return STATUS_SUCCESS; +}
Propchange: trunk/rostests/win32/DriverLoading/Driver/driver.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/win32/DriverLoading/DriverTester.sln URL: http://svn.reactos.org/svn/reactos/trunk/rostests/win32/DriverLoading/Driver... ============================================================================== --- trunk/rostests/win32/DriverLoading/DriverTester.sln (added) +++ trunk/rostests/win32/DriverLoading/DriverTester.sln [iso-8859-1] Wed Apr 9 08:43:34 2008 @@ -1,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Application", "Application\Application.vcproj", "{EABF0755-CD33-43CC-9062-DD5C5E0AC229}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Driver", "Driver\Driver.vcproj", "{983A51E3-3E69-4C26-B34B-7F17089CD4E3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EABF0755-CD33-43CC-9062-DD5C5E0AC229}.Debug|Win32.ActiveCfg = Debug|Win32 + {EABF0755-CD33-43CC-9062-DD5C5E0AC229}.Debug|Win32.Build.0 = Debug|Win32 + {EABF0755-CD33-43CC-9062-DD5C5E0AC229}.Release|Win32.ActiveCfg = Release|Win32 + {EABF0755-CD33-43CC-9062-DD5C5E0AC229}.Release|Win32.Build.0 = Release|Win32 + {983A51E3-3E69-4C26-B34B-7F17089CD4E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {983A51E3-3E69-4C26-B34B-7F17089CD4E3}.Debug|Win32.Build.0 = Debug|Win32 + {983A51E3-3E69-4C26-B34B-7F17089CD4E3}.Release|Win32.ActiveCfg = Release|Win32 + {983A51E3-3E69-4C26-B34B-7F17089CD4E3}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal
Propchange: trunk/rostests/win32/DriverLoading/DriverTester.sln ------------------------------------------------------------------------------ svn:eol-style = native