📄 pnp.cod
字号:
EXTRN __imp__IoInitializeRemoveLockEx@20:NEAR
EXTRN __imp__ExAllocatePoolWithTag@12:NEAR
EXTRN __imp__IoAttachDeviceToDeviceStack@8:NEAR
EXTRN __imp__IoCreateDevice@28:NEAR
EXTRN __imp__IoCreateSymbolicLink@8:NEAR
; COMDAT _RamDiskAddDevice@8
_TEXT SEGMENT
$SG14408 DB '\', 00H, 'D', 00H, 'e', 00H, 'v', 00H, 'i', 00H, 'c', 00H
DB 'e', 00H, '\', 00H, 'R', 00H, 'a', 00H, 'm', 00H, 'd', 00H, 'i'
DB 00H, 's', 00H, 'k', 00H, 00H, 00H
$SG14431 DB '\', 00H, 'D', 00H, 'o', 00H, 's', 00H, 'D', 00H, 'e', 00H
DB 'v', 00H, 'i', 00H, 'c', 00H, 'e', 00H, 's', 00H, '\', 00H, 00H
DB 00H
; Function compile flags: /Ogsy
_uniDeviceName$ = -24
_uniWin32Name$ = -16
_driverExtension$ = -8
_functionDeviceObject$ = -4
_DriverObject$ = 8
_PhysicalDeviceObject$ = 12
_RamDiskAddDevice@8 PROC NEAR ; COMDAT
; 60 : {
0003a 55 push ebp
0003b 8b ec mov ebp, esp
0003d 83 ec 18 sub esp, 24 ; 00000018H
; 61 :
; 62 : PRAMDISK_DRIVER_EXTENSION driverExtension;
; 63 : PDEVICE_OBJECT functionDeviceObject;
; 64 : PDEVICE_EXTENSION devExt;
; 65 : UNICODE_STRING uniDeviceName;
; 66 : UNICODE_STRING uniWin32Name;
; 67 : NTSTATUS status = STATUS_SUCCESS;
; 68 :
; 69 : PAGED_CODE();
; 70 :
; 71 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_VERBOSE, ("AddDevice - IN. DriverObject=(%p) Pdo=(%p) \n",
; 72 : DriverObject, PhysicalDeviceObject ) );
; 73 :
; 74 : // Get the Driver object extension
; 75 :
; 76 : driverExtension = IoGetDriverObjectExtension(DriverObject,
; 77 : RAMDISK_DRIVER_EXTENSION_KEY);
00040 68 00 00 00 00 push OFFSET FLAT:_DriverEntry@8
00045 ff 75 08 push DWORD PTR _DriverObject$[ebp]
00048 ff 15 00 00 00
00 call DWORD PTR __imp__IoGetDriverObjectExtension@8
; 78 :
; 79 : ASSERT ( driverExtension != NULL );
; 80 :
; 81 : //
; 82 : // We are capable of handling only one device. If the we get AddDevice request
; 83 : // for the next device, reject it
; 84 : //
; 85 :
; 86 : if ( driverExtension->DeviceInitialized == TRUE ) {
0004e 83 78 08 01 cmp DWORD PTR [eax+8], 1
00052 89 45 f8 mov DWORD PTR _driverExtension$[ebp], eax
00055 75 0a jne SHORT $L14405
; 87 :
; 88 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Device exists\n") );
; 89 : return STATUS_DEVICE_ALREADY_ATTACHED;
00057 b8 38 00 00 c0 mov eax, -1073741768 ; c0000038H
0005c e9 56 01 00 00 jmp $L14394
$L14405:
; 90 : }
; 91 :
; 92 : //
; 93 : // Create counted string version of our device name.
; 94 : //
; 95 :
; 96 : RtlInitUnicodeString( &uniDeviceName, NT_DEVICE_NAME );
00061 68 00 00 00 00 push OFFSET FLAT:$SG14408
00066 8d 45 e8 lea eax, DWORD PTR _uniDeviceName$[ebp]
00069 50 push eax
0006a ff 15 00 00 00
00 call DWORD PTR __imp__RtlInitUnicodeString@8
; 97 :
; 98 : //
; 99 : // Create the device object
; 100 : //
; 101 : status = IoCreateDevice(
; 102 : DriverObject,
; 103 : sizeof(DEVICE_EXTENSION),
; 104 : &uniDeviceName,
; 105 : FILE_DEVICE_DISK , // old value = FILE_DEVICE_VIRTUAL_DISK , // corrected proposed by MS
; 106 : (FILE_DEVICE_SECURE_OPEN),
; 107 : FALSE, // This isn't an exclusive device
; 108 : &functionDeviceObject
; 109 : );
00070 8d 45 fc lea eax, DWORD PTR _functionDeviceObject$[ebp]
00073 50 push eax
00074 6a 00 push 0
00076 68 00 01 00 00 push 256 ; 00000100H
0007b 6a 07 push 7
0007d 8d 45 e8 lea eax, DWORD PTR _uniDeviceName$[ebp]
00080 50 push eax
00081 6a 68 push 104 ; 00000068H
00083 ff 75 08 push DWORD PTR _DriverObject$[ebp]
00086 ff 15 00 00 00
00 call DWORD PTR __imp__IoCreateDevice@28
; 110 :
; 111 : if (!NT_SUCCESS(status)) {
0008c 85 c0 test eax, eax
; 112 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoCreateDevice error: 0x%x\n", status) );
; 113 : return status;
0008e 0f 8c 23 01 00
00 jl $L14394
; 114 : }
; 115 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("FDO created successfully (%p)\n",
; 116 : functionDeviceObject) );
; 117 : devExt = functionDeviceObject->DeviceExtension;
00094 8b 45 fc mov eax, DWORD PTR _functionDeviceObject$[ebp]
00097 53 push ebx
00098 56 push esi
00099 8b 70 28 mov esi, DWORD PTR [eax+40]
0009c 57 push edi
; 118 :
; 119 : RtlZeroMemory( devExt, sizeof(DEVICE_EXTENSION) );
0009d 6a 1a push 26 ; 0000001aH
0009f 59 pop ecx
; 120 :
; 121 : // Allocate buffer for storing the drive letter
; 122 :
; 123 : devExt->DiskRegInfo.DriveLetter.Buffer = ExAllocatePoolWithTag(
; 124 : PagedPool,
; 125 : DRIVE_LETTER_LENGTH,
; 126 : RAMDISK_TAG_GENERAL);
000a0 68 52 61 6d 31 push 829251922 ; 316d6152H
000a5 33 c0 xor eax, eax
000a7 8b fe mov edi, esi
000a9 6a 14 push 20 ; 00000014H
000ab f3 ab rep stosd
000ad 8b 3d 00 00 00
00 mov edi, DWORD PTR __imp__ExAllocatePoolWithTag@12
000b3 6a 01 push 1
000b5 ff d7 call edi
; 127 : if ( devExt->DiskRegInfo.DriveLetter.Buffer == NULL ) {
000b7 85 c0 test eax, eax
000b9 89 46 58 mov DWORD PTR [esi+88], eax
000bc 75 0a jne SHORT $L14417
$L14707:
000be bf 9a 00 00 c0 mov edi, -1073741670 ; c000009aH
000c3 e9 d3 00 00 00 jmp $L14702
$L14417:
; 128 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for drive letter\n") );
; 129 : RamDiskCleanUp( functionDeviceObject );
; 130 : return STATUS_INSUFFICIENT_RESOURCES;
; 131 : }
; 132 : devExt->DiskRegInfo.DriveLetter.MaximumLength = DRIVE_LETTER_LENGTH;
; 133 :
; 134 : //
; 135 : // Get the disk parameters from the registry
; 136 : //
; 137 :
; 138 : RamDiskQueryDiskRegParameters( &driverExtension->RegistryPath, &devExt->DiskRegInfo );
000c8 8d 5e 48 lea ebx, DWORD PTR [esi+72]
000cb 53 push ebx
000cc ff 75 f8 push DWORD PTR _driverExtension$[ebp]
000cf 66 c7 46 56 14
00 mov WORD PTR [esi+86], 20 ; 00000014H
000d5 e8 00 00 00 00 call _RamDiskQueryDiskRegParameters@8
; 139 :
; 140 : devExt->PhysicalDeviceObject = PhysicalDeviceObject; // Save PDO pointer
000da 8b 45 0c mov eax, DWORD PTR _PhysicalDeviceObject$[ebp]
; 141 : devExt->DeviceObject = functionDeviceObject; // Save device object pointer
; 142 : devExt->DevState = STOPPED; // Device starts in Stopped state
; 143 : IoInitializeRemoveLock ( &devExt->RemoveLock,
; 144 : REMLOCK_TAG,
; 145 : REMLOCK_MAXIMUM,
; 146 : REMLOCK_HIGHWATER);
000dd 6a 18 push 24 ; 00000018H
000df 6a 0a push 10 ; 0000000aH
000e1 89 46 08 mov DWORD PTR [esi+8], eax
000e4 8b 45 fc mov eax, DWORD PTR _functionDeviceObject$[ebp]
000e7 83 66 0c 00 and DWORD PTR [esi+12], 0
000eb 6a 01 push 1
000ed 89 06 mov DWORD PTR [esi], eax
000ef 68 52 61 6d 6c push 1819107666 ; 6c6d6152H
000f4 8d 46 10 lea eax, DWORD PTR [esi+16]
000f7 50 push eax
000f8 ff 15 00 00 00
00 call DWORD PTR __imp__IoInitializeRemoveLockEx@20
; 147 :
; 148 : // Set device flags
; 149 :
; 150 : functionDeviceObject->Flags |= DO_POWER_PAGABLE;
000fe 8b 45 fc mov eax, DWORD PTR _functionDeviceObject$[ebp]
00101 80 48 1d 20 or BYTE PTR [eax+29], 32 ; 00000020H
; 151 : functionDeviceObject->Flags |= DO_DIRECT_IO;
00105 8b 45 fc mov eax, DWORD PTR _functionDeviceObject$[ebp]
00108 83 48 1c 10 or DWORD PTR [eax+28], 16 ; 00000010H
; 152 :
; 153 : //
; 154 : // Allocate the memory for disk image.
; 155 : //
; 156 :
; 157 : devExt->DiskImage = ExAllocatePoolWithTag(
; 158 : NonPagedPool,
; 159 : devExt->DiskRegInfo.DiskSize,
; 160 : RAMDISK_TAG_DISK);
0010c 68 52 61 6d 32 push 846029138 ; 326d6152H
00111 ff 33 push DWORD PTR [ebx]
00113 6a 00 push 0
00115 ff d7 call edi
; 161 :
; 162 : if ( devExt->DiskImage == NULL )
00117 85 c0 test eax, eax
00119 89 46 2c mov DWORD PTR [esi+44], eax
0011c 74 a0 je SHORT $L14707
; 163 : {
; 164 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for disk image\n") );
; 165 : RamDiskCleanUp( functionDeviceObject );
; 166 : return STATUS_INSUFFICIENT_RESOURCES;
; 167 : }
; 168 :
; 169 : // Format the disk
; 170 :
; 171 : RamDiskFormatDisk( functionDeviceObject );
0011e ff 75 fc push DWORD PTR _functionDeviceObject$[ebp]
00121 e8 00 00 00 00 call _RamDiskFormatDisk@4
; 172 :
; 173 : // Create symbolic link, which is the drive letter for the ramdisk
; 174 :
; 175 : devExt->SymbolicLink.Buffer = ExAllocatePoolWithTag(
; 176 : PagedPool,
; 177 : DOS_DEVNAME_LENGTH,
; 178 : RAMDISK_TAG_GENERAL);
00126 68 52 61 6d 31 push 829251922 ; 316d6152H
0012b 33 db xor ebx, ebx
0012d 6a 2e push 46 ; 0000002eH
0012f 43 inc ebx
00130 53 push ebx
00131 ff d7 call edi
; 179 :
; 180 : if ( devExt->SymbolicLink.Buffer == NULL ) {
00133 85 c0 test eax, eax
00135 89 46 60 mov DWORD PTR [esi+96], eax
00138 74 84 je SHORT $L14707
; 181 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("Can't allocate memory for symbolic link\n") );
; 182 : RamDiskCleanUp( functionDeviceObject );
; 183 : return STATUS_INSUFFICIENT_RESOURCES;
; 184 : }
; 185 : RtlInitUnicodeString( &uniWin32Name, DOS_DEVICE_NAME );
0013a 68 00 00 00 00 push OFFSET FLAT:$SG14431
0013f 8d 45 f0 lea eax, DWORD PTR _uniWin32Name$[ebp]
00142 50 push eax
00143 ff 15 00 00 00
00 call DWORD PTR __imp__RtlInitUnicodeString@8
; 186 :
; 187 : devExt->SymbolicLink.MaximumLength = DOS_DEVNAME_LENGTH;
00149 66 c7 46 5e 2e
00 mov WORD PTR [esi+94], 46 ; 0000002eH
; 188 : devExt->SymbolicLink.Length = uniWin32Name.Length;
0014f 66 8b 45 f0 mov ax, WORD PTR _uniWin32Name$[ebp]
00153 8d 7e 5c lea edi, DWORD PTR [esi+92]
00156 66 89 07 mov WORD PTR [edi], ax
; 189 :
; 190 : RtlCopyUnicodeString( &(devExt->SymbolicLink), &uniWin32Name );
00159 8d 45 f0 lea eax, DWORD PTR _uniWin32Name$[ebp]
0015c 50 push eax
0015d 57 push edi
0015e ff 15 00 00 00
00 call DWORD PTR __imp__RtlCopyUnicodeString@8
; 191 : RtlAppendUnicodeStringToString( &(devExt->SymbolicLink), &(devExt->DiskRegInfo.DriveLetter) );
00164 8d 46 54 lea eax, DWORD PTR [esi+84]
00167 50 push eax
00168 57 push edi
00169 ff 15 00 00 00
00 call DWORD PTR __imp__RtlAppendUnicodeStringToString@8
; 192 :
; 193 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_NOTIFY, ("Creating drive letter = %wZ\n",&(devExt->SymbolicLink) ) );
; 194 :
; 195 : // Create a drive letter from our device name to a name in the Win32 namespace.
; 196 :
; 197 : status = IoCreateSymbolicLink( &devExt->SymbolicLink, &uniDeviceName );
0016f 8d 45 e8 lea eax, DWORD PTR _uniDeviceName$[ebp]
00172 50 push eax
00173 57 push edi
00174 ff 15 00 00 00
00 call DWORD PTR __imp__IoCreateSymbolicLink@8
0017a 8b f8 mov edi, eax
; 198 :
; 199 : if (!NT_SUCCESS(status)) {
0017c 85 ff test edi, edi
0017e 7c 1b jl SHORT $L14702
; 200 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoCreateSymbolicLink error: 0x%x\n", status) );
; 201 : RamDiskCleanUp( functionDeviceObject );
; 202 : return status;
; 203 : }
; 204 : devExt->Flags |= FLAG_LINK_CREATED;
; 205 :
; 206 : devExt->LowerDeviceObject =
; 207 : IoAttachDeviceToDeviceStack( functionDeviceObject, PhysicalDeviceObject );
00180 ff 75 0c push DWORD PTR _PhysicalDeviceObject$[ebp]
00183 09 5e 28 or DWORD PTR [esi+40], ebx
00186 ff 75 fc push DWORD PTR _functionDeviceObject$[ebp]
00189 ff 15 00 00 00
00 call DWORD PTR __imp__IoAttachDeviceToDeviceStack@8
; 208 : if ( devExt->LowerDeviceObject == NULL ) {
0018f 85 c0 test eax, eax
00191 89 46 04 mov DWORD PTR [esi+4], eax
00194 75 0f jne SHORT $L14438
00196 bf 0e 00 00 c0 mov edi, -1073741810 ; c000000eH
$L14702:
; 209 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_ERROR, ("IoAttachDeviceToDeviceStack error\n") );
; 210 : RamDiskCleanUp( functionDeviceObject );
0019b ff 75 fc push DWORD PTR _functionDeviceObject$[ebp]
0019e e8 00 00 00 00 call _RamDiskCleanUp@4
; 211 : return STATUS_NO_SUCH_DEVICE;
001a3 eb 0d jmp SHORT $L14708
$L14438:
; 212 : }
; 213 :
; 214 : driverExtension->DeviceInitialized = TRUE;
001a5 8b 45 f8 mov eax, DWORD PTR _driverExtension$[ebp]
001a8 89 58 08 mov DWORD PTR [eax+8], ebx
; 215 :
; 216 : // Clear DO_DEVICE_INITIALIZING flag
; 217 :
; 218 : functionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
001ab 8b 45 fc mov eax, DWORD PTR _functionDeviceObject$[ebp]
001ae 80 60 1c 7f and BYTE PTR [eax+28], 127 ; 0000007fH
$L14708:
; 219 :
; 220 : DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_VERBOSE, ("AddDevice - OUT. Fdo=(%p) LowerDevice=(%p)\n",
; 221 : functionDeviceObject, devExt->LowerDeviceObject ) );
; 222 :
; 223 : return status;
001b2 8b c7 mov eax, edi
001b4 5f pop edi
001b5 5e pop esi
001b6 5b pop ebx
$L14394:
; 224 : } // End of RamDiskAddDevice()
001b7 c9 leave
001b8 c2 08 00 ret 8
_RamDiskAddDevice@8 ENDP
_TEXT ENDS
PUBLIC _RamDiskDispatchPnp@8
EXTRN __imp__KeInitializeEvent@12:NEAR
EXTRN __imp__KeWaitForSingleObject@20:NEAR
EXTRN __imp__IoAcquireRemoveLockEx@20:NEAR
EXTRN __imp__IoReleaseRemoveLockEx@12:NEAR
; COMDAT _RamDiskDispatchPnp@8
_TEXT SEGMENT
$SG14457 DB 'f:\winddk\2600\src\storage\ramdisk\sys\pnp.c', 00H
; Function compile flags: /Ogsy
_event$ = -24
tv329 = -8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -