⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpnp.cod

📁 usb开发的资料!!USB标准
💻 COD
📖 第 1 页 / 共 5 页
字号:
	TITLE	C:\98DDK\src\usb\TEST98\SYS\testpnp.c
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
;	COMDAT _Test98_AddDevice@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_PnP@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_FDO_PnP@16
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_FDO_PnPComplete@12
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_PnPRemove@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_StartFdo@12
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_Remove@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_Power@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_FDO_Power@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _Test98_PowerComplete@12
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC	_Test98_AddDevice@8
EXTRN	__imp__IoCreateSymbolicLink@8:NEAR
EXTRN	__imp__KeInitializeEvent@12:NEAR
EXTRN	__imp__IoRegisterDeviceInterface@16:NEAR
EXTRN	__imp__KeInitializeSpinLock@4:NEAR
EXTRN	__imp__IoSetDeviceInterfaceState@8:NEAR
EXTRN	_GUID_TEST_DEVICE:BYTE
EXTRN	__imp__RtlInitUnicodeString@8:NEAR
EXTRN	__imp__IoAttachDeviceToDeviceStack@8:NEAR
EXTRN	__imp__IoCreateDevice@28:NEAR
;	COMDAT _Test98_AddDevice@8
_TEXT	SEGMENT
$SG2792	DB	'\', 00H, 'D', 00H, 'e', 00H, 'v', 00H, 'i', 00H, 'c', 00H
	DB	'e', 00H, '\', 00H, 'T', 00H, 'e', 00H, 's', 00H, 't', 00H, '-'
	DB	00H, '0', 00H, 00H, 00H
	ORG $+2
$SG2794	DB	'\', 00H, 'D', 00H, 'o', 00H, 's', 00H, 'D', 00H, 'e', 00H
	DB	'v', 00H, 'i', 00H, 'c', 00H, 'e', 00H, 's', 00H, '\', 00H, 'T'
	DB	00H, 'e', 00H, 's', 00H, 't', 00H, '-', 00H, '0', 00H, 00H, 00H
_DriverObject$ = 8
_PhysicalDeviceObject$ = 12
_status$ = -112
_deviceObject$ = -60
_deviceData$ = -116
_pdoUniName$ = -56
_pdoName$ = -100
_DeviceLinkBuffer$ = -48
_DeviceLinkUnicodeString$ = -68
_Test98_AddDevice@8 PROC NEAR				; COMDAT

