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

📄 pnp.cod

📁 利用系统内存建立虚拟磁盘
💻 COD
📖 第 1 页 / 共 4 页
字号:
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 + -