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

📄 pnp.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 COD
📖 第 1 页 / 共 5 页
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0 

	TITLE	F:\W2DDK\src\kernel\serial\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 DWORD 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@_0BH@JNNM@PowerSystemUnspecified?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BD@NDKJ@PowerSystemWorking?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BF@JLBM@PowerSystemSleeping1?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BF@GEKF@PowerSystemSleeping2?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BF@MODC@PowerSystemSleeping3?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BF@CJOB@PowerSystemHibernate?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BE@ECLL@PowerSystemShutdown?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BD@GFLO@PowerSystemMaximum?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BH@OAIA@PowerDeviceUnspecified?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0O@DAGD@PowerDeviceD0?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0O@JKPE@PowerDeviceD1?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0O@GFEN@PowerDeviceD2?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0O@MPNK@PowerDeviceD3?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BD@HNLO@PowerDeviceMaximum?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _RtlConvertLongToLargeInteger@4
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialSyncCompletion@12
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialCreateDevObj@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialAddDevice@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialPnpDispatch@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialReportMaxBaudRate@4
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialFinishStartDevice@16
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialStartDevice@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialItemCallBack@44
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialControllerCallBack@44
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialGetPortInfo@20
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialDoExternalNaming@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialUndoExternalNaming@4
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _GUID_CLASS_COMPORT
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBC
INCLUDELIB OLDNAMES

PUBLIC	_GUID_CLASS_COMPORT
PUBLIC	_SerSystemCapString
PUBLIC	??_C@_0BH@JNNM@PowerSystemUnspecified?$AA@	; `string'
PUBLIC	??_C@_0BD@NDKJ@PowerSystemWorking?$AA@		; `string'
PUBLIC	??_C@_0BF@JLBM@PowerSystemSleeping1?$AA@	; `string'
PUBLIC	??_C@_0BF@GEKF@PowerSystemSleeping2?$AA@	; `string'
PUBLIC	??_C@_0BF@MODC@PowerSystemSleeping3?$AA@	; `string'
PUBLIC	??_C@_0BF@CJOB@PowerSystemHibernate?$AA@	; `string'
PUBLIC	??_C@_0BE@ECLL@PowerSystemShutdown?$AA@		; `string'
PUBLIC	??_C@_0BD@GFLO@PowerSystemMaximum?$AA@		; `string'
PUBLIC	_SerDeviceCapString
PUBLIC	??_C@_0BH@OAIA@PowerDeviceUnspecified?$AA@	; `string'
PUBLIC	??_C@_0O@DAGD@PowerDeviceD0?$AA@		; `string'
PUBLIC	??_C@_0O@JKPE@PowerDeviceD1?$AA@		; `string'
PUBLIC	??_C@_0O@GFEN@PowerDeviceD2?$AA@		; `string'
PUBLIC	??_C@_0O@MPNK@PowerDeviceD3?$AA@		; `string'
PUBLIC	??_C@_0BD@HNLO@PowerDeviceMaximum?$AA@		; `string'
_BSS	SEGMENT
?currentInstance@?1??SerialCreateDevObj@@9@9 DD 01H DUP (?) ; currentInstance
_BSS	ENDS
CONST	SEGMENT
_SerialPhysicalZero DD 00H
	ORG $+4
CONST	ENDS
;	COMDAT _GUID_CLASS_COMPORT
CONST	SEGMENT
_GUID_CLASS_COMPORT DD 086e0d1e0H
	DW	08089H
	DW	011d0H
	DB	09cH
	DB	0e4H
	DB	08H
	DB	00H
	DB	03eH
	DB	030H
	DB	01fH
	DB	073H
