Всем превед Такая ситуация, скомпилил драйвер, девайс и симлинк к нему. Все успешно собралось и установилось в системе (XP SP2, в WinDBG все это добро успешно видится). При попытке CreateFile("\\\\.\\<my_device>",...) функция постоянно возвращает INVALID_HANDLE_VALUE. В драйвере строки определены как "\\Device\\my_device" и "\\DosDevices\\my_device". Где туплю?
Ну, если уж это принципиально, то звиняйте, барин, языками не владеем... "Ошибка открытия файла", так?
"Ошибка открытия хендла устройства" Но дело в другом. Видны ли символические ссылки твоего устройства? Какая ошибка у CreateFile? какие параметры передаются?
Вообщем, с созданием девайса и симлинка все в порядке, все видно и в WinObjEx и DeviceTree и WinDBG. Полагаю, что ошибка не там Открываю файл так - Код (Text): int main() { HANDLE hFile; if((hFile = CreateFile("\\\\.\\my_device", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) { printf("error - %X\n", hFile); return (-1); } return 0; } Меняю симлинк на любой из уже имеющихся на машине - ошибка та же, фукнция всегда возвращает 0xffffffff.
Надо писать printf("error - %X\n", GetLastError()) И вместо FILE_SHARE_READ и поставь 0 и в file attribute также 0.
Не выходит (( Не могу понять в чем дело, CreateFile() выборочно открывает хендлы из скармливаемых симлинков, например NDIS, Tcp и нескоторые другие проходят без особых проблем, другие же - скажем, логические диски - нет. Вываливается с ошибкой CreateFile и с моим симлинком на созданный девайс (( Хочется ругаться матом... Вот оба исходника, мож кто глянет, если не лень... Буду признателен... драйвер к устройству не привязывал, ибо результат в обоих случаях тот же... Код (Text): #include <ntddk.h> NTSTATUS status; PDEVICE_OBJECT device, next_device; UNICODE_STRING usDeviceName, usSymLink; void OnUnload(IN PDRIVER_OBJECT pDriverObject) { DbgPrint("Driver unloaded"); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath) { pDriverObject->DriverUnload = OnUnload; device = pDriverObject->DeviceObject; RtlInitUnicodeString(&usDeviceName, L"\\Device\\mydev"); RtlInitUnicodeString(&usSymLink, L"\\DosDevices\\mydev"); if((status = IoCreateDevice(pDriverObject, 256, &usDeviceName, FILE_DEVICE_NULL, //или FILE_DEVICE_UNKNOWN METHOD_NEITHER, FALSE, &device)) != STATUS_SUCCESS) { DbgPrint("Unable to create device..."); return status; } if((status = IoCreateSymbolicLink(&usSymLink, &usDeviceName)) != STATUS_SUCCESS) { DbgPrint("Unable to create symbolic link"); IoDeleteDevice(device); return status; } DbgPrint("Device and symlink successfully created...\n"); DbgPrint("Created device's pointer >> %X", device); DbgPrint("Created device's symbolic link >> %ws", usSymLink.Buffer); return STATUS_SUCCESS; } ну и открытие хендла Код (Text): #include <windows.h> int main() { HANDLE hFile; printf("Trying to create file....\n"); if((hFile = CreateFile("\\\\.\\mydev", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { printf("Unable to create file... - %X\n", GetLastError()); return (-1); } printf("File created....\n"); return 0; }
Заполнял IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_DEVICE_CONTROL, здесь просто light-версия ) Результат тот же
n0nаme, спасибо! )) Оказывается проблема была именно в этом. Потом только у Солдатова прочел, что без обработчика IRP_MJ_CREATE драйвер можно создать, он будет работать, но обратиться к нему через CreateFile/ZwCreateFile будет нельзя. Спасибо еще раз!