ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

driver.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:     ReactOS Service Control Manager
00003  * LICENSE:     GPL - See COPYING in the top level directory
00004  * FILE:        base/system/services/driver.c
00005  * PURPOSE:     Driver control interface
00006  * COPYRIGHT:   Copyright 2005-2006 Eric Kohl
00007  *
00008  */
00009 
00010 /* INCLUDES *****************************************************************/
00011 
00012 #include "services.h"
00013 
00014 #define NDEBUG
00015 #include <debug.h>
00016 
00017 /* FUNCTIONS ****************************************************************/
00018 
00019 DWORD
00020 ScmLoadDriver(PSERVICE lpService)
00021 {
00022     WCHAR szDriverPath[MAX_PATH];
00023     UNICODE_STRING DriverPath;
00024     NTSTATUS Status;
00025     DWORD dwError = ERROR_SUCCESS;
00026 
00027     /* Build the driver path */
00028     wcscpy(szDriverPath,
00029            L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
00030     wcscat(szDriverPath,
00031            lpService->lpServiceName);
00032 
00033     RtlInitUnicodeString(&DriverPath,
00034                          szDriverPath);
00035 
00036     /* FIXME: Acquire privilege */
00037 
00038     DPRINT("  Path: %wZ\n", &DriverPath);
00039     Status = NtLoadDriver(&DriverPath);
00040 
00041     /* FIXME: Release privilege */
00042 
00043     if (!NT_SUCCESS(Status))
00044     {
00045         dwError = RtlNtStatusToDosError(Status);
00046     }
00047 
00048     return dwError;
00049 }
00050 
00051 
00052 DWORD
00053 ScmUnloadDriver(PSERVICE lpService)
00054 {
00055     WCHAR szDriverPath[MAX_PATH];
00056     UNICODE_STRING DriverPath;
00057     NTSTATUS Status;
00058     DWORD dwError = ERROR_SUCCESS;
00059 
00060     /* Build the driver path */
00061     wcscpy(szDriverPath,
00062            L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
00063     wcscat(szDriverPath,
00064            lpService->lpServiceName);
00065 
00066     RtlInitUnicodeString(&DriverPath,
00067                          szDriverPath);
00068 
00069     /* FIXME: Acquire privilege */
00070 
00071     Status = NtUnloadDriver(&DriverPath);
00072 
00073     /* FIXME: Release privilege */
00074 
00075     if (!NT_SUCCESS(Status))
00076     {
00077         dwError = RtlNtStatusToDosError(Status);
00078     }
00079 
00080     return dwError;
00081 }
00082 
00083 
00084 DWORD
00085 ScmGetDriverStatus(PSERVICE lpService,
00086                    LPSERVICE_STATUS lpServiceStatus)
00087 {
00088     OBJECT_ATTRIBUTES ObjectAttributes;
00089     UNICODE_STRING DirName;
00090     HANDLE DirHandle;
00091     NTSTATUS Status = STATUS_SUCCESS;
00092     POBJECT_DIRECTORY_INFORMATION DirInfo;
00093     ULONG BufferLength;
00094     ULONG DataLength;
00095     ULONG Index;
00096     DWORD dwError = ERROR_SUCCESS;
00097     BOOLEAN bFound = FALSE;
00098 
00099     DPRINT1("ScmGetDriverStatus() called\n");
00100 
00101     memset(lpServiceStatus, 0, sizeof(SERVICE_STATUS));
00102 
00103     if (lpService->Status.dwServiceType == SERVICE_KERNEL_DRIVER)
00104     {
00105         RtlInitUnicodeString(&DirName,
00106                              L"\\Driver");
00107     }
00108     else
00109     {
00110         RtlInitUnicodeString(&DirName,
00111                              L"\\FileSystem");
00112     }
00113 
00114     InitializeObjectAttributes(&ObjectAttributes,
00115                                &DirName,
00116                                0,
00117                                NULL,
00118                                NULL);
00119 
00120     Status = NtOpenDirectoryObject(&DirHandle,
00121                                    DIRECTORY_QUERY | DIRECTORY_TRAVERSE,
00122                                    &ObjectAttributes);
00123     if (!NT_SUCCESS(Status))
00124     {
00125         DPRINT1("NtOpenDirectoryObject() failed!\n");
00126         return RtlNtStatusToDosError(Status);
00127     }
00128 
00129     BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) +
00130                    2 * MAX_PATH * sizeof(WCHAR);
00131     DirInfo = (OBJECT_DIRECTORY_INFORMATION*) HeapAlloc(GetProcessHeap(),
00132                         HEAP_ZERO_MEMORY,
00133                         BufferLength);
00134 
00135     Index = 0;
00136     while (TRUE)
00137     {
00138         Status = NtQueryDirectoryObject(DirHandle,
00139                                         DirInfo,
00140                                         BufferLength,
00141                                         TRUE,
00142                                         FALSE,
00143                                         &Index,
00144                                         &DataLength);
00145         if (Status == STATUS_NO_MORE_ENTRIES)
00146         {
00147             DPRINT("No more services\n");
00148             break;
00149         }
00150 
00151         if (!NT_SUCCESS(Status))
00152             break;
00153 
00154         DPRINT("Comparing: '%S'  '%wZ'\n", lpService->lpServiceName, &DirInfo->Name);
00155 
00156         if (_wcsicmp(lpService->lpServiceName, DirInfo->Name.Buffer) == 0)
00157         {
00158             DPRINT1("Found: '%S'  '%wZ'\n",
00159                     lpService->lpServiceName, &DirInfo->Name);
00160             bFound = TRUE;
00161 
00162             break;
00163         }
00164     }
00165 
00166     HeapFree(GetProcessHeap(),
00167              0,
00168              DirInfo);
00169     NtClose(DirHandle);
00170 
00171     if (!NT_SUCCESS(Status))
00172     {
00173         DPRINT1("Status: %lx\n", Status);
00174         return RtlNtStatusToDosError(Status);
00175     }
00176 
00177     if ((bFound == TRUE) &&
00178         (lpService->Status.dwCurrentState != SERVICE_STOP_PENDING))
00179     {
00180         if (lpService->Status.dwCurrentState == SERVICE_STOPPED)
00181         {
00182             lpService->Status.dwWin32ExitCode = ERROR_SUCCESS;
00183             lpService->Status.dwServiceSpecificExitCode = ERROR_SUCCESS;
00184             lpService->Status.dwCheckPoint = 0;
00185             lpService->Status.dwWaitHint = 0;
00186             lpService->Status.dwControlsAccepted = 0;
00187         }
00188         else
00189         {
00190             lpService->Status.dwCurrentState = SERVICE_RUNNING;
00191             lpService->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
00192 
00193             if (lpService->Status.dwWin32ExitCode == ERROR_SERVICE_NEVER_STARTED)
00194                 lpService->Status.dwWin32ExitCode = ERROR_SUCCESS;
00195         }
00196     }
00197     else
00198     {
00199         lpService->Status.dwCurrentState = SERVICE_STOPPED;
00200         lpService->Status.dwControlsAccepted = 0;
00201         lpService->Status.dwCheckPoint = 0;
00202         lpService->Status.dwWaitHint = 0;
00203 
00204         if (lpService->Status.dwCurrentState == SERVICE_STOP_PENDING)
00205             lpService->Status.dwWin32ExitCode = ERROR_SUCCESS;
00206         else
00207             lpService->Status.dwWin32ExitCode = ERROR_GEN_FAILURE;
00208     }
00209 
00210     if (lpServiceStatus != NULL)
00211     {
00212         memcpy(lpServiceStatus,
00213                &lpService->Status,
00214                sizeof(SERVICE_STATUS));
00215     }
00216 
00217     DPRINT1("ScmGetDriverStatus() done (Error: %lu)\n", dwError);
00218 
00219     return ERROR_SUCCESS;
00220 }
00221 
00222 
00223 DWORD
00224 ScmControlDriver(PSERVICE lpService,
00225                  DWORD dwControl,
00226                  LPSERVICE_STATUS lpServiceStatus)
00227 {
00228     DWORD dwError;
00229 
00230     DPRINT("ScmControlDriver() called\n");
00231 
00232     switch (dwControl)
00233     {
00234         case SERVICE_CONTROL_STOP:
00235             if (lpService->Status.dwCurrentState != SERVICE_RUNNING)
00236             {
00237                 dwError = ERROR_INVALID_SERVICE_CONTROL;
00238                 goto done;
00239             }
00240 
00241             dwError = ScmUnloadDriver(lpService);
00242             if (dwError == ERROR_SUCCESS)
00243             {
00244                 lpService->Status.dwControlsAccepted = 0;
00245                 lpService->Status.dwCurrentState = SERVICE_STOPPED;
00246             }
00247             break;
00248 
00249         case SERVICE_CONTROL_INTERROGATE:
00250             dwError = ScmGetDriverStatus(lpService,
00251                                          lpServiceStatus);
00252             break;
00253 
00254         default:
00255             dwError = ERROR_INVALID_SERVICE_CONTROL;
00256     }
00257 
00258 done:;
00259     DPRINT("ScmControlDriver() done (Erorr: %lu)\n", dwError);
00260 
00261     return dwError;
00262 }
00263 
00264 /* EOF */

Generated on Sat May 26 2012 04:17:43 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.