dvp
Гость
|
|
« : 27-06-2003 13:53 » |
|
Извините что ступил насчет старых-новых форумов. В общем ситуация такая: Создается драйвер пустышка в NuMega Driver St . Вопрос как его загрузить динамически. Предложенный метод загрузки через Service Control Manager В ДАННОМ СЛУЧАЕ НЕ РАБОТАЕТ, сервис регистрируется но не стартует (ошибка // The service cannot be started, either because it is disabled or because it has no enabled devices associated with it. // #define ERROR_SERVICE_DISABLED 1058L). Но в инете мне попадались исходники, писанные не в NuMege, которые таким образом загружались. Отсюда вопросы: - в чем народ обычно пишет драйвера (предпочтения +,-) - какие еще возможности динамической загрузки есть в W2000 (т.к. через "Установку оборудования" драйвер стартовал нормально)
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 27-06-2003 14:01 » |
|
void AInstall::InstallDriver(int reinstall) {
SC_HANDLE SchSCManager; char DriverName[255]; char ServiceExe[255]; SC_HANDLE schService; SC_HANDLE schTcpIpService; DWORD err; char ServiceConfigBuffer[512]; LPQUERY_SERVICE_CONFIG pTcpIpServiceConfig; DWORD dwBytesNeeded; DWORD dwTagId;
result = NONE;
// Create real source name and copy file to system directory char SysDir[MAX_PATH]; char SourceDir[MAX_PATH]; char DrvName[MAX_PATH]; if (sInstall.winver == WINDOWS_2000) { strcpy(DrvName,"\\mnet.sys"); strcpy(DriverName,"mnet"); goto Next; } if (sInstall.winver == WINDOWS_NT) { strcpy(DrvName,"\\advairNT.sys"); strcpy(DriverName,"advairNT"); goto Next; } if (sInstall.winver == WINDOWS_9X || sInstall.winver == WINDOWS_95) { strcpy(DrvName,"\\advair.vxd"); strcpy(DriverName,"advair"); } else {
result = UNKNOWN_WINDOWS_VERSION; return; } Next: switch (sInstall.winver ) { case WINDOWS_2000: case WINDOWS_NT: GetSystemDirectory(SysDir,MAX_PATH); sprintf(ServiceExe,"%s%s",SysDir,DrvName); strcpy(sInstall.DriverLocation,ServiceExe); sprintf(SourceDir,"%s%s",sInstall.CurrentDir,DrvName); if (!CopyFile(SourceDir,ServiceExe,FALSE)) { int i = 0; } if (reinstall) return;
SchSCManager = OpenSCManager (NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); //Gather information about tcpip service: schTcpIpService = OpenService(SchSCManager, "tcpip", SERVICE_QUERY_CONFIG);
if (schTcpIpService==NULL) { result = TCP_IP_OPEN_ERROR;
return; }
pTcpIpServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;
if (!QueryServiceConfig(schTcpIpService, pTcpIpServiceConfig, sizeof(ServiceConfigBuffer), &dwBytesNeeded)) { CloseServiceHandle(schTcpIpService); result = QUERY_SERVICE_ERROR;
return; } schService = CreateService (SchSCManager, // SCManager database DriverName, // name of service DriverName, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_KERNEL_DRIVER, // service type pTcpIpServiceConfig->dwStartType, // start type SERVICE_ERROR_NORMAL, // error control type ServiceExe, // service's binary pTcpIpServiceConfig->lpLoadOrderGroup, // no load ordering group &dwTagId, // tag identifier "tcpip", // dependencies NULL, // LocalSystem account NULL // no password );
if (schService == NULL) { err = GetLastError();
if (err == ERROR_SERVICE_EXISTS) { // // A common cause of failure (easier to read than an error code) // UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,FALSE); UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE);
UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,TRUE); UpdateDependency(SchSCManager,"Netbt",DriverName,TRUE);
result = SERVICE_EXISTS_ERROR; } else { result = SERVICE_CREATE_ERROR;
}
CloseServiceHandle(schTcpIpService); return; } else { UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,TRUE); UpdateDependency(SchSCManager,"Netbt",DriverName,TRUE);
}
CloseServiceHandle(schTcpIpService);
CloseServiceHandle (schService);
break; case WINDOWS_9X: case WINDOWS_95: GetWindowsDirectory(SysDir,MAX_PATH); sprintf(ServiceExe,"%s%s",SysDir,DrvName); strcpy(sInstall.DriverLocation,ServiceExe); sprintf(SourceDir,"%s%s",sInstall.CurrentDir,DrvName); CopyFile(SourceDir,ServiceExe,FALSE); if (reinstall) return;
if (!WritePrivateString()) {
result = CANT_INSTALL_DRIVER_FOR_WIN98; }
break; default: { result = UNKNOWN_WINDOWS_VERSION;
return; } } }
BOOL AInstall::UpdateGroupOrderList( IN DWORD dwTcpIpTag, IN DWORD dwFilterTag, IN CHAR *Group, IN BOOL bMode //TRUE - insert dwFilterTag right after dwTcpIpTag, //FALSE - remove dwFilterTag ) { HKEY hGroupOrderListKey; DWORD dwType=REG_SZ; DWORD ValueBuffer[512]; DWORD dwValueBufferSize=512; DWORD i;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\GroupOrderList", 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hGroupOrderListKey) != ERROR_SUCCESS) { return FALSE; }
dwValueBufferSize = sizeof(ValueBuffer);
if (RegQueryValueEx(hGroupOrderListKey, Group, NULL, &dwType, (unsigned char *)ValueBuffer, &dwValueBufferSize) != ERROR_SUCCESS) { RegCloseKey(hGroupOrderListKey); return FALSE; }
// if (bMode == TRUE) //Add tag { for (i=1;i<ValueBuffer[0];i++) { if (ValueBuffer == dwTcpIpTag) { memmove(ValueBuffer+i+1,ValueBuffer+i,(ValueBuffer[0]-i+1)*sizeof(DWORD)); ValueBuffer[i+1] = dwFilterTag; ValueBuffer[0]+=1; dwValueBufferSize+=sizeof(DWORD); break; } } } else //Remove tag { for (i=1;i<ValueBuffer[0];i++) { if (ValueBuffer == dwFilterTag) { memmove(ValueBuffer+i,ValueBuffer+i+1,(ValueBuffer[0]-i)*sizeof(DWORD)); ValueBuffer[0]-=1; dwValueBufferSize-=sizeof(DWORD); break; } } }
if (RegSetValueEx(hGroupOrderListKey, Group, NULL, dwType, (unsigned char *)ValueBuffer, dwValueBufferSize) != ERROR_SUCCESS) { RegCloseKey(hGroupOrderListKey); return FALSE; }
RegCloseKey(hGroupOrderListKey); return TRUE;
}
BOOL AInstall::UpdateDependency( IN SC_HANDLE SchSCManager, IN const CHAR *Service, IN const CHAR *Dependant, IN BOOL bMode //TRUE - incert dependency, FALSE - remove it ) { SC_HANDLE schService; char ServiceConfigBuffer[512]; char ServiceDependencies[512]; PCHAR pTmp; LPQUERY_SERVICE_CONFIG pServiceConfig; DWORD dwBytesNeeded; BOOL bRes; int l, idx;
//Gather information about netbt service: schService = OpenService(SchSCManager, Service, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
if (schService == NULL) { return FALSE; }
pServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;
if (!QueryServiceConfig(schService, pServiceConfig, sizeof(ServiceConfigBuffer), &dwBytesNeeded)) { CloseServiceHandle(schService); return FALSE; }
if (bMode) // insert dependant { if (pServiceConfig->lpDependencies != NULL) { pTmp = pServiceConfig->lpDependencies; while (*(pTmp) != '\0') { pTmp+=strlen(pTmp)+1; }
memcpy( ServiceDependencies, pServiceConfig->lpDependencies, (pTmp-pServiceConfig->lpDependencies));
pTmp = ServiceDependencies+(pTmp-pServiceConfig->lpDependencies);
} else { pTmp = ServiceDependencies; }
strcpy(pTmp,Dependant); pTmp[strlen(pTmp)+1]='\0';
pTmp = ServiceDependencies;
} else // remove dependant { if (pServiceConfig->lpDependencies != NULL) { pTmp = pServiceConfig->lpDependencies; idx = 0;
while (*(pTmp) != '\0') { l = strlen(pTmp);
if (stricmp(pTmp,Dependant)!=0) { strcpy(ServiceDependencies+idx,pTmp); idx+=l+1; ServiceDependencies[idx]=0; }
pTmp+=l+1; }
ServiceDependencies[idx]=0; ServiceDependencies[idx+1]=0;
pTmp = ServiceDependencies;
} else { pTmp = NULL; }
}
bRes = ChangeServiceConfig( schService, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, NULL, NULL, NULL, // tag identifier pTmp, NULL, NULL, NULL);
CloseServiceHandle(schService);
return bRes;
}
void AInstall::RemoveDriver() { SC_HANDLE SchSCManager; char DriverName[255]; SC_HANDLE schService; char ServiceConfigBuffer[512]; LPQUERY_SERVICE_CONFIG pServiceConfig; DWORD dwBytesNeeded; BOOL ret; BOOL bUpdateTag;
result = NONE;
switch (sInstall.winver) { case WINDOWS_2000: case WINDOWS_NT:
bUpdateTag = FALSE;
if (sInstall.winver == WINDOWS_2000) { strcpy(DriverName,"mnet"); goto Next; } if (sInstall.winver == WINDOWS_NT) { strcpy(DriverName,"advairNT"); goto Next; } if (sInstall.winver == WINDOWS_9X || sInstall.winver == WINDOWS_95) { strcpy(DriverName,"advair"); } else { result = UNKNOWN_WINDOWS_VERSION;
return; } Next: SchSCManager = OpenSCManager (NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); schService = OpenService (SchSCManager, DriverName, SERVICE_ALL_ACCESS );
if (schService == NULL) { result = UNKNOWN_WINDOWS_VERSION;
UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE); return; }
pServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;
if (QueryServiceConfig(schService, pServiceConfig, sizeof(ServiceConfigBuffer), &dwBytesNeeded)) { bUpdateTag = TRUE; }
ret = DeleteService (schService);
if (ret) { // printf ("DeleteService SUCCESS\n"); } else { result = CANT_REMOVE_DRIVER;
}
if (bUpdateTag) { UpdateGroupOrderList(0,pServiceConfig->dwTagId,pServiceConfig->lpLoadOrderGroup,FALSE); }
UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE);
CloseServiceHandle (schService); break; case WINDOWS_9X: case WINDOWS_95: DeletePrivateString(); break; }
}
Вот так я устанвливал свой фильтр - обычной программой - старт драйвера у меня требовал перезагрузки... Драйвер фильтр - TDI драйвер который встраивается в NDIS...
Возможно по этому коду ты сможешь разобраться в том, как работать с товим WDM.
1. Пишу в DDK 2. Не думал над таким вопросом вплотную...думаю Славик подскажет лучше.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 27-06-2003 14:12 » |
|
Вот еще ф-ции- NtLoadDriver & NtUnloadDriver(Они же ZwLoadDriver & ZwUnloadDriver)- эспортируются из NTDLL.dll. Попробуй их, но они тоже могут не помочь, так как вызываются из SCM, а им ты уже пробовал. Других спосов кроме двух, которые ты уже знаешь по-моему нет.
Скорее всего твой драйвер- далеко не пустышка и требует наличия девайса, отсюда и проблемы. Посмотри внимательно что ты просишь создать у Numega - она по моему драйвера для реальных устройств создает. Писать драйвер надо на C, если решишь писать на C++ тебе понадобится RunTime библиотека в ядре для инициализации глобальных объектов(вызовы конструкторов классов до вызова DriverEntry), runtime библиотеки C++ в ядре нет, есть примеры создания таких библиотек для ядра. как там выкручивается NuMega не знаю. Писать на асме не стоит, во первых теперь винда как минимум для трех платформ- IA-32, IA-64, AMD 64, и во вторых- 64 разрядные компиляторы не поддерживают встроенный ассемблер(к тому же он разный у каждой архитектуры).
Вот прототипы и описание NtLoadDriver & NtUnloadDriver(Они же ZwLoadDriver & ZwUnloadDriver)
1) ZwLoadDriver loads a device driver. NTSYSAPI NTSTATUS NTAPI ZwLoadDriver( IN PUNICODE_STRING DriverServiceName ); Parameters DriverServiceName Specifies the registry key name where the driver configuration information is stored. Return Value Returns STATUS_SUCCESS or an error status, such as STATUS_PRIVILEGE_NOT_HELD, STATUS_CONFLICTING_ADDRESSES, STATUS_INVALID_IMAGE_FORMAT, STATUS_PROCEDURE_NOT_FOUND, STATUS_IMAGE_ALREADY_LOADED, STATUS_IMAGE_CHECKSUM_MISMATCH, STATUS_IMAGE_MP_UP_MISMATCH, STATUS_DRIVER_ORDINAL_NOT_FOUND, STATUS_DRIVER_ENTRYPOINT_NOT_FOUND, STATUS_DRIVER_UNABLE_TO_LOAD, or STATUS_ILL_FORMED_SERVICE_ENTRY.
Related Win32 Functions None. Remarks SeLoadDriverPrivilege is required to load a driver. The Win32 function StartService directs the Service Control Manager process to execute this function on behalf of the caller. The Service Control Manager process provides a DriverServiceName of the form “\Registry\Machine\System\CurrentControlSet\Services\Tcpip.”
2)ZwUnloadDriver ZwUnloadDriver unloads a device driver. NTSYSAPI NTSTATUS NTAPI ZwUnloadDriver( IN PUNICODE_STRING DriverServiceName ); Parameters DriverServiceName Specifies the registry key name where the driver configuration information is stored. Return Value Returns STATUS_SUCCESS or an error status, such as STATUS_PRIVILEGE_NOT_HELD, STATUS_ILL_FORMED_SERVICE_ENTRY, or STATUS_OBJECT_NAME_NOT_FOUND. Related Win32 Functions None. Remarks SeLoadDriverPrivilege is required to unload a driver. The Win32 function ControlService directs the Service Control Manager process to execute this function on behalf of the caller. The Service Control Manager process provides a DriverServiceName of the form “\Registry\Machine\System\CurrentControlSet\Services\Tcpip.”
|
|
|
Записан
|
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #3 : 27-06-2003 14:15 » |
|
А я делаю так:
///**************Функции динамической загрузки************************ bool drvLoad(char* name) { printf (name); hSCManager=NULL; hService=NULL; bool status; status=FALSE; if(OpenManager()) { if(drvCreateService(name)) { if(drvStartService(name)) { status=TRUE; printf("\n Driver is now load...\n"); } } }
hDevice = CreateFile ("//./LptStack", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);// в драйвере у меня \\Device\\LptStack и \\DosDevices\\LptStack и сам драйвер называется LptStack.sys
return status; }
//---------------------------------------------------------------------
bool OpenManager() { bool status; status=FALSE; if(hSCManager!=NULL) { CloseServiceHandle (hSCManager); printf("CloseServiceHandle was used \n"); hSCManager=NULL; } hSCManager=OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS); if (hSCManager == NULL) { error(_OpenSCManager); } else status=TRUE;
return status; }
//--------------------------------------------------------------------- bool drvCreateService(PCHAR pDrvName) { LPTSTR lpBuffer; lpBuffer = new char[256]; BOOL status = FALSE; LPTSTR awPath; // путь к драйверу с именем pDrvName
GetCurrentDirectory(256, lpBuffer); strcat(lpBuffer,"\\"); strcat(lpBuffer,pDrvName); awPath = lpBuffer;
hService = CreateService(hSCManager,pDrvName,pDrvName,SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL, awPath,NULL,NULL,NULL,NULL,NULL);
if(!hService) { error(_CreateService); drvOpenService(pDrvName); } else status=TRUE;
delete lpBuffer;
return status; }
//-------------------------------------------------------------------- bool drvOpenService(PCHAR name) {
bool status; status=FALSE; if(hService!=NULL) CloseService();
hService=OpenService(hSCManager,name,SERVICE_ALL_ACCESS); if (!hService) error(_OpenService); else status=TRUE; return status; }
//--------------------------------------------------------------------- bool drvStartService(PCHAR name) { // printf ("drvStartService"); bool status; status=FALSE; if(!StartService(hService,0,NULL)) { error(_StartService); printf("Deleting service..."); } else status=TRUE;
return status; } //--------------------------------------------------------------------- bool drvDeleteService(PCHAR name) { bool status; status=FALSE; CloseService(); if(!DeleteService(hService)) error(_DeleteService); else status=TRUE;
return status; }
//------------------------------------------------------------------- void CloseService() { CloseServiceHandle (hService); hService=NULL; }
//------------------------------------------------------------------- int drvUnLoad(PCHAR name) { int status; status=FALSE;
if (hDevice!=INVALID_HANDLE_VALUE) { if(!CloseHandle(hDevice)) error(_CloseHandle); hDevice=INVALID_HANDLE_VALUE; } if (hService) { status = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus); if(!status) error(_SERVICE_CONTROL_STOP); status = DeleteService(hService); if(!status) error(_DeleteService); status = CloseServiceHandle(hService); if(!status) error(_CloseServiceHandle); }
if(!CloseServiceHandle(hSCManager)) error(_CloseServiceHandle); if (status) printf("Driver Unload... SUCCESS\n"); return status; }
Для загрузки вызываешь drvLoad, причем файл драйвера должен лежать рядом с exe-приложением.
|
|
|
Записан
|
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #4 : 27-06-2003 14:50 » |
|
Предложенный метод загрузки через Service Control Manager В ДАННОМ СЛУЧАЕ НЕ РАБОТАЕТ, сервис регистрируется но не стартует (ошибка // The service cannot be started, either because it is disabled or because it has no enabled devices associated with it. // #define ERROR_SERVICE_DISABLED 1058LОтсюда вопросы: - в чем народ обычно пишет драйвера (предпочтения +,-) - какие еще возможности динамической загрузки есть в W2000 (т.к. через "Установку оборудования" драйвер стартовал нормально) Обрати внимание на то, как соотносятся имена которые ты передаешь СreateService(), CreateFile c именами которые написаны в драйвере (что-то вроде \\Device\\Имя и \\DosDevices\\Имя ). Удачный "старт сервиса " зависет от корректности параметров переданных СreateService(). Еще, если у тебя сервис создан, а ты его снова попытаешься создать--то получишь ошибку, в этом случуе следует использовать OpenService(). P.S. Драйвера пишу на С, без Numegи. На основе примеров в ДДК.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #5 : 27-06-2003 14:53 » |
|
Да нет OpenService возвращает нормальный указатель на сервис, просто он не стартуется. сейчас пытаюсь запустить с помощью ZwLoadDriver
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #6 : 27-06-2003 15:06 » |
|
А он и не должен стартовать. OpenService и все остальное - это регистрация драйвера в системе, для старта ты должен стартовать его сам. Или перезагрузить систему, тогда она стартует его сама....
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #7 : 27-06-2003 15:08 » |
|
А он и не должен стартовать. OpenService и все остальное - это регистрация драйвера в системе, для старта ты должен стартовать его сам. Или перезагрузить систему, тогда она стартует его сама.... 2dvp Разве ты не используешь функцию StartService???
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #8 : 27-06-2003 16:41 » |
|
да subj какой, мне перезагрузка не нужна. а то что OpenService драйвер не стартует, это понятно, я просто объясняю что драйвер зарегистрировался и открывается openservice, но Startservice не запускает его.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #9 : 27-06-2003 16:46 » |
|
Так для этого уже говоили тут что делать - на старом форуме, Слав ты не помнищь??? В драйвере должна быть процедура старта, и потом по моему не каждыйдрайвер можно стартовать так...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
dvp
Гость
|
|
« Ответ #10 : 27-06-2003 16:48 » |
|
Поподробнее пожайлуста ......
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #11 : 27-06-2003 17:16 » |
|
Так для этого уже говоили тут что делать - на старом форуме, Слав ты не помнищь??? В драйвере должна быть процедура старта, и потом по моему не каждыйдрайвер можно стартовать так... В драйвере есть только DriverEntry- точка входа, устанавлимая линковщиком, более ничего. Вызывается только она. Все остальное относится к WDM драйверам при наличии реальных девайсов для этого драйвера. Это было на старом форуме, но повторю- В нижеследующем тексте под словом "шина" подразумевается любое устройство, к которому могут быть присоеденены другие устройства- например под это определение попадают шина PCI, USB, IEEE 1394 также под это определение попадают "виртуальные" шины(как пример- toaster в DDK, но обратите внимание- он не соответствует никакому реальному устройству, поэтому количество PDO ему сообщают из приложения, он их и создает). Последовательность загрузки всех драйверов(начиная с Win2k) такая: 1) Загружают драйвер системной шины. Например PCI. 2) Вызывают DriverEntry а затем AddDevice для драйвера системной шины. В AddDevice создается FDO для драйвера системной шины. Потом посылают IRP_MN_START_DEVICE на созданный FDO. 3) Драйвер шины нумерует устройства на шине. Создает для них PDO-эти PDO управляются драйвером шины на которой они сидят. 4) Драйверу системной шины посылают IRP_MN_QUERY_DEVICE_RELATIONS, в ответ на который он возвращает массив созданных им PDO для устройств на шине. 5) На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на которые драйвер системной шины сообщает ID этих устройств. 6) Получив эти ID система пытается найти и загрузить драйвера устройств. Если устройство само является шиной, то для него повторяется вся последовательность действий. 7) Найдя драйвер для устройства, система отображает его в память вызывает его DriverEntry(если он еще не загружен), потом AddDevice, в этом AddDevice создается FDO для устройства. Если устройств управляемых этим драйвером несколько то AddDevice будет вызвана для каждого устройства. Также смотрят реестр на предмет наличия фильтров для девайса. 8 Потом засылает на созданные FDO запрос IRP_MN_START_DEVICE. Если железяки в компе нет и эта железяка не найдена драйвером шины то драйвер не грузится. Если это какая-то кривая железяка, для которой драйвер грузится без драйвера шины( просто прописано грузить драйвер и все) то драйвер загрузится независимо от наличия или отсутствия- как он там будет разбираться с системой его личное дело. Например так поступают драйвера на NT4, но там и не WDM драйверы.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #12 : 27-06-2003 17:25 » |
|
ну а если у меня не железячный драйвер, а для того чтобы просто получить доступ к ring)
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 27-06-2003 17:31 » |
|
ну а если у меня не железячный драйвер, а для того чтобы просто получить доступ к ring) DriverEntry и все- в нем создаешь нужные DEVICE_OBJECT и т.д. Ничего кроме DriverEntry при старте вызываться не будет. Возвращать STATUS_SUCCESS.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #14 : 27-06-2003 19:11 » |
|
но динамически он загружаться будет? Никакого кода добавлять не надо?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 27-06-2003 19:17 » |
|
но динамически он загружаться будет? Никакого кода добавлять не надо? Конечно будет. Не надо никакого кода.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #16 : 27-06-2003 19:31 » |
|
Ну ладно. Чтоб в общем закрыть тему. то есть забиваем на NuMega, работаем чисто в DDK.(Если народ еще поможет с переменными окружения ....). Просто возникла идея написать прогу, отслеживающую запуск и выключение процессов.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #17 : 27-06-2003 20:17 » |
|
Ну ладно. Чтоб в общем закрыть тему. то есть забиваем на NuMega, работаем чисто в DDK.(Если народ еще поможет с переменными окружения ....). Просто возникла идея написать прогу, отслеживающую запуск и выключение процессов. Ну это элементарно- регестрируйся на PsSetCreateProcessNotifyRoutine и вперед. А вобще то это сделано. Вот тебе ссылочка на код - http://codeguru.earthweb.com/system/apihook.htmlТам статья и код(Downloads внизу статьи), все уже сделано, надо только разобраться. Кстати- драйвер из этой статьи моими ф-циями загружается, проверял. Вобще-то и другие драйвера всегда грузились.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #18 : 27-06-2003 22:59 » |
|
Переменные окружения создаются в DDK почредством запуска .bat файла из Стартового меню винды.
Посмотреть их всех можно запутив в окне комманду SET По компиляции см. статью на сайте по драйверам - пдробно описано.
Что еще?
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
V.L.
Гость
|
|
« Ответ #19 : 30-06-2003 10:41 » |
|
Очень интересная тема. Многого не знаю, так что поправте... WDM драйвер не должен динамически грузиться-выгружаться по желанию или должны быть какие-то ограничения т.к. он PnP. Т.е. сильно зависит от наличия или отсуствия родного железа - ОС его хочет а мы его не пускаем и наоборот. В не PnP драйвере таких связей нет и нет проблем его грузить-выгружать динамически (давно проверялось на non PnP ISA device driver от NuMega - мин нет!). Ведь в NuMega визард в начале спрашивает - PnP будет драйвер или нет и в зависимости от этого различные объекты в текст подсовывает.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #20 : 30-06-2003 12:05 » |
|
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)... Значит в операционке где то это все храниться? Куда копать?
|
|
|
Записан
|
|
|
|
|
dvp
Гость
|
|
« Ответ #22 : 30-06-2003 13:43 » |
|
да уж пришлось самому такую прогу налабать. Но NuMegoвские драйвера она тоже не грузит (механизм же тот же). при запуске build выдает NMAKE.EXE failed - rc = 1 как с этой фигней бороться (батник checked build enviromeny запустил)
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #23 : 30-06-2003 14:24 » |
|
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)... Значит в операционке где то это все храниться? Куда копать? По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #24 : 30-06-2003 14:33 » |
|
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)... Значит в операционке где то это все храниться? Куда копать? По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил. не знаю как насчет потоков, но она при первом запуске показала кучу процессов, запущенных и выключенных с момента включения компьютера, то есть до того как она вообще появилась на винте.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #25 : 30-06-2003 14:40 » |
|
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #26 : 30-06-2003 16:00 » |
|
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)... Значит в операционке где то это все храниться? Куда копать? По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил. не знаю как насчет потоков, но она при первом запуске показала кучу процессов, запущенных и выключенных с момента включения компьютера, то есть до того как она вообще появилась на винте. "Информация о закрытых процессах сохраняется системой до того момента, пока есть открытые описатели процесса, созданные с целью синхронизации, определения статуса завершения и т.д. "- вот как она их показывает, это означает что она покажет те, на которые остались ссылки, если ссылок нет, то и не будет структуры для этого процесса. Я не раз видел людей которые пытались что-то делать не удостоверившись что структура потока(процесса) еще жива в памяти. Я и сам сталкивался с тем что мне пришлось писать драйвер, который держал в памяти структуры завершаемых потоков, так как как я потом к ним обращался, до того как я это сделал- я получал иногда BSOD, так как я сначала получал указатель на поток, а спустя некоторое время обрабатывал структуру, на которую он указывал- вот тут я ошибся, так как поток мог быть уничтожен к моменту повторного обращения, тогда я и сделал драйвер, который держал в памяти потоки. А основная причина удержания структур и потоков в памяти- незавершенные IRP, максимальное время удержания структуры потока в памяти- 5 минут, если после этого все IRP не завершатся произойдет принудительное обнуление большей части структуры потока и освобождение памяти. Поведение системы при этом непредсказуемо, IRP могут завершится ничего не задев , а могут BSOD отвесить. А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах. А если тебе интересно- то указатели на потоки и процессы хранятся в виде связанного списка и можно пройтись по списку и узнать все что надо.
|
|
|
Записан
|
|
|
|
dvp
Гость
|
|
« Ответ #27 : 30-06-2003 16:09 » |
|
> А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах.
А как получить эту инфу?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #28 : 30-06-2003 16:12 » |
|
> А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах.
А как получить эту инфу? Каую инфу? О закончившихся процесса? Никак. Или пройтись по списку процессов - там будут как живые так и закончившиеся, но не все закончившиеся, а только те которые намеренно держут.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #29 : 30-06-2003 16:14 » |
|
В процессах которые еще недобиты, ты сможешь получить только код возврата и все, УВЫ... Рихтер пишет именно так, и я тоже
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
|