спасибо за помощь. в общем решил я всетаки не мудрить и сделать правильную выгрузку драйвера. драйвер есть - нужные девайсы не работают. выгрузил - работают.
в общем как ситуация обстоит сейчас=) :
получаю поинтер на девайс beep (RtlInitUnicodeString(&usFatDriverObj[4], L"\\Device\\Beep")
ntStatus = IoGetDeviceObjectPointer(
&usFatDriverObj[4], //ObjectName
//FILE_READ_DATA, //DesiredAccess
FILE_READ_ATTRIBUTES,
OUT &lpFileObject[4], //FileObject
OUT &lpDeviceObject[4]); //DeviceObject
присоединяю свой драйвер к этому устройству:
IoAttachDeviceToDeviceStack ( IN deviceObject, IN lpDeviceObject[4]);
все хорошо, все работает. теперь выгружаю драйвер:
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING deviceLinkUnicodeString;
PDEVICE_EXTENSION extension;
PIRP pNewIrp = NULL;
ULONG m_size;
NTSTATUS ntStatus;
extension = DriverObject->DeviceObject->DeviceExtension;
//=================================== !!!!!!!!
IoDetachDevice(IN OUT lpDeviceObject[4]);
ObDereferenceObject(IN lpDeviceObject[4]);
//=====================================!!!!!!!!!!!!!
// Create counted string version of our Win32 device name.
RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
// Delete the link from our device name to a name in the Win32 namespace.
IoDeleteSymbolicLink(&deviceLinkUnicodeString);
// Finally delete our device object
IoDeleteDevice(DriverObject->DeviceObject);
}
и вот что странно.
1 раз загружаю драйвер. все хорошо бибикалка не работает.
1 раз выгружаю - работает.
2 раз загружаю - не работает.
2 раз выгружаю.
вроде бы все хорошо, но вот когда запускаю бибикалку или пытаюсь посмотреть дерево в devicetree.exe - синяя смерть. почему ? ведь один цикл загрузки-выгрузки-загрузки прощел успешно. не понимаю.
спасибо!