CONST	ENDS
;	COMDAT ??_C@_0BH@JNNM@PowerSystemUnspecified?$AA@
CONST	SEGMENT
??_C@_0BH@JNNM@PowerSystemUnspecified?$AA@ DB 'PowerSystemUnspecified', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BD@NDKJ@PowerSystemWorking?$AA@
CONST	SEGMENT
??_C@_0BD@NDKJ@PowerSystemWorking?$AA@ DB 'PowerSystemWorking', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BF@JLBM@PowerSystemSleeping1?$AA@
CONST	SEGMENT
??_C@_0BF@JLBM@PowerSystemSleeping1?$AA@ DB 'PowerSystemSleeping1', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BF@GEKF@PowerSystemSleeping2?$AA@
CONST	SEGMENT
??_C@_0BF@GEKF@PowerSystemSleeping2?$AA@ DB 'PowerSystemSleeping2', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BF@MODC@PowerSystemSleeping3?$AA@
CONST	SEGMENT
??_C@_0BF@MODC@PowerSystemSleeping3?$AA@ DB 'PowerSystemSleeping3', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BF@CJOB@PowerSystemHibernate?$AA@
CONST	SEGMENT
??_C@_0BF@CJOB@PowerSystemHibernate?$AA@ DB 'PowerSystemHibernate', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BE@ECLL@PowerSystemShutdown?$AA@
CONST	SEGMENT
??_C@_0BE@ECLL@PowerSystemShutdown?$AA@ DB 'PowerSystemShutdown', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BD@GFLO@PowerSystemMaximum?$AA@
CONST	SEGMENT
??_C@_0BD@GFLO@PowerSystemMaximum?$AA@ DB 'PowerSystemMaximum', 00H ; `string'
CONST	ENDS
_DATA	SEGMENT
_SerSystemCapString DD FLAT:??_C@_0BH@JNNM@PowerSystemUnspecified?$AA@
	DD	FLAT:??_C@_0BD@NDKJ@PowerSystemWorking?$AA@
	DD	FLAT:??_C@_0BF@JLBM@PowerSystemSleeping1?$AA@
	DD	FLAT:??_C@_0BF@GEKF@PowerSystemSleeping2?$AA@
	DD	FLAT:??_C@_0BF@MODC@PowerSystemSleeping3?$AA@
	DD	FLAT:??_C@_0BF@CJOB@PowerSystemHibernate?$AA@
	DD	FLAT:??_C@_0BE@ECLL@PowerSystemShutdown?$AA@
	DD	FLAT:??_C@_0BD@GFLO@PowerSystemMaximum?$AA@
_DATA	ENDS
;	COMDAT ??_C@_0BH@OAIA@PowerDeviceUnspecified?$AA@
CONST	SEGMENT
??_C@_0BH@OAIA@PowerDeviceUnspecified?$AA@ DB 'PowerDeviceUnspecified', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0O@DAGD@PowerDeviceD0?$AA@
CONST	SEGMENT
??_C@_0O@DAGD@PowerDeviceD0?$AA@ DB 'PowerDeviceD0', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0O@JKPE@PowerDeviceD1?$AA@
CONST	SEGMENT
??_C@_0O@JKPE@PowerDeviceD1?$AA@ DB 'PowerDeviceD1', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0O@GFEN@PowerDeviceD2?$AA@
CONST	SEGMENT
??_C@_0O@GFEN@PowerDeviceD2?$AA@ DB 'PowerDeviceD2', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0O@MPNK@PowerDeviceD3?$AA@
CONST	SEGMENT
??_C@_0O@MPNK@PowerDeviceD3?$AA@ DB 'PowerDeviceD3', 00H ; `string'
CONST	ENDS
;	COMDAT ??_C@_0BD@HNLO@PowerDeviceMaximum?$AA@
CONST	SEGMENT
??_C@_0BD@HNLO@PowerDeviceMaximum?$AA@ DB 'PowerDeviceMaximum', 00H ; `string'
CONST	ENDS
_DATA	SEGMENT
_SerDeviceCapString DD FLAT:??_C@_0BH@OAIA@PowerDeviceUnspecified?$AA@
	DD	FLAT:??_C@_0O@DAGD@PowerDeviceD0?$AA@
	DD	FLAT:??_C@_0O@JKPE@PowerDeviceD1?$AA@
	DD	FLAT:??_C@_0O@GFEN@PowerDeviceD2?$AA@
	DD	FLAT:??_C@_0O@MPNK@PowerDeviceD3?$AA@
	DD	FLAT:??_C@_0BD@HNLO@PowerDeviceMaximum?$AA@
_DATA	ENDS
PUBLIC	_SerialSyncCompletion@12
EXTRN	__imp__KeSetEvent@12:NEAR
; Function compile flags: /Ogs
; File f:\w2ddk\src\kernel\serial\pnp.c
;	COMDAT _SerialSyncCompletion@12
_TEXT	SEGMENT
_SerialSyncEvent$ = 16
_SerialSyncCompletion@12 PROC NEAR			; COMDAT

; 87   : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp

; 88   :    KeSetEvent(SerialSyncEvent, IO_NO_INCREMENT, FALSE);

  00003	6a 00		 push	 0
  00005	6a 00		 push	 0
  00007	ff 75 10	 push	 DWORD PTR _SerialSyncEvent$[ebp]
  0000a	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__KeSetEvent@12

; 89   :    return STATUS_MORE_PROCESSING_REQUIRED;

  00010	b8 16 00 00 c0	 mov	 eax, -1073741802	; c0000016H

; 90   : }

  00015	5d		 pop	 ebp
  00016	c2 0c 00	 ret	 12			; 0000000cH
_SerialSyncCompletion@12 ENDP
_TEXT	ENDS
PUBLIC	_SerialCreateDevObj@8
EXTRN	__imp__KeInitializeEvent@12:NEAR
EXTRN	_SerialLogError@64:NEAR
EXTRN	_SerialDebugLevel:DWORD
EXTRN	__imp__KeGetCurrentIrql@0:NEAR
EXTRN	__imp__RtlAssert@16:NEAR
EXTRN	__imp__RtlIntegerToUnicodeString@12:NEAR
EXTRN	__imp__RtlInitUnicodeString@8:NEAR
EXTRN	__imp__ExAllocatePoolWithTag@12:NEAR
EXTRN	__imp__ExFreePool@4:NEAR
EXTRN	__imp__RtlAppendUnicodeStringToString@8:NEAR
EXTRN	__imp__RtlAppendUnicodeToString@8:NEAR
EXTRN	_DbgPrint:NEAR
EXTRN	_driverDefaults:BYTE
EXTRN	__imp__IoCreateDevice@28:NEAR
EXTRN	__imp__IoDeleteDevice@4:NEAR
;	COMDAT _SerialCreateDevObj@8
PAGESRP0	SEGMENT
$SG14848 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG14851 DB	'f:\w2ddk\src\kernel\serial\pnp.c', 00H
	ORG $+3
$SG14852 DB	'FALSE', 00H
	ORG $+2
$SG14859 DB	'SERIAL: Enter SerialCreateDevObj', 0aH, 00H
	ORG $+2
$SG14882 DB	'SERIAL: Couldn''t allocate memory for device name', 0aH, 00H
	ORG $+2
$SG14891 DB	'\', 00H, 'D', 00H, 'e', 00H, 'v', 00H, 'i', 00H, 'c', 00H
	DB	'e', 00H, '\', 00H, 'S', 00H, 'e', 00H, 'r', 00H, 'i', 00H, 'a'
	DB	00H, 'l', 00H, 00H, 00H
	ORG $+2
$SG14902 DB	'SerialAddDevice: Create device failed - %x ', 0aH, 00H
	ORG $+3
$SG14976 DB	'SERIAL: SerialCreateDevObj Error, Cleaning up', 0aH, 00H
	ORG $+1
$SG14997 DB	'SERIAL: Leave SerialCreateDevObj', 0aH, 00H
	ORG $+2
$SG14913 DB	'f:\w2ddk\src\kernel\serial\pnp.c', 00H
	ORG $+3
$SG14914 DB	'deviceObject != NULL', 00H
	ORG $+3
$SG14929 DB	'SERIAL: Couldn''t allocate memory for DeviceName', 0aH, 00H
	ORG $+3
$SG14946 DB	'SerialAddDevice: Cannot allocate memory for NtName', 0aH
	DB	00H
$SG14962 DB	'SERIAL: Leave SerialCreateDevObj', 0aH, 00H
; Function compile flags: /Ogs
_DriverObject$ = 8
_NewDeviceObject$ = 12
_deviceObjName$ = -16
_deviceObject$ = -4
_pDevExt$ = 8
_status$ = -8
_instanceStr$ = -24
_instanceNumberBuffer$ = -64
_SerialCreateDevObj@8 PROC NEAR				; COMDAT

; 116  : {

  00216	55		 push	 ebp
  00217	8b ec		 mov	 ebp, esp
  00219	83 ec 40	 sub	 esp, 64			; 00000040H
  0021c	53		 push	 ebx
  0021d	56		 push	 esi
  0021e	57		 push	 edi

; 117  :    UNICODE_STRING deviceObjName;
; 118  :    PDEVICE_OBJECT deviceObject = NULL;
; 119  :    PSERIAL_DEVICE_EXTENSION pDevExt;
; 120  :    NTSTATUS status = STATUS_SUCCESS;
; 121  :    static ULONG currentInstance = 0;
; 122  :    UNICODE_STRING instanceStr;
; 123  :    WCHAR instanceNumberBuffer[20];
; 124  : 
; 125  : 
; 126  :    PAGED_CODE();

  0021f	8b 3d 00 00 00
	00		 mov	 edi, DWORD PTR __imp__KeGetCurrentIrql@0
  00225	33 f6		 xor	 esi, esi
  00227	89 75 fc	 mov	 DWORD PTR _deviceObject$[ebp], esi
  0022a	ff d7		 call	 edi
  0022c	33 db		 xor	 ebx, ebx
  0022e	43		 inc	 ebx
  0022f	3a c3		 cmp	 al, bl
  00231	76 25		 jbe	 SHORT $L14853
  00233	ff d7		 call	 edi
  00235	0f b6 c0	 movzx	 eax, al
  00238	50		 push	 eax
  00239	68 00 00 00 00	 push	 OFFSET FLAT:$SG14848
  0023e	e8 00 00 00 00	 call	 _DbgPrint
  00243	59		 pop	 ecx
  00244	59		 pop	 ecx
  00245	56		 push	 esi
  00246	6a 7e		 push	 126			; 0000007eH
  00248	68 00 00 00 00	 push	 OFFSET FLAT:$SG14851
  0024d	68 00 00 00 00	 push	 OFFSET FLAT:$SG14852
  00252	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
$L14853:

; 127  : 
; 128  :    SerialDump (SERTRACECALLS,("SERIAL: Enter SerialCreateDevObj\n"));

  00258	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  0025f	74 0b		 je	 SHORT $L14854
  00261	68 00 00 00 00	 push	 OFFSET FLAT:$SG14859
  00266	e8 00 00 00 00	 call	 _DbgPrint
  0026b	59		 pop	 ecx
$L14854:

; 129  : 
; 130  :    //
; 131  :    // Zero out allocated memory pointers so we know if they must be freed
; 132  :    //
; 133  : 
; 134  :    RtlZeroMemory(&deviceObjName, sizeof(UNICODE_STRING));

  0026c	33 c0		 xor	 eax, eax
  0026e	8d 7d f0	 lea	 edi, DWORD PTR _deviceObjName$[ebp]
  00271	ab		 stosd

; 135  : 
; 136  :    deviceObjName.MaximumLength = DEVICE_OBJECT_NAME_LENGTH * sizeof(WCHAR);
; 137  :    deviceObjName.Buffer = ExAllocatePool(PagedPool, deviceObjName.MaximumLength
; 138  :                                      + sizeof(WCHAR));

  00272	68 43 4f 4d 58	 push	 1481461571		; 584d4f43H
  00277	68 02 01 00 00	 push	 258			; 00000102H
  0027c	ab		 stosd
  0027d	53		 push	 ebx
  0027e	66 c7 45 f2 00
	01		 mov	 WORD PTR _deviceObjName$[ebp+2], 256 ; 00000100H
  00284	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__ExAllocatePoolWithTag@12
  0028a	8b f8		 mov	 edi, eax

; 139  : 
; 140  : 
; 141  :    if (deviceObjName.Buffer == NULL) {

  0028c	3b fe		 cmp	 edi, esi
  0028e	89 7d f4	 mov	 DWORD PTR _deviceObjName$[ebp+4], edi
  00291	75 45		 jne	 SHORT $L14870

; 142  :       SerialLogError(DriverObject, NULL, SerialPhysicalZero, SerialPhysicalZero,
; 143  :                      0, 0, 0, 19, STATUS_SUCCESS, SERIAL_INSUFFICIENT_RESOURCES,
; 144  :                      0, NULL, 0, NULL);

  00293	56		 push	 esi
  00294	a1 04 00 00 00	 mov	 eax, DWORD PTR _SerialPhysicalZero+4
  00299	56		 push	 esi
  0029a	8b 0d 00 00 00
	00		 mov	 ecx, DWORD PTR _SerialPhysicalZero
  002a0	56		 push	 esi
  002a1	56		 push	 esi
  002a2	68 08 00 06 c0	 push	 -1073348600		; c0060008H
  002a7	56		 push	 esi
  002a8	6a 13		 push	 19			; 00000013H
  002aa	56		 push	 esi
  002ab	56		 push	 esi
  002ac	56		 push	 esi

⌨️ 快捷键说明

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