-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


Windows USB-

, 14 2017 . 10:26 +
, . , . , , , - , , . , , . USB-, . .. .

. - , , , . , .

, , .

USBLock git : https://github.com/anatolymik/samples.git.

DRIVER_OBJECT


DRIVER_OBJECT. , . , MajorFunction. , . , , , , . .
for ( ULONG i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ ) {
	DriverObject->MajorFunction[i] = DispatchCommon;
}
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchWrite;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
DriverObject->DriverUnload = DriverUnload;
DriverObject->DriverExtension->AddDevice = DispatchAddDevice; 

, .
NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath ); 

, MajorFunction . , . , , , . , . , .

DriverUnload , , . , .

, DriverExtension->AddDevice , , , . , .

: https://msdn.microsoft.com/en-us/library/windows/hardware/ff544174(v=vs.85).aspx.

DEVICE_OBJECT


DEVICE_OBJECT . .. , , , . , . , , . , - , . , , .
NTSTATUS Dispatch( PDEVICE_OBJECT DeviceObject, PIRP Irp ); 

MajorFunction DRIVER_OBJECT .

DEVICE_OBJECT IoCreateDevice. , - DEVICE_OBJECT, . , , IRP-. , , . IoCallDriver , .

DEVICE_OBJECT . , DEVICE_OBJECT .

DEVICE_OBJECT : https://msdn.microsoft.com/en-us/library/windows/hardware/ff543147(v=vs.85).aspx. IRP : https://msdn.microsoft.com/en-us/library/windows/hardware/ff550694(v=vs.85).aspx.


, , DEVICE_OBJECT. , DEVICE_OBJECT DEVICE_OBJECT, . IoAttachDeviceToDeviceStack. DEVICE_OBJECT, DEVICE_OBJECT, , .


. DEVICE_OBJECT, , , DEVICE_OBJECT. DEVICE_OBJECT , .. .

, . , , FAT, Windows, .

PnP


PnP . , , , , , .

, DEVICE_OBJECT. DEVICE_OBJECT Physical Device Object PDO. IoInvalidateDeviceRelations PnP , . PnP minor IRP_MN_QUERY_DEVICE_RELATIONS . PDO. .


, USB-. DEVICE_OBJECT .

PnP PDO, . , minor IRP_MN_QUERY_ID. PnP , , . PnP . .

, , PnP DevNode, . PnP , .

PnP . , PnP . , , PnP . , DriverExtension->AddDevice DRIVER_OBJECT , , . .
NTSTATUS DispatchAddDevice( 
	PDRIVER_OBJECT DriverObject, 
	PDEVICE_OBJECT PhysicalDeviceObject 
); 

.. , PnP , , , PDO. .

DEVICE_OBJECT PDO. DEVICE_OBJECT Functional Device Object FDO. FDO . , PnP , .


, . , , PnP AddDevice . .. : , , . DEVICE_OBJECT, PDO AddDevice. .

. PnP minor IRP_MN_START_DEVICE. . , . , , . , .

, , , IoInvalidateDeviceRelations PnP , . PDO. minor IRP_MN_QUERY_DEVICE_RELATIONS PDO . PnP , . PDO , PnP minor IRP_MN_REMOVE_DEVICE. , , .

WDM : https://msdn.microsoft.com/en-us/library/windows/hardware/ff548158(v=vs.85).aspx.


