Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 34 of file svchost.c.
Referenced by LoadServiceCategory().
{ HKEY hServiceKey; TCHAR ServiceKeyBuffer[MAX_PATH + 1]; DWORD LeftOfBuffer = sizeof(ServiceKeyBuffer) / sizeof(ServiceKeyBuffer[0]); DWORD KeyType; PTSTR Buffer = NULL; DWORD BufferSize = MAX_PATH + 1; LONG RetVal; HINSTANCE hServiceDll; TCHAR DllPath[MAX_PATH + 2]; /* See MSDN on ExpandEnvironmentStrings() for ANSI strings for more details on + 2 */ LPSERVICE_MAIN_FUNCTION ServiceMainFunc; PSERVICE Service; /* Compose the registry path to the service's "Parameter" key */ _tcsncpy(ServiceKeyBuffer, SERVICE_KEY, LeftOfBuffer); LeftOfBuffer -= _tcslen(SERVICE_KEY); _tcsncat(ServiceKeyBuffer, ServiceName, LeftOfBuffer); LeftOfBuffer -= _tcslen(ServiceName); _tcsncat(ServiceKeyBuffer, PARAMETERS_KEY, LeftOfBuffer); LeftOfBuffer -= _tcslen(PARAMETERS_KEY); if (LeftOfBuffer < 0) { DPRINT1("Buffer overflow for service name: '%s'\n", ServiceName); return FALSE; } /* Open the service registry key to find the dll name */ if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, ServiceKeyBuffer, 0, KEY_READ, &hServiceKey)) { DPRINT1("Could not open service key (%s)\n", ServiceKeyBuffer); return FALSE; } do { if (Buffer) HeapFree(GetProcessHeap(), 0, Buffer); Buffer = HeapAlloc(GetProcessHeap(), 0, BufferSize); if (NULL == Buffer) { DPRINT1("Not enough memory for service: %s\n", ServiceName); return FALSE; } RetVal = RegQueryValueEx(hServiceKey, _T("ServiceDll"), NULL, &KeyType, (LPBYTE)Buffer, &BufferSize); } while (ERROR_MORE_DATA == RetVal); RegCloseKey(hServiceKey); if (ERROR_SUCCESS != RetVal || 0 == BufferSize) { DPRINT1("Could not read 'ServiceDll' value from service: %s, ErrorCode: 0x%x\n", ServiceName, RetVal); HeapFree(GetProcessHeap(), 0, Buffer); return FALSE; } /* Convert possible %SystemRoot% to a real path */ BufferSize = ExpandEnvironmentStrings(Buffer, DllPath, _countof(DllPath)); if (0 == BufferSize) { DPRINT1("Invalid ServiceDll path: %s\n", Buffer); HeapFree(GetProcessHeap(), 0, Buffer); return FALSE; } HeapFree(GetProcessHeap(), 0, Buffer); /* Load the service dll */ DPRINT("Trying to load dll\n"); hServiceDll = LoadLibrary(DllPath); if (NULL == hServiceDll) { DPRINT1("Unable to load ServiceDll: %s, ErrorCode: %u\n", DllPath, GetLastError()); return FALSE; } ServiceMainFunc = (LPSERVICE_MAIN_FUNCTION)GetProcAddress(hServiceDll, "ServiceMain"); /* Allocate a service node in the linked list */ Service = HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE)); if (NULL == Service) { DPRINT1("Not enough memory for service: %s\n", ServiceName); return FALSE; } memset(Service, 0, sizeof(SERVICE)); Service->Name = HeapAlloc(GetProcessHeap(), 0, (_tcslen(ServiceName)+1) * sizeof(TCHAR)); if (NULL == Service->Name) { DPRINT1("Not enough memory for service: %s\n", ServiceName); HeapFree(GetProcessHeap(), 0, Service); return FALSE; } _tcscpy(Service->Name, ServiceName); Service->hServiceDll = hServiceDll; Service->ServiceMainFunc = ServiceMainFunc; Service->Next = FirstService; FirstService = Service; return TRUE; }