CreateFile не возвращает правильный дескриптор - устройства в Delphi - PullRequest
0 голосов
/ 20 октября 2010

Надеемся найти кого-то, кто имеет опыт работы со службами в 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

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

Ответы [ 2 ]

8 голосов
/ 20 октября 2010

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

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

2 голосов
/ 26 октября 2010

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

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

...