; 37   : {

  00046	55		push	ebp
  00047	8b ec		mov	ebp, esp
  00049	83 ec 78	sub	esp, 120		; 00000078H
  0004c	53		push	ebx
  0004d	56		push	esi
  0004e	57		push	edi

; 38   :     NTSTATUS            status;
; 39   :     PDEVICE_OBJECT      deviceObject;
; 40   :     PFDO_DEVICE_DATA    deviceData;
; 41   :     UNICODE_STRING      deviceNameUni;
; 42   :     PWCHAR              deviceName;
; 43   :     ULONG               nameLength;
; 44   : 
; 45   :     UNICODE_STRING      pdoUniName;
; 46   :     WCHAR               pdoName[] = L"\\Device\\Test-0" ;  // DeviceNameBuffer

  0004f	be 00 00 00 00	mov	esi, OFFSET FLAT:$SG2792
  00054	8d 7d 9c	lea	edi, DWORD PTR _pdoName$[ebp]
  00057	b9 07 00 00 00	mov	ecx, 7
  0005c	f3 a5		rep	movsd
  0005e	66 a5		movsw

; 47   :     
; 48   :     WCHAR DeviceLinkBuffer[] = L"\\DosDevices\\Test-0";

  00060	be 00 00 00 00	mov	esi, OFFSET FLAT:$SG2794
  00065	8d 7d d0	lea	edi, DWORD PTR _DeviceLinkBuffer$[ebp]
  00068	b9 09 00 00 00	mov	ecx, 9
  0006d	f3 a5		rep	movsd
  0006f	66 a5		movsw

; 49   :     UNICODE_STRING  DeviceLinkUnicodeString;   
; 50   : 
; 51   :     RtlInitUnicodeString (&pdoUniName, pdoName);

  00071	8d 45 9c	lea	eax, DWORD PTR _pdoName$[ebp]
  00074	50		push	eax
  00075	8d 45 c8	lea	eax, DWORD PTR _pdoUniName$[ebp]
  00078	50		push	eax
  00079	ff 15 00 00 00
	00		call	DWORD PTR __imp__RtlInitUnicodeString@8

; 52   :         
; 53   :     status = IoCreateDevice (
; 54   :                     DriverObject,  // our driver object
; 55   :                     sizeof (FDO_DEVICE_DATA), // device object extension size
; 56   :                     
; 57   :                     &pdoUniName,  
; 58   :                     
; 59   :                     FILE_DEVICE_UNKNOWN,   
; 60   :                     0,          // No special characteristics
; 61   :                     FALSE,      
; 62   :                     &deviceObject); // The device object created

  0007f	8d 45 c4	lea	eax, DWORD PTR _deviceObject$[ebp]
  00082	50		push	eax
  00083	6a 00		push	0
  00085	6a 00		push	0
  00087	6a 22		push	34			; 00000022H
  00089	8d 45 c8	lea	eax, DWORD PTR _pdoUniName$[ebp]
  0008c	50		push	eax
  0008d	6a 70		push	112			; 00000070H
  0008f	8b 45 08	mov	eax, DWORD PTR _DriverObject$[ebp]
  00092	50		push	eax
  00093	ff 15 00 00 00
	00		call	DWORD PTR __imp__IoCreateDevice@28
  00099	89 45 90	mov	DWORD PTR _status$[ebp], eax

; 63   : 
; 64   :     if (NT_SUCCESS (status)) {

  0009c	83 7d 90 00	cmp	DWORD PTR _status$[ebp], 0
  000a0	0f 8c f5 00 00
	00		jl	$L2796

; 65   : 
; 66   :         RtlInitUnicodeString (&DeviceLinkUnicodeString, 
; 67   :                                 DeviceLinkBuffer);

  000a6	8d 45 d0	lea	eax, DWORD PTR _DeviceLinkBuffer$[ebp]
  000a9	50		push	eax
  000aa	8d 45 bc	lea	eax, DWORD PTR _DeviceLinkUnicodeString$[ebp]
  000ad	50		push	eax
  000ae	ff 15 00 00 00
	00		call	DWORD PTR __imp__RtlInitUnicodeString@8

; 68   : 
; 69   :         status = IoCreateSymbolicLink(&DeviceLinkUnicodeString,
; 70   :                         &pdoUniName);                                

  000b4	8d 45 c8	lea	eax, DWORD PTR _pdoUniName$[ebp]
  000b7	50		push	eax
  000b8	8d 45 bc	lea	eax, DWORD PTR _DeviceLinkUnicodeString$[ebp]
  000bb	50		push	eax
  000bc	ff 15 00 00 00
	00		call	DWORD PTR __imp__IoCreateSymbolicLink@8
  000c2	89 45 90	mov	DWORD PTR _status$[ebp], eax

; 71   : 
; 72   :         deviceData = (PFDO_DEVICE_DATA) deviceObject->DeviceExtension;

  000c5	8b 45 c4	mov	eax, DWORD PTR _deviceObject$[ebp]
  000c8	8b 40 28	mov	eax, DWORD PTR [eax+40]
  000cb	89 45 8c	mov	DWORD PTR _deviceData$[ebp], eax

; 73   :         RtlFillMemory (deviceData, sizeof (FDO_DEVICE_DATA), 0);

  000ce	8b 7d 8c	mov	edi, DWORD PTR _deviceData$[ebp]
  000d1	33 c0		xor	eax, eax
  000d3	b9 1c 00 00 00	mov	ecx, 28			; 0000001cH
  000d8	f3 ab		rep	stosd

; 74   : 
; 75   :         deviceData->IsFDO = TRUE;

  000da	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  000dd	c6 40 07 01	mov	BYTE PTR [eax+7], 1

; 76   :         deviceData->DebugLevel = TEST_DEFAULT_DEBUG_OUTPUT_LEVEL;

  000e1	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  000e4	c7 40 08 88 cc
	cc cc		mov	DWORD PTR [eax+8], -858993528 ; cccccc88H

; 77   :         deviceData->Self = deviceObject;

  000eb	8b 45 c4	mov	eax, DWORD PTR _deviceObject$[ebp]
  000ee	8b 4d 8c	mov	ecx, DWORD PTR _deviceData$[ebp]
  000f1	89 01		mov	DWORD PTR [ecx], eax

; 78   :  
; 79   :         KeInitializeSpinLock (&deviceData->Spin);

  000f3	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  000f6	83 c0 14	add	eax, 20			; 00000014H
  000f9	50		push	eax
  000fa	ff 15 00 00 00
	00		call	DWORD PTR __imp__KeInitializeSpinLock@4

; 80   : 
; 81   :         deviceData->Removed = FALSE;

  00100	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  00103	c6 40 1b 00	mov	BYTE PTR [eax+27], 0

; 82   :         
; 83   :         InitializeListHead (&deviceData->PDOs);

  00107	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  0010a	83 c0 1c	add	eax, 28			; 0000001cH
  0010d	89 45 88	mov	DWORD PTR -120+[ebp], eax
  00110	8b 45 88	mov	eax, DWORD PTR -120+[ebp]
  00113	8b 4d 8c	mov	ecx, DWORD PTR _deviceData$[ebp]
  00116	89 41 20	mov	DWORD PTR [ecx+32], eax
  00119	8b 45 88	mov	eax, DWORD PTR -120+[ebp]
  0011c	8b 4d 8c	mov	ecx, DWORD PTR _deviceData$[ebp]
  0011f	89 41 1c	mov	DWORD PTR [ecx+28], eax

; 84   : 
; 85   :         // Set the PDO for use with PlugPlay functions
; 86   :         deviceData->UnderlyingPDO = PhysicalDeviceObject;

  00122	8b 45 0c	mov	eax, DWORD PTR _PhysicalDeviceObject$[ebp]
  00125	8b 4d 8c	mov	ecx, DWORD PTR _deviceData$[ebp]
  00128	89 41 28	mov	DWORD PTR [ecx+40], eax

; 87   : 
; 88   :         // Attach our driver to the device stack.
; 89   :         deviceData->TopOfStack = IoAttachDeviceToDeviceStack (
; 90   :                                         deviceObject,
; 91   :                                         PhysicalDeviceObject);

  0012b	8b 45 0c	mov	eax, DWORD PTR _PhysicalDeviceObject$[ebp]
  0012e	50		push	eax
  0012f	8b 45 c4	mov	eax, DWORD PTR _deviceObject$[ebp]
  00132	50		push	eax
  00133	ff 15 00 00 00
	00		call	DWORD PTR __imp__IoAttachDeviceToDeviceStack@8
  00139	8b 4d 8c	mov	ecx, DWORD PTR _deviceData$[ebp]
  0013c	89 41 2c	mov	DWORD PTR [ecx+44], eax

; 92   : 
; 93   :         // Bias outstanding request to 1 so that we can look for a
; 94   :         // transition to zero when processing the remove device PlugPlay IRP.
; 95   :         
; 96   :         deviceData->OutstandingIO = 1;

  0013f	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  00142	c7 40 40 01 00
	00 00		mov	DWORD PTR [eax+64], 1

; 97   : 
; 98   :         KeInitializeEvent(&deviceData->RemoveEvent,
; 99   :                           SynchronizationEvent,
; 100  :                           FALSE); // initialized to not signalled

  00149	6a 00		push	0
  0014b	6a 01		push	1
  0014d	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  00150	83 c0 44	add	eax, 68			; 00000044H
  00153	50		push	eax
  00154	ff 15 00 00 00
	00		call	DWORD PTR __imp__KeInitializeEvent@12

; 101  : 
; 102  :         deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

  0015a	8b 45 c4	mov	eax, DWORD PTR _deviceObject$[ebp]
  0015d	81 60 1c 7f ff
	ff ff		and	DWORD PTR [eax+28], -129 ; ffffff7fH

; 103  :         deviceObject->Flags |= DO_POWER_PAGABLE;

  00164	8b 45 c4	mov	eax, DWORD PTR _deviceObject$[ebp]
  00167	81 48 1c 00 20
	00 00		or	DWORD PTR [eax+28], 8192 ; 00002000H

; 104  : 
; 105  :         // register device functionality
; 106  :         status = IoRegisterDeviceInterface (
; 107  :                     PhysicalDeviceObject,
; 108  :                     (LPGUID) &GUID_TEST_DEVICE,
; 109  :                     NULL, // No ref string
; 110  :                     &deviceData->DevClassAssocName);

  0016e	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  00171	83 c0 54	add	eax, 84			; 00000054H
  00174	50		push	eax
  00175	6a 00		push	0
  00177	68 00 00 00 00	push	OFFSET FLAT:_GUID_TEST_DEVICE
  0017c	8b 45 0c	mov	eax, DWORD PTR _PhysicalDeviceObject$[ebp]
  0017f	50		push	eax
  00180	ff 15 00 00 00
	00		call	DWORD PTR __imp__IoRegisterDeviceInterface@16
  00186	89 45 90	mov	DWORD PTR _status$[ebp], eax

; 111  : 
; 112  :         status = IoSetDeviceInterfaceState (
; 113  :                         &deviceData->DevClassAssocName,
; 114  :                         TRUE);

  00189	6a 01		push	1
  0018b	8b 45 8c	mov	eax, DWORD PTR _deviceData$[ebp]
  0018e	83 c0 54	add	eax, 84			; 00000054H
  00191	50		push	eax
  00192	ff 15 00 00 00
	00		call	DWORD PTR __imp__IoSetDeviceInterfaceState@8
  00198	89 45 90	mov	DWORD PTR _status$[ebp], eax
$L2796:

; 115  : 
; 116  :         }
; 117  : 
; 118  : return status;

  0019b	8b 45 90	mov	eax, DWORD PTR _status$[ebp]
  0019e	e9 00 00 00 00	jmp	$L2783
$L2783:

; 119  : 
; 120  : }

  001a3	5f		pop	edi
  001a4	5e		pop	esi
  001a5	5b		pop	ebx
  001a6	c9		leave
  001a7	c2 08 00	ret	8