USB-. : https://msdn.microsoft.com/en-us/library/windows/hardware/ff553419(v=vs.85).aspx. USB GUID 36fc9e60-c465-11cf-8056-444553540000. MSDN, USB . , , , flash-. . AddDevice .
NTSTATUS UsbCreateAndAttachFilter( 
	PDEVICE_OBJECT PhysicalDeviceObject, 
	bool UpperFilter 
) {

	SUSBDevice*		USBDevice;
	PDEVICE_OBJECT		USBDeviceObject = nullptr;

	ULONG			Flags;

	NTSTATUS		Status = STATUS_SUCCESS;

	PAGED_CODE();

	for ( ;; ) {

		//     ,     
		if ( !UpperFilter ) {
			USBDeviceObject = PhysicalDeviceObject;
			while ( USBDeviceObject->AttachedDevice ) {
				if ( USBDeviceObject->DriverObject == g_DriverObject ) {
					return STATUS_SUCCESS;
				}
				USBDeviceObject = USBDeviceObject->AttachedDevice;
			}
		}

		//  
		Status = IoCreateDevice(
			g_DriverObject,
			sizeof( SUSBDevice ),
			nullptr,
			PhysicalDeviceObject->DeviceType,
			PhysicalDeviceObject->Characteristics,
			false,
			&USBDeviceObject
		);
		if ( !NT_SUCCESS( Status ) ) {
			break;
		}

		//    ,      
		//  
		Flags = PhysicalDeviceObject->Flags & 
		 (DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE);
		USBDeviceObject->Flags |= Flags;

		//     
		USBDevice = (SUSBDevice*)USBDeviceObject->DeviceExtension;

		//  
		USBDevice->DeleteDevice = DetachAndDeleteDevice;

		//  
		for ( ULONG i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ ) {
			USBDevice->MajorFunction[i] = UsbDispatchCommon;
		}
		USBDevice->MajorFunction[IRP_MJ_PNP] = UsbDispatchPnp;
		USBDevice->MajorFunction[IRP_MJ_POWER] = UsbDispatchPower;

		//    
		IoInitializeRemoveLock( 
			&USBDevice->Lock, 
			USBDEVICE_REMOVE_LOCK_TAG, 
			0, 
			0 
		);

		//  
		USBDevice->SelfDevice = USBDeviceObject;
		USBDevice->BaseDevice = PhysicalDeviceObject;
		USBDevice->UpperFilter = UpperFilter;

		//  paging 
		USBDevice->PagingCount = 0;
		KeInitializeEvent( &USBDevice->PagingLock, SynchronizationEvent, true );

		//    PDO
		USBDevice->LowerDevice = IoAttachDeviceToDeviceStack( 
			USBDeviceObject, 
			PhysicalDeviceObject 
		);
		if ( !USBDevice->LowerDevice ) {
			Status = STATUS_NO_SUCH_DEVICE;
			break;
		}

		break;

	}

	//     

	if ( !NT_SUCCESS( Status ) ) {

		// 

		if ( USBDeviceObject ) {
			IoDeleteDevice( USBDeviceObject );
		}

	} else {

		//    
		USBDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

	}

	return Status;

}

static NTSTATUS DispatchAddDevice( 
	PDRIVER_OBJECT DriverObject, 
	PDEVICE_OBJECT PhysicalDeviceObject 
) {

	UNREFERENCED_PARAMETER( DriverObject );

	return UsbCreateAndAttachFilter( PhysicalDeviceObject, true );

}

, DEVICE_OBJECT PDO. , , USB-.

minor IRP_MN_START_DEVICE. .
static NTSTATUS UsbDispatchPnpStartDevice( SUSBDevice* USBDevice, PIRP Irp ) {

	bool		HubOrComposite;
	NTSTATUS	Status;

	PAGED_CODE();

	for ( ;; ) {

		// ,    ,  
		//   ,      
		Status = UsbIsDeviceAllowedToWork( &HubOrComposite, USBDevice );
		if ( !NT_SUCCESS( Status ) ) {
			break;
		}
		USBDevice->HubOrComposite = HubOrComposite;

		//  
		Status = ForwardIrpSynchronously( USBDevice->LowerDevice, Irp );
		if ( !NT_SUCCESS( Status ) ) {
			break;
		}

		break;

	}

	//  
	Irp->IoStatus.Status = Status;
	IoCompleteRequest( Irp, IO_NO_INCREMENT );

	//   
	IoReleaseRemoveLock( &USBDevice->Lock, Irp );

	return Status;

}

, UsbIsDeviceAllowedToWork. , , . , . , . , . , .

: , . , , , , , . , . .. , , , . .

.


. , . , . , . , , . , . .
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330844/

:  

: [1] []
 

:
: 

: ( )

:

  URL