|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
main.c
Abstract:
This module contains the startup and termination code for the User-mode Plug-and-Play service.
Author:
Paula Tomlinson (paulat) 6-20-1995
Environment:
User mode only.
Revision History:
3-Mar-1995 paulat
Creation and initial implementation.
--*/
//
// includes
//
#include "precomp.h"
#include "umpnpdat.h"
//
// global data
//
HANDLE hInst; // Module handle
HKEY ghEnumKey = NULL; // Key to HKLM\CCC\System\Enum
HKEY ghServicesKey = NULL; // Key to HKLM\CCC\System\Services
HKEY ghClassKey = NULL; // key to HKLM\CCC\System\Class
BOOL DllMainCRTStartup( PVOID hModule, ULONG Reason, PCONTEXT pContext )
/*++
Routine Description:
This is the standard DLL entrypoint routine, called whenever a process or thread attaches or detaches. Arguments:
hModule - PVOID parameter that specifies the handle of the DLL
Reason - ULONG parameter that specifies the reason this entrypoint was called (either PROCESS_ATTACH, PROCESS_DETACH, THREAD_ATTACH, or THREAD_DETACH).
pContext - ???
Return value:
Returns true if initialization compeleted successfully, false is not.
--*/
{ hInst = (HANDLE)hModule;
DBG_UNREFERENCED_PARAMETER(pContext);
switch(Reason) {
case DLL_PROCESS_ATTACH:
if (ghEnumKey == NULL) {
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszRegPathEnum, 0, KEY_ALL_ACCESS, &ghEnumKey) != ERROR_SUCCESS) {
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, pszRegPathEnum, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &ghEnumKey, NULL) != ERROR_SUCCESS) { ghEnumKey = NULL; } } }
if (ghServicesKey == NULL) {
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszRegPathServices, 0, KEY_ALL_ACCESS, &ghServicesKey) != ERROR_SUCCESS) { ghServicesKey = NULL; } }
if (ghClassKey == NULL) {
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszRegPathClass, 0, KEY_ALL_ACCESS, &ghClassKey) != ERROR_SUCCESS) { ghClassKey = NULL; } }
break;
case DLL_PROCESS_DETACH:
if (ghEnumKey != NULL) { RegCloseKey(ghEnumKey); ghEnumKey = NULL; }
if (ghServicesKey != NULL) { RegCloseKey(ghServicesKey); ghServicesKey = NULL; }
if (ghClassKey != NULL) { RegCloseKey(ghClassKey); ghClassKey == NULL; } break;
case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; }
return TRUE;
} // DllMainCRTStartup
|