Ошибка создания файла

Тема в разделе "LANGS.C", создана пользователем steelfactor, 15 авг 2007.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Всем превед
    Такая ситуация, скомпилил драйвер, девайс и симлинк к нему. Все успешно собралось и установилось в системе (XP SP2, в WinDBG все это добро успешно видится).
    При попытке CreateFile("\\\\.\\<my_device>",...) функция постоянно возвращает INVALID_HANDLE_VALUE.
    В драйвере строки определены как "\\Device\\my_device" и "\\DosDevices\\my_device".
    Где туплю?
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    код
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    WinObjEx, есть ли девайс и симболик линк, посмотри.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это ты CreateFile так перевёл?
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Ну, если уж это принципиально, то звиняйте, барин, языками не владеем...
    "Ошибка открытия файла", так?
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    "Ошибка открытия хендла устройства" :)
    Но дело в другом. Видны ли символические ссылки твоего устройства? Какая ошибка у CreateFile? какие параметры передаются?
     
  7. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Вообщем, с созданием девайса и симлинка все в порядке, все видно и в WinObjEx и DeviceTree и WinDBG. Полагаю, что ошибка не там
    Открываю файл так -
    Код (Text):
    1. int main()
    2. {
    3.    HANDLE hFile;
    4.    if((hFile = CreateFile("\\\\.\\my_device",  
    5.                              GENERIC_READ,
    6.                              FILE_SHARE_READ,
    7.                              NULL, OPEN_EXISTING,
    8.                              FILE_ATTRIBUTE_NORMAL, NULL)
    9.    == INVALID_HANDLE_VALUE)
    10.    {
    11.         printf("error - %X\n", hFile);
    12.         return (-1);
    13.    }
    14.  
    15. return 0;
    16. }
    Меняю симлинк на любой из уже имеющихся на машине - ошибка та же, фукнция всегда возвращает 0xffffffff.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Надо писать printf("error - %X\n", GetLastError())

    И вместо FILE_SHARE_READ и поставь 0 и в file attribute также 0.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    CreateFile("\\\\.\\my_device", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
     
  10. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Не выходит ((
    Не могу понять в чем дело, CreateFile() выборочно открывает хендлы из скармливаемых симлинков, например NDIS, Tcp и нескоторые другие проходят без особых проблем, другие же - скажем, логические диски - нет. Вываливается с ошибкой CreateFile и с моим симлинком на созданный девайс ((
    Хочется ругаться матом...
    Вот оба исходника, мож кто глянет, если не лень... Буду признателен...

    драйвер к устройству не привязывал, ибо результат в обоих случаях тот же...
    Код (Text):
    1. #include <ntddk.h>
    2. NTSTATUS status;
    3. PDEVICE_OBJECT device, next_device;
    4. UNICODE_STRING usDeviceName, usSymLink;
    5.  
    6. void OnUnload(IN PDRIVER_OBJECT pDriverObject)
    7. {
    8.  
    9.     DbgPrint("Driver unloaded");
    10. }
    11.  
    12. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath)
    13. {
    14.     pDriverObject->DriverUnload = OnUnload;
    15.     device = pDriverObject->DeviceObject;
    16.     RtlInitUnicodeString(&usDeviceName, L"\\Device\\mydev");
    17.     RtlInitUnicodeString(&usSymLink, L"\\DosDevices\\mydev");
    18.  
    19.     if((status = IoCreateDevice(pDriverObject,
    20.                 256,
    21.                 &usDeviceName,    
    22.                 FILE_DEVICE_NULL, //или FILE_DEVICE_UNKNOWN
    23.                 METHOD_NEITHER, FALSE, &device)) != STATUS_SUCCESS)
    24.     {                                    
    25.         DbgPrint("Unable to create device...");
    26.         return status;
    27.     }
    28.  
    29. if((status = IoCreateSymbolicLink(&usSymLink, &usDeviceName)) != STATUS_SUCCESS)
    30.     {
    31.         DbgPrint("Unable to create symbolic link");
    32.         IoDeleteDevice(device);
    33.         return status;
    34.     }
    35.     DbgPrint("Device and symlink successfully created...\n");
    36.     DbgPrint("Created device's pointer >> %X", device);
    37.     DbgPrint("Created device's symbolic link >> %ws", usSymLink.Buffer);
    38.     return STATUS_SUCCESS;
    39. }
    ну и открытие хендла
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int main()
    4. {
    5.     HANDLE hFile;
    6.     printf("Trying to create file....\n");
    7.     if((hFile = CreateFile("\\\\.\\mydev", GENERIC_READ,
    8.             0, NULL,  
    9.             OPEN_EXISTING,
    10.             0, NULL)) == INVALID_HANDLE_VALUE)
    11.     {
    12.         printf("Unable to create file... - %X\n", GetLastError());
    13.         return (-1);
    14.     }
    15.     printf("File created....\n");
    16.     return 0;
    17. }
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Таблицу IRP-хендлеров не заполнил.
     
  12. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Заполнял IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_DEVICE_CONTROL, здесь просто light-версия )
    Результат тот же
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    IRP_MJ_CREATE не пробовал?
     
  14. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    n0nаme, спасибо! :)))
    Оказывается проблема была именно в этом. Потом только у Солдатова прочел, что без обработчика IRP_MJ_CREATE драйвер можно создать, он будет работать, но обратиться к нему через CreateFile/ZwCreateFile будет нельзя.
    Спасибо еще раз!