Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.228.88] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Скачал исходник winring0, хочу портировать dll в delphi, возникли вопросы.
непонятна функция: DWORD GetRefCount() { if(gHandle == INVALID_HANDLE_VALUE) { return 0; } DWORD refCount; DWORD length, result; refCount = 0; result = DeviceIoControl( gHandle, IOCTL_OLS_GET_REFCOUNT, NULL, 0, &refCount, sizeof(refCount), &length, NULL ); if(! result) { refCount = 0; } return refCount; } используется один раз при выгрузке драйвера, гугл как-то скудно намекнул, что это проверка какого-то счётчика чего-то, что за счётчик? И ещё один архиважный вопрос, как запускать драйверы в win7 x64, сам драйвер подписан, при попытке запустить его из любой папки ошибка доступа, запуск из SysWOW64\drivers нормально. В исходниках есть пример использования драйвера, он нормально запускает драйвер из любой папки. |
Сообщ.
#2
,
|
|
|
Судя по коду в драйвере, это просто счетчик открытия и закрытия самого драйвера, вот вся работа с ним:
case IRP_MJ_CREATE: if(refCount != (ULONG)-1){refCount++;} status = STATUS_SUCCESS; break; case IRP_MJ_CLOSE: if(refCount != (ULONG)-1){refCount--;} status = STATUS_SUCCESS; break; case IRP_MJ_DEVICE_CONTROL: // Dispatch on IOCTL switch(pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_OLS_GET_REFCOUNT: *(PULONG)pIrp->AssociatedIrp.SystemBuffer = refCount; pIrp->IoStatus.Information = sizeof(refCount); status = STATUS_SUCCESS; break; Логика простая, при закрытии драйвера проверяем, открывал ли его еще кто либо? Если нет, то выгружаем драйвер из памяти. |