Code (Text): hHandle = CreateFile( "\\\\.\\ipfilt",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(hHandle == INVALID_HANDLE_VALUE) { printf("ERR: can not access driver ipfilt.sys! (%d)\n", GetLastError()); goto done; } Что может означать если функция CreateFile() возврвщает INVALID_HANDLE_VALUE? А GetLastError() возвращает 2 - не удаётся найти указанный файл (на сколько я понимаю), хотя WinObj показывает, что: драйвер "\Driver\ipfilt" - существует; устройство "\Device\ipfilt" - существует; символьная ссылка на устройство "\??\ipfilt" - существует.
А может, дело в правах доступа, каковые при открытии файла у тебя по умолчанию? Таки винда ещё не до конца здурела чтобы всяким незнакомым процессам давать полный доступ ко всем дровам...
А как узнать, какие права доступа при открытии файла у меня по умолчанию? Почему ко всем, это же мой драйвер?
Code (Text): hHandle = CreateFile( "\\\\.\\ipfilt",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); я вижу две возможные проблемы: 1. Права доступа (SHARE) Попробуй установить FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE Хотя если GetLastError вовзращает -2, то трабла вероятно не здесь. 2. несуществующая символьная ссылка. Ты в драйвере верно создал устройство и символьную ссылку на него: ipfilt? Приведи свой код создания устройства и символьной ссылки
Установил FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE GetLastError() по прежниму возвращает 2. Code (Text): PDEVICE_OBJECT fdo = NULL; UNICODE_STRING devName, symLinkName; NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath) { NTSTATUS status = STATUS_SUCCESS; RtlInitUnicodeString( &devName, L"\\Device\\ipfilt" ); status = IoCreateDevice(theDriverObject, 0, &devName, FILE_DEVICE_UNKNOWN, 0 , FALSE, &fdo); if(!NT_SUCCESS(status)) return status; RtlInitUnicodeString( &symLinkName, L"\\??\\ipfilt" ); status = IoCreateSymbolicLink( &symLinkName, &devName ); if (!NT_SUCCESS(status)) { IoDeleteDevice( fdo ); return status; } }