[PL] FAQ: otwarcie urządzenia (device), Windows (last update: 2012-12-15, created: 2012-12-15) back to the list ↑
[FAQ - pytania (które dostaje via e-mail/IRC/jabber/etc, oraz na które natrafiam na forach) + moje odpowiedzi]

Topic z forum uw-team.org - autor ładuje sterownik, który tworzy nowy device o nazwie \Device\Kropki112, a następnie z user mode próbuje go otworzyć korzystająć z CreateFile, co kończy się błędem ERROR_BAD_NETPATH.
Moja odpowiedź poniżej:

Hey,

Musisz albo w DriverEntry stworzyć symbolic link do \DosDevices\Nazwa używając IoCreateSymbolicLink.
Albo korzystać z NtCreateFile zamiast z CreateFile.

Sam CreateFile nie umie odwołać się do \Device\Nazwa.

Prawdę mówiąc stworzenie symbilic linku jest prostsze i zajmuje mniej kodu.

  UNICODE_STRING usDosDeviceName, usDriverName;
  RtlInitUnicodeString(&usDosDeviceName, L"\\DosDevices\\Nazwa");
  // usDriverName musi zawierac nazwe Device; to to co podajesz do IoCreateDevice
  IoCreateSymbolicLink(&usDosDeviceName, &usDriverName);

Po zrobieniu tego aliasu używasz ścieżki "\\\\.\\Nazwa" w CreateFile (czyli, bez escapeujących backslashów \\.\Nazwa).

Sposób z NtCreateFile wygląda mniej więcej tak. EDIT Miałem chwilę, więc przepisałem "na czysto" swój stary kod korzystający z NtCreateFile:
http://gynvael.coldwind.pl/n/device_open_win32

(Należy zaznaczyć, że problem był jeszcze jeden, o czym napisał autor topicu w kolejnym poście - brakowało obsługi IRP_MJ_CREATE & co.)
【 design & art by Xa / Gynvael Coldwind 】 【 logo font (birdman regular) by utopiafonts / Dale Harris 】