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/Appli…
==============================================================================
--- 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/Appli…
==============================================================================
--- 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/Appli…
==============================================================================
--- 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/Appli…
==============================================================================
--- 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/Appli…
==============================================================================
--- 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/Drive…
==============================================================================
--- 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/Drive…
==============================================================================
--- 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/Drive…
==============================================================================
--- 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