CreateFile не возвращает правильный дескриптор - устройства в Delphi

Надеюсь найти кого-нибудь, у кого есть опыт работы со службами в Windows.

Я пытаюсь использовать драйвер NdisProt для адаптеров Ethernet в Delphi

my_Handle := CreateFile(PChar('\\.\NdisProt'),
    GENERIC_WRITE or GENERIC_READ, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

(тоже пробовали с \\.\\NdisProt)

После выполнения my_Handle всегда имеет десятичное значение '4008', а GetLastError всегда возвращает 0

Если я пытаюсь прочитать или записать в файл, я получаю нарушение доступа, кто-нибудь знает, почему я получаю такое нежелательное поведение?


person Ed.C    schedule 19.10.2010    source источник
comment
Он используется для прямого доступа к устройствам, а не как обычный файл в файловой системе. msdn.microsoft.com/en-us/library/ aa363858% 28VS.85% 29.aspx   -  person Ed.C    schedule 20.10.2010
comment
Вы пробовали поискать в гугле? Я знаю, что с драйверами устройств может быть очень сложно подключиться (я делал то же самое с приводами CD-ROM); и подобные поиски мне очень помогли: google.com/search?q=createfile+ \\. \ NdisProt (это может быть просто разрешение или проблема именования).   -  person Jeroen Wiert Pluimers    schedule 20.10.2010


Ответы (2)


Если CreateFile не возвращает Invalid_Handle_Value, значит, он дал вам допустимый дескриптор, иначе драйвер для этого устройства содержит серьезные ошибки. Предположим первое.

Нарушение прав доступа не имеет ничего общего с вашим значением дескриптора. Это означает, что вы обращаетесь к памяти, которая не принадлежит вашему процессу (например, путем разыменования нулевого указателя, неинициализированного указателя, не-указателя или уже освобожденного указателя). Ваша проблема в другом, возможно, в коде чтения или записи, который вы не указали здесь.

person Rob Kennedy    schedule 19.10.2010

Код в вашем вопросе не является оператором присваивания. Это выражение сравнения. Вы должны были получить предупреждение от компилятора о том, что значение переменной не определено. Если он всегда имеет значение 4008 после выполнения этого кода, вы должны проверить, было ли это значение также до выполнения этого кода. Возможно, CreateFile просто возвращает допустимое значение дескриптора, но вы не используете возвращаемое значение.

Если 4008 не является значением, возвращаемым CreateFile, то, вероятно, 4008 не является допустимым значением дескриптора. Если операционная система обрабатывает дескрипторы как указатели (или если она выполняет какое-то преобразование дескрипторов для генерации указателей), то может оказаться, что указатель, соответствующий этому «дескриптору», не является допустимым адресом в вашем процессе; это объяснило бы нарушение доступа.

person Rob Kennedy    schedule 26.10.2010
comment
Спасибо за новый ответ, Роб, я забыл поставить точку с запятой в вопросе выше, так что да. Это было присвоение. (Обновлено) Я отладил значение my_Handle перед Createfile, результат был 0. Кроме того, я заметил, что запущен компилятор без поддержки отладчика из IDE, значение дескриптора всегда равно 4000. У меня есть исходный код на C #, и я пытаюсь сделать его нативным. В исходном коде дескриптор всегда получает значение от 250 до 300 (по крайней мере, на моем компьютере). Исходный код: codeproject.com/KB/IP/sendrawpacket.aspx - person Ed.C; 26.10.2010
comment
@ Ed.C: значение дескриптора в значительной степени не имеет значения; важно то, к чему относится ручка. Если вы продолжаете получать одно и то же значение, это, вероятно, просто показатель того, что Delphi RTL согласован в его распределении дескрипторов; изменчивость в .NET, казалось бы, указывает на какой-то недетерминизм или что-то в этом роде ... - person SamB; 29.04.2011