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

BOOL PrepareService ( LPCTSTR  ServiceName)

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;
}

Generated on Sat May 26 2012 04:43:23 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.