Ochkarik
|
|
« Ответ #1 : 14-11-2006 13:01 » |
|
драйвер должен предоставить интерфейс (DeviceIOControl или Create/Read/Write) и ссылку на себя. ссылка простейшим образом делается при помощи IoCreateSymbolicLink.
#define PCI_DEVICE_NAME L"\\Device\\XXXX_00" //имя физического устройства (device) #define DOS_DEVICE_NAME L"\\DosDevices\\XXXX"//имя драйвера (driver)
NTSTATUS AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject) { NTSTATUS status; PDEVICE_OBJECT DeviceObject; PDEVICE_EXTENSION_MY devExt;
//как поступать с этими переменными я не в курсе, //по уму то их вроде удалить надоть, когда они не нужны... UNICODE_STRING uniNtDeviceName; //обратить особое внимание !!!* UNICODE_STRING uniWin32NameString; //обратить особое внимание !!!*
PAGED_CODE();
KdPrint( (" AddDevice\n")); SOFT_ICE_DEBUG1; //SOFT_ICE_DEBUG1; //+здесь стоит нумеровать девайсы? //я не размещал память для UNICODE_STRING, и соответственно не удалял ее... //но вроде функция RtlInitUnicodeString - сама инициализирует указатель uniNtDeviceName.Buffer адресом строки //а uniNtDeviceName.MaximumLength длинной uniNtDeviceName
RtlInitUnicodeString(&uniNtDeviceName,PCI_DEVICE_NAME); //судя по примерам из 2000DDK, эта ссылка удаляется ядром status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION_MY), &uniNtDeviceName, //имя FILE_DEVICE_UNKNOWN, //тип 0, //FILE_AUTOGENERATED_DEVICE_NAME, //характеристики FALSE, //эксклюзивность процесса(толкьо один handle) &DeviceObject); if (!NT_SUCCESS(status)) { return status; }; ASSERT(DeviceObject != NULL); g_XXX.InstanceCount++; RtlInitUnicodeString(&uniWin32NameString, DOS_DEVICE_NAME); status = IoCreateSymbolicLink(&uniWin32NameString,&uniNtDeviceName); if (status != STATUS_SUCCESS) { //не получается открыть символическую ссылку для имен WIN32 IoDeleteDevice(DeviceObject); return status; };
devExt = (DEVICE_EXTENSION_MY*)DeviceObject->DeviceExtension; ....
|