Вам надо почитать про ExQueueWorkItem или схожие с ней по функциональности. Что позволит вам запланировать выполнение свое процедуры на более низком IRQL (а именно PASSIVE_LEVEL).
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Я являюсь студентом СПбГИТМО и в рамках учебного курса "Защита информации" столкнулся со следующей
прблемой: надо написать драйвер ядра, который осуществлял бы перехват клавитуры в win2000 и выводил данные
перехвата в лог-файл.
В DDK ..src\input\kbfiltr содержится скелет такого драйвера, и, насколько я понял, запись данных
перехвата должна осуществляться внутри следующей функции
VOID KbFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
/*++
Routine Description:
Called when there are keyboard packets to report to the RIT. You can do
anything you like to the packets. For instance:
o Drop a packet altogether
o Mutate the contents of a packet
o Insert packets into the stream
Arguments:
DeviceObject - Context passed during the connect IOCTL
InputDataStart - First packet to be reported
InputDataEnd - One past the last packet to be reported. Total number of
packets is equal to InputDataEnd - InputDataStart
InputDataConsumed - Set to the total number of packets consumed by the RIT
(via the function pointer we replaced in the connect
IOCTL)
Return Value:
Status is returned.
--*/
{
PDEVICE_EXTENSION devExt;
devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
(*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed);
}
code
Все мои попытки неизменно заканчиваются синим экраном смерти, и я был бы очень признателен за дельный совет или кусок работающего кода.
Здравствуйте Storozh, Вы писали:
S>В DDK ..src\input\kbfiltr содержится скелет такого драйвера, и, насколько я понял, запись данных S>перехвата должна осуществляться внутри следующей функции
S>Все мои попытки неизменно заканчиваются синим экраном смерти, и я был бы очень признателен за дельный совет или кусок работающего кода.
DDK сейчас нет под рукой но вот тебе ссылочка http://www.sysinternals.com/ntw2k/source/ctrl2cap.shtml
Очень простой пример — проверку на CAPS_LOCK уберешь а вместо него кернелевскую запись в файл — но тоже могу быть грабли — запись в файл нормально пройдет если "приоритет драйвера"( не помню точного названия — посмотри в функции записи ) низкий
Если не пройдет то попробуй к буферу доступ найти не из ReadComplete а из ReadDispatch — здесь write можно у меня получалось
Здравствуйте MALnew, Вы писали:
MAL>Если не пройдет то попробуй к буферу доступ найти не из ReadComplete а из ReadDispatch — здесь write можно у меня получалось
Спасибо за ссылочку, но вот заменить Caps на Ctrl у меня и из своей программы получается:
VOID
KbFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
PDEVICE_EXTENSION devExt;
int i,x;
devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
x= InputDataEnd - InputDataStart;
for( i = 0; i < x; i++ )
{
if (InputDataStart[i].MakeCode == CAPS_LOCK)
InputDataStart[i].MakeCode = LCONTROL;
(*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed);
}
}
, а вот каким образом файл открыть, да чего-нибудь туда записать — не представляю. Если есть мысли, то поделись, если не трудно, поподробнее..
Здравствуйте MALnew, Вы писали:
MAL>Тогда когда BSoD выползает ?
MAL>Попробуй примерно это
А вот именно тут оно и выползает (реакция на ZwCreateFile())
MAL>Но проверь IRQL он не должен быть выше, то ли DISPATCH_LEVEL, то ли PASSIVE_LEVEL
Вот именно в этом IRQL и засада (IRQL LESS OR EQUAL)
Подскажи, пожалуйста, как быть с этим, синий экран меня уже порядком достал.
Здравствуйте Storozh, Вы писали:
S>Вот именно в этом IRQL и засада (IRQL LESS OR EQUAL) S>Подскажи, пожалуйста, как быть с этим, синий экран меня уже порядком достал.
Если бы использовать Ctrl2Cap я бы подсказал — а сорцы для kbdfltr я не имею
#define NT_FILE_NAME L"\\??\\c:\\log.txt"
VOID
KbFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
{
PDEVICE_EXTENSION devExt;
OBJECT_ATTRIBUTES oa;
IO_STATUS_BLOCK iosb;
HANDLE hFile;
UNICODE_STRING g_usFileName;
devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
(*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed);
if (InputDataStart->Flags==KEY_MAKE)
{
RtlInitUnicodeString(&g_usFileName,NT_FILE_NAME);
InitializeObjectAttributes(&oa,&g_usFileName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL,NULL);
if (ZwOpenFile(&hFile,FILE_APPEND_DATA|SYNCHRONIZE,&oa,&iosb,
FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT)==STATUS_SUCCESS)
{
if (ZwWriteFile(&hFile,0,NULL,NULL,&iosb,
&InputDataStart->MakeCode,4,NULL,NULL)==STATUS_SUCCESS);
ZwClose(hFile);
}
}
}
В чем ошибка? или работу с файлами из этой функции вызывать нельзя?
KbFilter_ServiceCallback runs in kernel mode at IRQL DISPATCH_LEVEL.
Callers of ZwOpenFile must be running at IRQL = PASSIVE_LEVEL.
Похоже проблема в этом....Каким образом можно это обойти.