📄 testpnp.cod
字号:
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 + -