| 
							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; .... 
						 |