По загрузке- используй ф-ции для установки и запуска сервисов.
Вот пример
//Ф-ции для динамической загрузки и выгрузки драйверов в WinNT/2k/XP/2003
//(Почти полностью взяты у С. Шрайбера)
typedef SC_HANDLE *PSC_HANDLE;
typedef DWORDLONG QWORD, *PQWORD, **PPQWORD;
SC_HANDLE WINAPI w2kServiceConnect (void)
{
return OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
}
//----------------------------------------------------------
SC_HANDLE WINAPI w2kServiceDisconnect (SC_HANDLE hManager)
{
if (hManager != NULL) CloseServiceHandle (hManager);
return NULL;
}
//----------------------------------------------------------
SC_HANDLE WINAPI w2kServiceManager (SC_HANDLE hManager,
PSC_HANDLE phManager,
BOOL fOpen)
{
SC_HANDLE hManager1 = NULL;
if (phManager != NULL)
{
if (fOpen)
{
if (hManager == NULL)
{
*phManager = w2kServiceConnect ();
}
else
{
*phManager = hManager;
}
}
else
{
if (hManager == NULL)
{
*phManager = w2kServiceDisconnect (*phManager);
}
}
hManager1 = *phManager;
}
return hManager1;
}
//----------------------------------------------------------
SC_HANDLE WINAPI w2kServiceOpen (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hManager1;
SC_HANDLE hService = NULL;
w2kServiceManager (hManager, &hManager1, TRUE);
if ((hManager1 != NULL) && (pwName != NULL))
{
hService = OpenService (hManager1, pwName,
SERVICE_ALL_ACCESS);
}
w2kServiceManager (hManager, &hManager1, FALSE);
return hService;
}
//----------------------------------------------------------
BOOL WINAPI w2kServiceClose (SC_HANDLE hService)
{
return (hService != NULL) && CloseServiceHandle (hService);
}
//----------------------------------------------------------
BOOL WINAPI w2kServiceAdd (SC_HANDLE hManager,
PWORD pwName,
PWORD pwInfo,
PWORD pwPath)
{
SC_HANDLE hManager1, hService;
PWORD pwFile;
WORD awPath [MAX_PATH];
DWORD n;
BOOL fOk = FALSE;
w2kServiceManager (hManager, &hManager1, TRUE);
if ((hManager1 != NULL) && (pwName != NULL) &&
(pwInfo != NULL)&&(pwPath != NULL) &&
(n = GetFullPathName (pwPath, MAX_PATH, awPath, &pwFile)) &&
(n < MAX_PATH))
{
if ((hService = CreateService (hManager1, pwName, pwInfo,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
awPath, NULL, NULL,
NULL, NULL, NULL))
!= NULL)
{
w2kServiceClose (hService);
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_EXISTS);
}
}
w2kServiceManager (hManager, &hManager1, FALSE);
return fOk;
}
//----------------------------------------------------------
BOOL WINAPI w2kServiceRemove (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hService;
BOOL fOk = FALSE;
if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (DeleteService (hService))
{
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_MARKED_FOR_DELETE);
}
w2kServiceClose (hService);
}
return fOk;
}
//----------------------------------------------------------
BOOL WINAPI w2kServiceStart (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hService;
BOOL fOk = FALSE;
if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (StartService (hService, 1, (LPCTSTR*)&pwName))
{
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_ALREADY_RUNNING);
}
w2kServiceClose (hService);
}
return fOk;
}
// -----------------------------------------------------------------
BOOL WINAPI w2kServiceControl (SC_HANDLE hManager,
PWORD pwName,
DWORD dControl)
{
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
BOOL fOk = FALSE;
if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (QueryServiceStatus (hService, &ServiceStatus))
{
switch (ServiceStatus.dwCurrentState)
{
case SERVICE_STOP_PENDING:
case SERVICE_STOPPED:
{
fOk = (dControl == SERVICE_CONTROL_STOP);
break;
}
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
{
fOk = (dControl == SERVICE_CONTROL_PAUSE);
break;
}
case SERVICE_START_PENDING:
case SERVICE_CONTINUE_PENDING:
case SERVICE_RUNNING:
{
fOk = (dControl == SERVICE_CONTROL_CONTINUE);
break;
}
}
}
fOk = fOk ||
ControlService (hService, dControl, &ServiceStatus);
w2kServiceClose (hService);
}
return fOk;
}
// -----------------------------------------------------------------
BOOL WINAPI w2kServiceStop (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_STOP);
}
// -----------------------------------------------------------------
BOOL WINAPI w2kServicePause (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_PAUSE);
}
// -----------------------------------------------------------------
BOOL WINAPI w2kServiceContinue (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_CONTINUE);
}
// -----------------------------------------------------------------
SC_HANDLE WINAPI w2kServiceLoad (PWORD pwName,
PWORD pwInfo,
PWORD pwPath,
BOOL fStart)
{
BOOL fOk;
SC_HANDLE hManager = NULL;
if ((hManager = w2kServiceConnect ()) != NULL)
{
fOk = w2kServiceAdd (hManager, pwName, pwInfo, pwPath);
if (fOk && fStart)
{
if (!(fOk = w2kServiceStart (hManager, pwName)))
{
w2kServiceRemove (hManager, pwName);
}
}
if (!fOk)
{
hManager = w2kServiceDisconnect (hManager);
}
}
return hManager;
}
// -----------------------------------------------------------------
BOOL WINAPI w2kServiceUnload (PWORD pwName)
{
SC_HANDLE hManager1 = NULL;
BOOL fOk = FALSE;
if (pwName != NULL)
{
hManager1 = w2kServiceConnect ();
if (hManager1 != NULL)
{
w2kServiceStop (hManager1, pwName);
fOk = w2kServiceRemove (hManager1, pwName);
}
}
w2kServiceDisconnect (hManager1);
return fOk;
}
Вот пример загрузки драйвера с помощью этих ф-ций
bResult = LoadUnloadDeviceDriver(L"XXX_Driver",L"MyXXX_Driver",L"C:\\work\\Drivers\\XXX_Driver.sys", TRUE);
if(!bResult)
Error(L"Error in load driver\n");
Вот пример выгрузки:
hDev = OpenDeviceDriver(L"NotifyDriver");
CloseDeviceDriver(L"NotifyDriver",&hDev );
и еще может кто-нибудь даст ссылку где поподробнее написано о загрузке драйверов через Enumерацию -так для общего развития
В DDK. Раздел Kernel Mode Driver Architecture/Design Guide/Plug and Play/Adding a PnP Device to a Runing System.
А это я уже тут писал(два раза):
Последовательность загрузки всех драйверов(начиная с Win2k) такая:
1) Загружают драйвер системной шины. Например PCI.
2) Вызывают DriverEntry а затем AddDevice для драйвера системной шины. В AddDevice создается FDO для драйвера системной шины. Потом посылают IRP_MN_START_DEVICE на созданный FDO.
3) Драйвер шины нумерует устройства на шине. Создает для них PDO.
4) Драйверу системной шины посылают IRP_MN_QUERY_DEVICE_RELATIONS, в ответ на который он возвращает массив созданных им PDO для устройств на шине.
5) На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на которые драйвер системной шины сообщает ID этих устройств.
6) Получив эти ID система пытается найти и загрузить драйвера устройств.
7) Найдя драйвер для устройства, система отображает его в память вызывает его DriverEntry, потом AddDevice, в этом AddDevice создается FDO для устройства. Если устройств управляемых этим драйвером несколько то AddDevice будет вызвана для каждого устройства. Также смотрят реестр на предмет наличия фильтров для девайса. Device Manager посылает на FDO запрос IRP_MN_START_DEVICE.
8 ) Потом посылают на FDO запрос IRP_MN_QUERY_DEVICE_RELATIONS. Если устройство само является шиной или держит на себе другие устройства, которыми само не управляет, то для устройств на нем повторяется вся последовательность действий, начиная с пункта 5.