_Test98_AddDevice@8 ENDP
_TEXT	ENDS
PUBLIC	_Test98_PnP@8
PUBLIC	_Test98_FDO_PnP@16
;	COMDAT _Test98_PnP@8
_TEXT	SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_irpStack$ = -16
_status$ = -12
_commonData$ = -4
_Test98_PnP@8 PROC NEAR					; COMDAT

; 141  : {

  00000	55		push	ebp
  00001	8b ec		mov	ebp, esp
  00003	83 ec 10	sub	esp, 16			; 00000010H
  00006	53		push	ebx
  00007	56		push	esi
  00008	57		push	edi

; 142  :     PIO_STACK_LOCATION      irpStack;
; 143  :     NTSTATUS                status;
; 144  :     PCOMMON_DEVICE_DATA     commonData;
; 145  :     KIRQL                   oldIrq;
; 146  : 
; 147  :     PAGED_CODE ();
; 148  : 
; 149  :     status = STATUS_SUCCESS;

  00009	c7 45 f4 00 00
	00 00		mov	DWORD PTR _status$[ebp], 0

; 150  :     irpStack = IoGetCurrentIrpStackLocation (Irp);

  00010	8b 45 0c	mov	eax, DWORD PTR _Irp$[ebp]
  00013	8b 40 60	mov	eax, DWORD PTR [eax+96]
  00016	89 45 f0	mov	DWORD PTR _irpStack$[ebp], eax

; 151  :     ASSERT (IRP_MJ_PNP == irpStack->MajorFunction);
; 152  : 
; 153  :     commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension;

  00019	8b 45 08	mov	eax, DWORD PTR _DeviceObject$[ebp]
  0001c	8b 40 28	mov	eax, DWORD PTR [eax+40]
  0001f	89 45 fc	mov	DWORD PTR _commonData$[ebp], eax

; 154  : 
; 155  :     
; 156  :     status = Test98_FDO_PnP (
; 157  :                     DeviceObject,
; 158  :                     Irp,
; 159  :                     irpStack,
; 160  :                     (PFDO_DEVICE_DATA) commonData);

  00022	8b 45 fc	mov	eax, DWORD PTR _commonData$[ebp]
  00025	50		push	eax
  00026	8b 45 f0	mov	eax, DWORD PTR _irpStack$[ebp]
  00029	50		push	eax
  0002a	8b 45 0c	mov	eax, DWORD PTR _Irp$[ebp]
  0002d	50		push	eax
  0002e	8b 45 08	mov	eax, DWORD PTR _DeviceObject$[ebp]
  00031	50		push	eax
  00032	e8 00 00 00 00	call	_Test98_FDO_PnP@16
  00037	89 45 f4	mov	DWORD PTR _status$[ebp], eax

; 161  :     
; 162  :     return status;

  0003a	8b 45 f4	mov	eax, DWORD PTR _status$[ebp]
  0003d	e9 00 00 00 00	jmp	$L2803
$L2803:

; 163  : 
; 164  : }

  00042	5f		pop	edi
  00043	5e		pop	esi
  00044	5b		pop	ebx
  00045	c9		leave

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -