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

📄 pnp.cod

📁 利用系统内存建立虚拟磁盘
💻 COD
📖 第 1 页 / 共 4 页
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 13.00.9178 

	TITLE	.\pnp.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 PARA USE32 PUBLIC 'BSS'
_BSS	ENDS
$$SYMBOLS	SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS	ENDS
$$TYPES	SEGMENT BYTE USE32 'DEBTYP'
$$TYPES	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
;	COMDAT ??_C@_07HJLKKEON@STOPPED?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_07DKDIHBMC@WORKING?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0M@NGFJOEFI@PENDINGSTOP?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0O@CMHNAAAF@PENDINGREMOVE?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BA@FPDANPCF@SURPRISEREMOVED?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_07POKKMNIN@REMOVED?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_07NFANNNEC@UNKNOWN?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT _RamDiskAddDevice@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskDispatchPnp@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskDispatchPower@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskDispatchSystemControl@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskIoCompletionRoutine@12
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskCleanUp@4
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _RamDiskRemoveDevice@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _GetPnpIrpName@4
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBC
INCLUDELIB OLDNAMES

PUBLIC	_StateTable
PUBLIC	??_C@_07HJLKKEON@STOPPED?$AA@			; `string'
PUBLIC	??_C@_07DKDIHBMC@WORKING?$AA@			; `string'
PUBLIC	??_C@_0M@NGFJOEFI@PENDINGSTOP?$AA@		; `string'
PUBLIC	??_C@_0O@CMHNAAAF@PENDINGREMOVE?$AA@		; `string'
PUBLIC	??_C@_0BA@FPDANPCF@SURPRISEREMOVED?$AA@		; `string'
PUBLIC	??_C@_07POKKMNIN@REMOVED?$AA@			; `string'
PUBLIC	??_C@_07NFANNNEC@UNKNOWN?$AA@			; `string'
;	COMDAT ??_C@_07HJLKKEON@STOPPED?$AA@
CONST	SEGMENT
??_C@_07HJLKKEON@STOPPED?$AA@ DB 'STOPPED', 00H		; `string'
CONST	ENDS
;	COMDAT ??_C@_07DKDIHBMC@WORKING?$AA@
CONST	SEGMENT
??_C@_07DKDIHBMC@WORKING?$AA@ DB 'WORKING', 00H		; `string'
CONST	ENDS
;	COMDAT ??_C@_0M@NGFJOEFI@PENDINGSTOP?$AA@
CONST	SEGMENT
??_C@_0M@NGFJOEFI@PENDINGSTOP?$AA@ DB 'PENDINGSTOP', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0O@CMHNAAAF@PENDINGREMOVE?$AA@
CONST	SEGMENT
??_C@_0O@CMHNAAAF@PENDINGREMOVE?$AA@ DB 'PENDINGREMOVE', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BA@FPDANPCF@SURPRISEREMOVED?$AA@
CONST	SEGMENT
??_C@_0BA@FPDANPCF@SURPRISEREMOVED?$AA@ DB 'SURPRISEREMOVED', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_07POKKMNIN@REMOVED?$AA@
CONST	SEGMENT
??_C@_07POKKMNIN@REMOVED?$AA@ DB 'REMOVED', 00H		; `string'
CONST	ENDS
;	COMDAT ??_C@_07NFANNNEC@UNKNOWN?$AA@
CONST	SEGMENT
??_C@_07NFANNNEC@UNKNOWN?$AA@ DB 'UNKNOWN', 00H		; `string'
CONST	ENDS
_DATA	SEGMENT
_StateTable DD	FLAT:??_C@_07HJLKKEON@STOPPED?$AA@
	DD	FLAT:??_C@_07DKDIHBMC@WORKING?$AA@
	DD	FLAT:??_C@_0M@NGFJOEFI@PENDINGSTOP?$AA@
	DD	FLAT:??_C@_0O@CMHNAAAF@PENDINGREMOVE?$AA@
	DD	FLAT:??_C@_0BA@FPDANPCF@SURPRISEREMOVED?$AA@
	DD	FLAT:??_C@_07POKKMNIN@REMOVED?$AA@
	DD	FLAT:??_C@_07NFANNNEC@UNKNOWN?$AA@
_DATA	ENDS
PUBLIC	_RamDiskDispatchPower@8
EXTRN	__imp__PoCallDriver@8:NEAR
EXTRN	__imp__PoStartNextPowerIrp@4:NEAR
EXTRN	__imp_@IofCompleteRequest@8:NEAR
; Function compile flags: /Ogsy
; File f:\winddk\2600\src\storage\ramdisk\sys\pnp.c
;	COMDAT _RamDiskDispatchPower@8
_TEXT	SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_RamDiskDispatchPower@8 PROC NEAR			; COMDAT

; 427  :     PDEVICE_EXTENSION   devExt;
; 428  :     NTSTATUS            status = STATUS_SUCCESS;
; 429  : 
; 430  :     PAGED_CODE();
; 431  : 
; 432  :     DBGPRINT( DBG_COMP_POWER, DBG_LEVEL_VERBOSE, ("DispatchPower - IN. Fdo=(%p) Irp=(%p)\n",
; 433  :                                                         DeviceObject, Irp ) );
; 434  :     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

  00000	8b 44 24 04	 mov	 eax, DWORD PTR _DeviceObject$[esp-4]
  00004	56		 push	 esi

; 435  : 
; 436  :     //
; 437  :     // If the device has been removed, the driver should not pass
; 438  :     // the IRP down to the next lower driver.
; 439  :     //
; 440  : 
; 441  :     if ( devExt->DevState == REMOVED) {
; 442  :         PoStartNextPowerIrp( Irp );

  00005	8b 74 24 0c	 mov	 esi, DWORD PTR _Irp$[esp]
  00009	57		 push	 edi
  0000a	8b 78 28	 mov	 edi, DWORD PTR [eax+40]
  0000d	83 7f 0c 05	 cmp	 DWORD PTR [edi+12], 5
  00011	56		 push	 esi
  00012	75 20		 jne	 SHORT $L14525
  00014	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__PoStartNextPowerIrp@4

; 443  :         status = STATUS_DELETE_PENDING;
; 444  :         COMPLETE_REQUEST( Irp, status, 0 );

  0001a	83 66 1c 00	 and	 DWORD PTR [esi+28], 0
  0001e	bf 56 00 00 c0	 mov	 edi, -1073741738	; c0000056H
  00023	32 d2		 xor	 dl, dl
  00025	8b ce		 mov	 ecx, esi
  00027	89 7e 18	 mov	 DWORD PTR [esi+24], edi
  0002a	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8

; 445  :         return status;

  00030	8b c7		 mov	 eax, edi
  00032	eb 17		 jmp	 SHORT $L14519
$L14525:

; 446  :     }
; 447  : 
; 448  :     PoStartNextPowerIrp( Irp );

  00034	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__PoStartNextPowerIrp@4

; 449  :     IoSkipCurrentIrpStackLocation( Irp );

  0003a	fe 46 23	 inc	 BYTE PTR [esi+35]
  0003d	83 46 60 24	 add	 DWORD PTR [esi+96], 36	; 00000024H

; 450  : 
; 451  :     DBGPRINT( DBG_COMP_POWER, DBG_LEVEL_VERBOSE, ("DispatchPower - OUT.\n" ) );
; 452  : 
; 453  :     return PoCallDriver( devExt->LowerDeviceObject, Irp );

  00041	56		 push	 esi
  00042	ff 77 04	 push	 DWORD PTR [edi+4]
  00045	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__PoCallDriver@8
$L14519:
  0004b	5f		 pop	 edi
  0004c	5e		 pop	 esi

; 454  : 
; 455  : }  // End of RamDiskDispatchPower()

  0004d	c2 08 00	 ret	 8
_RamDiskDispatchPower@8 ENDP
_TEXT	ENDS
PUBLIC	_RamDiskDispatchSystemControl@8
EXTRN	__imp_@IofCallDriver@8:NEAR
; Function compile flags: /Ogsy
;	COMDAT _RamDiskDispatchSystemControl@8
_TEXT	SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_RamDiskDispatchSystemControl@8 PROC NEAR		; COMDAT

; 480  :     PDEVICE_EXTENSION   devExt;
; 481  : 
; 482  :     PAGED_CODE();
; 483  : 
; 484  :     DBGPRINT( DBG_COMP_WMI, DBG_LEVEL_VERBOSE, ("DispatchSystemControl - IN. Fdo=(%p) Irp=(%p)\n",
; 485  :         DeviceObject, Irp ) );
; 486  : 
; 487  :     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
; 488  :     IoSkipCurrentIrpStackLocation( Irp );

  00000	8b 54 24 08	 mov	 edx, DWORD PTR _Irp$[esp-4]
  00004	8b 44 24 04	 mov	 eax, DWORD PTR _DeviceObject$[esp-4]
  00008	8b 40 28	 mov	 eax, DWORD PTR [eax+40]
  0000b	fe 42 23	 inc	 BYTE PTR [edx+35]
  0000e	83 42 60 24	 add	 DWORD PTR [edx+96], 36	; 00000024H

; 489  :     DBGPRINT( DBG_COMP_WMI, DBG_LEVEL_VERBOSE, ("DispatchSystemControl - OUT.\n" ) );
; 490  :     return IoCallDriver( devExt->LowerDeviceObject, Irp );

  00012	8b 48 04	 mov	 ecx, DWORD PTR [eax+4]
  00015	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCallDriver@8

; 491  : 
; 492  : }  // End of RamDiskDispatchSystemControl()

  0001b	c2 08 00	 ret	 8
_RamDiskDispatchSystemControl@8 ENDP
_TEXT	ENDS
PUBLIC	_RamDiskIoCompletionRoutine@12
EXTRN	__imp__KeSetEvent@12:NEAR
; Function compile flags: /Ogsy
;	COMDAT _RamDiskIoCompletionRoutine@12
_TEXT	SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_Event$ = 16
_RamDiskIoCompletionRoutine@12 PROC NEAR		; COMDAT

; 520  : 
; 521  :     KeSetEvent( Event, 0, FALSE );

  00000	6a 00		 push	 0
  00002	6a 00		 push	 0
  00004	ff 74 24 14	 push	 DWORD PTR _Event$[esp+4]
  00008	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__KeSetEvent@12

; 522  :     return STATUS_MORE_PROCESSING_REQUIRED;

  0000e	b8 16 00 00 c0	 mov	 eax, -1073741802	; c0000016H

; 523  : 
; 524  : }  // End of RamDiskIoCompletionRoutine()

  00013	c2 0c 00	 ret	 12			; 0000000cH
_RamDiskIoCompletionRoutine@12 ENDP
_TEXT	ENDS
PUBLIC	_RamDiskCleanUp@4
EXTRN	__imp__IoDeleteDevice@4:NEAR
EXTRN	__imp__IoDeleteSymbolicLink@4:NEAR
EXTRN	__imp__IoDetachDevice@4:NEAR
EXTRN	__imp__ExFreePoolWithTag@8:NEAR
; Function compile flags: /Ogsy
;	COMDAT _RamDiskCleanUp@4
_TEXT	SEGMENT
_DeviceObject$ = 8
_RamDiskCleanUp@4 PROC NEAR				; COMDAT

; 548  : {

  00000	53		 push	 ebx

; 549  :       
; 550  :     PDEVICE_EXTENSION   devExt = DeviceObject->DeviceExtension;

  00001	8b 5c 24 08	 mov	 ebx, DWORD PTR _DeviceObject$[esp]
  00005	56		 push	 esi
  00006	8b 73 28	 mov	 esi, DWORD PTR [ebx+40]

; 551  : 
; 552  :     PAGED_CODE();
; 553  :     DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("RamDiskCleanUp\n" ) );
; 554  :     
; 555  :     if ( devExt->Flags & FLAG_LINK_CREATED ) {

  00009	f6 46 28 01	 test	 BYTE PTR [esi+40], 1
  0000d	74 0a		 je	 SHORT $L14552

; 556  :         IoDeleteSymbolicLink( &devExt->SymbolicLink );

  0000f	8d 46 5c	 lea	 eax, DWORD PTR [esi+92]
  00012	50		 push	 eax
  00013	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoDeleteSymbolicLink@4
$L14552:

; 557  :     }
; 558  :     if ( devExt->SymbolicLink.Buffer ) {

  00019	8b 46 60	 mov	 eax, DWORD PTR [esi+96]
  0001c	85 c0		 test	 eax, eax
  0001e	57		 push	 edi
  0001f	8b 3d 00 00 00
	00		 mov	 edi, DWORD PTR __imp__ExFreePoolWithTag@8
  00025	74 05		 je	 SHORT $L14553

; 559  :         ExFreePool( devExt->SymbolicLink.Buffer );

  00027	6a 00		 push	 0
  00029	50		 push	 eax
  0002a	ff d7		 call	 edi
$L14553:

; 560  :     }
; 561  :     if ( devExt->DiskRegInfo.DriveLetter.Buffer ) {

  0002c	8b 46 58	 mov	 eax, DWORD PTR [esi+88]
  0002f	85 c0		 test	 eax, eax
  00031	74 05		 je	 SHORT $L14554

; 562  :         ExFreePool( devExt->DiskRegInfo.DriveLetter.Buffer );

  00033	6a 00		 push	 0
  00035	50		 push	 eax
  00036	ff d7		 call	 edi
$L14554:

; 563  :     }
; 564  :     if ( devExt->DiskImage ) {

  00038	8b 46 2c	 mov	 eax, DWORD PTR [esi+44]
  0003b	85 c0		 test	 eax, eax
  0003d	74 05		 je	 SHORT $L14555

; 565  :         ExFreePool( devExt->DiskImage );

  0003f	6a 00		 push	 0
  00041	50		 push	 eax
  00042	ff d7		 call	 edi
$L14555:

; 566  :     }
; 567  :     if ( devExt->LowerDeviceObject ) {

  00044	8b 76 04	 mov	 esi, DWORD PTR [esi+4]
  00047	85 f6		 test	 esi, esi
  00049	5f		 pop	 edi
  0004a	74 07		 je	 SHORT $L14556

; 568  :         IoDetachDevice( devExt->LowerDeviceObject );

  0004c	56		 push	 esi
  0004d	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoDetachDevice@4
$L14556:

; 569  :     }
; 570  :     IoDeleteDevice( DeviceObject );

  00053	53		 push	 ebx
  00054	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoDeleteDevice@4
  0005a	5e		 pop	 esi
  0005b	5b		 pop	 ebx

; 571  : 
; 572  :     return;
; 573  : }

  0005c	c2 04 00	 ret	 4
_RamDiskCleanUp@4 ENDP
_TEXT	ENDS
PUBLIC	_RamDiskRemoveDevice@8
EXTRN	__imp__IoGetDriverObjectExtension@8:NEAR
EXTRN	__imp__IoReleaseRemoveLockAndWaitEx@12:NEAR
EXTRN	__imp__IoSetDeviceInterfaceState@8:NEAR
EXTRN	_DriverEntry@8:NEAR
; Function compile flags: /Ogsy
;	COMDAT _RamDiskRemoveDevice@8
_TEXT	SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_RamDiskRemoveDevice@8 PROC NEAR			; COMDAT

; 598  : {

  00000	53		 push	 ebx

; 599  :     PDEVICE_EXTENSION           devExt = DeviceObject->DeviceExtension;

  00001	8b 5c 24 08	 mov	 ebx, DWORD PTR _DeviceObject$[esp]
  00005	56		 push	 esi
  00006	57		 push	 edi
  00007	8b 7b 28	 mov	 edi, DWORD PTR [ebx+40]

; 600  :     PRAMDISK_DRIVER_EXTENSION   driverExtension;
; 601  :     NTSTATUS                    status;
; 602  : 
; 603  :     PAGED_CODE();
; 604  :     DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_VERBOSE, ("RemoveDevice\n" ) );
; 605  : 
; 606  :     #ifdef DBG
; 607  :     status =
; 608  :     #endif

⌨️ 快捷键说明

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