Advertisement
Guest User

Untitled

a guest
Apr 9th, 2017
806
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 79.19 KB | None | 0 0
  1. {$E sys}
  2.  
  3. library rramdisk;
  4.  
  5.  
  6. procedure KfReleaseSpinLock; external 'HAL.dll';
  7. procedure KfAcquireSpinLock; external 'HAL.dll';
  8.  
  9.  
  10.  
  11. procedure IoAcquireRemoveLockEx; external 'NTOSKRNL.exe';
  12. procedure MmMapLockedPagesSpecifyCache; external 'NTOSKRNL.exe';
  13. procedure MmUnmapLockedPages; external 'NTOSKRNL.exe';
  14. procedure memmove; external 'NTOSKRNL.exe';
  15. procedure RtlCopyUnicodeString; external 'NTOSKRNL.exe';
  16. procedure RtlQueryRegistryValues; external 'NTOSKRNL.exe';
  17. procedure ExAllocatePoolWithTag; external 'NTOSKRNL.exe';
  18. procedure RtlInitUnicodeString; external 'NTOSKRNL.exe';
  19. procedure strncpy; external 'NTOSKRNL.exe';
  20. procedure IoAllocateDriverObjectExtension; external 'NTOSKRNL.exe';
  21. procedure ExFreePoolWithTag; external 'NTOSKRNL.exe';
  22. procedure IoGetDriverObjectExtension; external 'NTOSKRNL.exe';
  23. procedure PoCallDriver; external 'NTOSKRNL.exe';
  24. procedure PoStartNextPowerIrp; external 'NTOSKRNL.exe';
  25. procedure IoReleaseRemoveLockEx; external 'NTOSKRNL.exe';
  26. procedure KeSetEvent; external 'NTOSKRNL.exe';
  27. procedure IoDeleteDevice; external 'NTOSKRNL.exe';
  28. procedure IoDetachDevice; external 'NTOSKRNL.exe';
  29. procedure MmFreePagesFromMdl; external 'NTOSKRNL.exe';
  30. procedure IoDeleteSymbolicLink; external 'NTOSKRNL.exe';
  31. procedure IoReleaseRemoveLockAndWaitEx; external 'NTOSKRNL.exe';
  32. procedure IoAttachDeviceToDeviceStack; external 'NTOSKRNL.exe';
  33. procedure IoCreateSymbolicLink; external 'NTOSKRNL.exe';
  34. procedure RtlAppendUnicodeStringToString; external 'NTOSKRNL.exe';
  35. procedure MmAllocatePagesForMdl; external 'NTOSKRNL.exe';
  36. procedure KeInitializeSpinLock; external 'NTOSKRNL.exe';
  37. procedure IoInitializeRemoveLockEx; external 'NTOSKRNL.exe';
  38. procedure IoCreateDevice; external 'NTOSKRNL.exe';
  39. procedure KeWaitForSingleObject; external 'NTOSKRNL.exe';
  40. procedure KeInitializeEvent; external 'NTOSKRNL.exe';
  41. procedure IofCompleteRequest; external 'NTOSKRNL.exe';
  42. procedure IofCallDriver; external 'NTOSKRNL.exe';
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. //procedure loc_401F46; external;
  52. procedure loc_401200; external;
  53. procedure sub_4006C4; external;
  54. procedure sub_400496; external;
  55. procedure sub_400E2E; external;
  56. procedure loc_400944; external;
  57. procedure loc_400994; external;
  58. procedure sub_400B14; external;
  59. procedure sub_401DFC; external;
  60.  
  61. {$L !rramdisk}
  62.  
  63. procedure DriverEntry;
  64.  
  65. const
  66. DriverObjectExtension = $08;
  67. SourceString    =  $0C;
  68.  
  69. asm
  70.         push    ebp
  71.         mov ebp, esp
  72.         push    esi
  73.         mov esi, [ebp+DriverObjectExtension]
  74.         lea eax, [ebp+DriverObjectExtension]
  75.         push    eax     //; DriverObjectExtension
  76.         push    0Ch     //; DriverObjectExtensionSize
  77.         push    offset DriverEntry //; ClientIdentificationAddress
  78.         push    esi     //; DriverObject
  79.         call    IoAllocateDriverObjectExtension
  80.         test    eax, eax
  81.         jl  @@loc_401F46
  82.         mov ecx, [ebp+DriverObjectExtension]
  83.         push    edi
  84.         mov edi, [ebp+SourceString]
  85.         mov ax, [edi]
  86.         mov [ecx], ax
  87.         mov ax, [edi+2]
  88.         mov ecx, [ebp+DriverObjectExtension]
  89.         add ax, 2
  90.         mov [ecx+2], ax
  91.         mov eax, [ebp+DriverObjectExtension]
  92.         movzx   eax, word ptr [eax+2]
  93.         push    '1maR'          //; Tag
  94.         push    eax     //; NumberOfBytes
  95.         push    1       //; PoolType
  96.         call    ExAllocatePoolWithTag
  97.         mov ecx, [ebp+DriverObjectExtension]
  98.         mov [ecx+4], eax
  99.         mov eax, [ebp+DriverObjectExtension]
  100.         cmp dword ptr [eax+4], 0
  101.         jnz @@loc_401EE8
  102.         mov eax, 0C000009Ah
  103.         jmp @@loc_401F45
  104. //; ---------------------------------------------------------------------------
  105.  
  106. @@loc_401EE8:               //; CODE XREF: DriverEntry+5Fj
  107.         push    edi     //; SourceString
  108.         push    eax     //; DestinationString
  109.         call    RtlCopyUnicodeString
  110.         mov eax, [ebp+DriverObjectExtension]
  111.         and dword ptr [eax+8], 0
  112.         mov eax, offset loc_401200
  113.         mov [esi+38h], eax
  114.         mov [esi+40h], eax
  115.         mov eax, offset sub_4006C4
  116.         mov [esi+44h], eax
  117.         mov [esi+48h], eax
  118.         mov eax, [esi+18h]
  119.         mov dword ptr [esi+70h], offset sub_400496
  120.         mov dword ptr [esi+0A4h], offset sub_400E2E
  121.         mov dword ptr [esi+90h], offset loc_400944
  122.         mov dword ptr [esi+94h], offset loc_400994
  123.         mov dword ptr [eax+4], offset sub_400B14
  124.         mov dword ptr [esi+34h], offset sub_401DFC
  125.         xor eax, eax
  126.  
  127. @@loc_401F45:               //; CODE XREF: DriverEntry+66j
  128.         pop edi
  129.  
  130. @@loc_401F46:               //; CODE XREF: DriverEntry+1Bj
  131.         pop esi
  132.         pop ebp
  133.         ret 8
  134. end;
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. //procedure DriverEntry;external;
  144.  
  145. asm jmp DriverEntry
  146. end.
  147.  
  148.  
  149.  
  150.  
  151. ; ---------------------------------------------------------------------------
  152.  
  153. _RTL_QUERY_REGISTRY_TABLE struc ; (sizeof=0x1C, standard type)
  154. QueryRoutine    dd ?            ; offset
  155. Flags       dd ?
  156. Name        dd ?            ; offset
  157. EntryContext    dd ?            ; offset
  158. DefaultType dd ?
  159. DefaultData dd ?            ; offset
  160. DefaultLength   dd ?
  161. _RTL_QUERY_REGISTRY_TABLE ends
  162.  
  163. ; ---------------------------------------------------------------------------
  164.  
  165. LIST_ENTRY  struc ; (sizeof=0x8, standard type)
  166. Flink       dd ?            ; offset
  167. Blink       dd ?            ; offset
  168. LIST_ENTRY  ends
  169.  
  170.  
  171. ; ---------------------------------------------------------------------------
  172.  
  173. PHYSICAL_ADDRESS struc ; (sizeof=0x8, standard type)
  174. LowPart     dd ?
  175. HighPart    dd ?
  176. PHYSICAL_ADDRESS ends
  177.  
  178. ; ---------------------------------------------------------------------------
  179.  
  180. UNICODE_STRING  struc ; (sizeof=0x8, standard type)
  181. Length      dw ?
  182. MaximumLength   dw ?
  183. Buffer      dd ?            ; offset
  184. UNICODE_STRING  ends
  185.  
  186.  
  187. ;
  188. ; +-------------------------------------------------------------------------+
  189. ; |   This file has been generated by The Interactive Disassembler (IDA)    |
  190. ; |       Copyright (c) 2011 Hex-Rays, <support@hex-rays.com>       |
  191. ; |          License info: 48-327F-7274-B7              |
  192. ; |                ESET spol. s r.o.                |
  193. ; +-------------------------------------------------------------------------+
  194. ;
  195. ; Input MD5   : CAE382E4306ED6D112D174CE8C4A98B8
  196. ; Input CRC32 : 8DABBE34
  197.  
  198.  
  199.         include uni.inc ; see unicode subdir of ida for info on unicode
  200.  
  201.         .686p
  202.         .mmx
  203.         .model flat
  204.         extrn DriverEntry:proc
  205. ; ===========================================================================
  206.  
  207. ; [00000480 BYTES: COLLAPSED SEGMENT HEADER. PRESS KEYPAD "+" TO EXPAND]
  208. ; File Name   : A:\!files\rramdisk.sys
  209. ; Format      : Portable executable for 80386 (PE)
  210. ; Imagebase   : 400000
  211. ; Section 1. (virtual address 00000480)
  212. ; Virtual size          : 00000B34 (   2868.)
  213. ; Section size in file      : 00000B80 (   2944.)
  214. ; Offset to raw data for section: 00000480
  215. ; Flags 68000020: Text Not pageable Executable Readable
  216. ; Alignment : default
  217. ; ===========================================================================
  218.  
  219. ; Segment type: Pure code
  220. ; Segment permissions: Read/Execute
  221. ;_text      segment para public 'CODE' use32
  222. ;       assume cs:_text
  223.         ;org 400480h
  224. ;       assume es:nothing, ss:nothing, _data, fs:nothing, gs:nothing
  225. .code
  226. ; char File[]
  227. File        db 'd:\work\rd\ramdisk.c',0 ; DATA XREF: sub_400496+1Bo
  228.         align 2
  229.  
  230. ; =============== S U B R O U T I N E =======================================
  231.  
  232. ; Attributes: bp-based frame
  233.  
  234. ; int __stdcall sub_400496(PIO_REMOVE_LOCK RemoveLock, PVOID Irp)
  235. public sub_400496
  236. sub_400496  proc near       ; DATA XREF: DriverEntry+90o
  237.  
  238. var_4       = dword ptr -4
  239. RemoveLock  = dword ptr  8
  240. Irp     = dword ptr  0Ch
  241.  
  242.         push    ebp
  243.         mov ebp, esp
  244.         push    ecx
  245.         mov eax, [ebp+RemoveLock]
  246.         and [ebp+var_4], 0
  247.         push    ebx
  248.         mov ebx, [ebp+Irp]
  249.         push    esi
  250.         mov esi, [eax+28h]
  251.         push    edi
  252.         push    18h     ; RemlockSize
  253.         push    12Bh        ; Line
  254.         push    offset File ; "d:\\work\\rd\\ramdisk.c"
  255.         lea eax, [esi+10h]
  256.         push    ebx     ; Tag
  257.         push    eax     ; RemoveLock
  258.         mov [ebp+RemoveLock], eax
  259.         call    IoAcquireRemoveLockEx
  260.         mov edi, eax
  261.         xor edx, edx
  262.         cmp edi, edx
  263.         jge short loc_4004E3
  264.         mov [ebx+1Ch], edx
  265.         xor dl, dl      ; PriorityBoost
  266.         mov ecx, ebx    ; Irp
  267.         mov [ebx+18h], edi
  268.         call    IofCompleteRequest
  269.         mov eax, edi
  270.         jmp loc_40060F
  271. ; ---------------------------------------------------------------------------
  272.  
  273. loc_4004E3:             ; CODE XREF: sub_400496+34j
  274.         mov eax, [ebx+60h]
  275.         mov edi, [eax+0Ch]
  276.         mov ecx, 7405Ch
  277.         cmp edi, ecx
  278.         ja  loc_4005BE
  279.         jz  loc_4005A1
  280.         sub edi, 70000h
  281.         jz  short loc_400579
  282.         sub edi, 14h
  283.         jz  loc_4005EC
  284.         sub edi, 10h
  285.         jz  loc_4005EC
  286.         sub edi, 0BDCh
  287.         jz  short loc_400579
  288.         sub edi, 3404h
  289.         jnz loc_4005D8
  290.         push    20h
  291.         pop edi
  292.         cmp [eax+4], edi
  293.         mov [ebp+var_4], edi
  294.         jnb short loc_40053F
  295.         mov esi, 0C0000023h
  296.         jmp loc_4005EE
  297. ; ---------------------------------------------------------------------------
  298.  
  299. loc_40053F:             ; CODE XREF: sub_400496+9Dj
  300.         mov cl, byte_40119C
  301.         mov eax, [ebx+0Ch]
  302.         mov [eax], edx
  303.         mov [eax+4], edx
  304.         mov [eax+18h], cl
  305.         mov byte ptr [eax+19h], 0
  306.         mov byte ptr [eax+1Ah], 1
  307.         mov byte ptr [eax+1Bh], 0
  308.         mov ecx, [esi+64h]
  309.         xor edx, edx
  310.         shld    edx, ecx, 0Ah
  311.         shl ecx, 0Ah
  312.         xor esi, esi
  313.         or  dword ptr [eax+14h], 0FFFFFFFFh
  314.         mov [eax+8], ecx
  315.         mov [eax+0Ch], edx
  316.         mov [eax+10h], esi
  317.         jmp short loc_4005EE
  318. ; ---------------------------------------------------------------------------
  319.  
  320. loc_400579:             ; CODE XREF: sub_400496+6Cj
  321.                     ; sub_400496+86j
  322.         cmp dword ptr [eax+4], 18h
  323.         jnb short loc_40058D
  324.         mov esi, 0C0000023h
  325.         mov [ebp+var_4], 20h
  326.         jmp short loc_4005EE
  327. ; ---------------------------------------------------------------------------
  328.  
  329. loc_40058D:             ; CODE XREF: sub_400496+E7j
  330.         mov edi, [ebx+0Ch]
  331.         push    6
  332.         add esi, 48h
  333.         pop ecx
  334.         rep movsd
  335.         mov [ebp+var_4], 18h
  336.         jmp short loc_4005EC
  337. ; ---------------------------------------------------------------------------
  338.  
  339. loc_4005A1:             ; CODE XREF: sub_400496+60j
  340.         mov eax, [esi+64h]
  341.         mov esi, [ebx+0Ch]
  342.         xor ecx, ecx
  343.         shld    ecx, eax, 0Ah
  344.         shl eax, 0Ah
  345.         mov [esi], eax
  346.         mov [esi+4], ecx
  347.         mov [ebp+var_4], 8
  348.         jmp short loc_4005EC
  349. ; ---------------------------------------------------------------------------
  350.  
  351. loc_4005BE:             ; CODE XREF: sub_400496+5Aj
  352.         sub edi, 74800h
  353.         jz  short loc_4005EC
  354.         sub edi, 4
  355.         jz  short loc_4005EC
  356.         sub edi, 7804h
  357.         jz  short loc_4005DF
  358.         sub edi, 10h
  359.         jz  short loc_4005EC
  360.  
  361. loc_4005D8:             ; CODE XREF: sub_400496+8Ej
  362.         mov esi, 0C0000010h
  363.         jmp short loc_4005EE
  364. ; ---------------------------------------------------------------------------
  365.  
  366. loc_4005DF:             ; CODE XREF: sub_400496+13Bj
  367.         mov eax, [ebx+0Ch]
  368.         mov al, [eax]
  369.         mov [ebp+var_4], edx
  370.         mov byte_40119C, al
  371.  
  372. loc_4005EC:             ; CODE XREF: sub_400496+71j
  373.                     ; sub_400496+7Aj ...
  374.         xor esi, esi
  375.  
  376. loc_4005EE:             ; CODE XREF: sub_400496+A4j
  377.                     ; sub_400496+E1j ...
  378.         mov eax, [ebp+var_4]
  379.         xor dl, dl      ; PriorityBoost
  380.         mov ecx, ebx    ; Irp
  381.         mov [ebx+18h], esi
  382.         mov [ebx+1Ch], eax
  383.         call    IofCompleteRequest
  384.         push    18h     ; RemlockSize
  385.         push    ebx     ; Tag
  386.         push    [ebp+RemoveLock] ; RemoveLock
  387.         call    IoReleaseRemoveLockEx
  388.         mov eax, esi
  389.  
  390. loc_40060F:             ; CODE XREF: sub_400496+48j
  391.         pop edi
  392.         pop esi
  393.         pop ebx
  394.         leave
  395.         retn    8
  396. sub_400496  endp
  397.  
  398.  
  399. ; =============== S U B R O U T I N E =======================================
  400.  
  401. ; Attributes: bp-based frame
  402.  
  403. sub_400616  proc near       ; CODE XREF: sub_4006C4+127p
  404.                     ; sub_4006C4+16Ep ...
  405.  
  406. arg_0       = dword ptr  8
  407. arg_4       = dword ptr  0Ch
  408. arg_8       = dword ptr  10h
  409. arg_C       = dword ptr  14h
  410.  
  411.         push    ebp
  412.         mov ebp, esp
  413.         mov ecx, eax
  414.         and ecx, 1Fh
  415.         shl ecx, 9
  416.         add [ebp+arg_0], ecx
  417.         mov ecx, [ebp+arg_4]
  418.         mov edx, [ebp+arg_0]
  419.         add edx, ecx
  420.         mov ecx, 4000h
  421.         shr eax, 5
  422.         cmp edx, ecx
  423.         jle short loc_40063E
  424.         sub ecx, [ebp+arg_0]
  425.         mov [ebp+arg_4], ecx
  426.  
  427. loc_40063E:             ; CODE XREF: sub_400616+20j
  428.         cmp eax, [esi+40h]
  429.         jb  short loc_400648
  430.         or  eax, 0FFFFFFFFh
  431.         jmp short loc_4006AA
  432. ; ---------------------------------------------------------------------------
  433.  
  434. loc_400648:             ; CODE XREF: sub_400616+2Bj
  435.         mov ecx, [esi+38h]
  436.         push    ebx
  437.         push    edi
  438.         mov edi, eax
  439.         shr eax, 6
  440.         mov ebx, eax
  441.         mov eax, [esi+34h]
  442.         shl ebx, 2
  443.         and edi, 3Fh
  444.         cmp [ebx+ecx], eax
  445.         jz  short loc_400688
  446.         push    eax     ; MemoryDescriptorList
  447.         push    dword ptr [esi+30h] ; BaseAddress
  448.         call    MmUnmapLockedPages
  449.         mov eax, [esi+38h]
  450.         mov ebx, [ebx+eax]
  451.         push    20h     ; Priority
  452.         xor eax, eax
  453.         push    eax     ; BugCheckOnFailure
  454.         push    eax     ; BaseAddress
  455.         push    1       ; CacheType
  456.         push    eax     ; AccessMode
  457.         push    ebx     ; MemoryDescriptorList
  458.         mov [esi+34h], ebx
  459.         call    MmMapLockedPagesSpecifyCache
  460.         mov [esi+30h], eax
  461.  
  462. loc_400688:             ; CODE XREF: sub_400616+4Aj
  463.         mov eax, [ebp+arg_8]
  464.         test    eax, eax
  465.         jz  short loc_40069A
  466.         shl edi, 0Eh
  467.         add edi, [esi+30h]
  468.         add edi, [ebp+arg_0]
  469.         mov [eax], edi
  470.  
  471. loc_40069A:             ; CODE XREF: sub_400616+77j
  472.         mov eax, [ebp+arg_C]
  473.         test    eax, eax
  474.         pop edi
  475.         pop ebx
  476.         jz  short loc_4006A8
  477.         mov ecx, [ebp+arg_4]
  478.         mov [eax], ecx
  479.  
  480. loc_4006A8:             ; CODE XREF: sub_400616+8Bj
  481.         xor eax, eax
  482.  
  483. loc_4006AA:             ; CODE XREF: sub_400616+30j
  484.         pop ebp
  485.         retn    10h
  486. sub_400616  endp
  487.  
  488. ; ---------------------------------------------------------------------------
  489. ; char aDWorkRdRamdi_0[]
  490. aDWorkRdRamdi_0 db 'd:\work\rd\ramdisk.c',0 ; DATA XREF: sub_4006C4+36o
  491.         align 4
  492.  
  493. ; =============== S U B R O U T I N E =======================================
  494.  
  495. ; Attributes: bp-based frame
  496. public sub_4006C4
  497. ; int __stdcall sub_4006C4(KIRQL NewIrql, PIRP Tag)
  498. sub_4006C4  proc near       ; DATA XREF: DriverEntry+82o
  499.  
  500. RemoveLock  = dword ptr -1Ch
  501. SpinLock    = dword ptr -18h
  502. var_14      = dword ptr -14h
  503. var_10      = dword ptr -10h
  504. var_C       = dword ptr -0Ch
  505. var_8       = dword ptr -8
  506. var_4       = dword ptr -4
  507. NewIrql     = byte ptr  8
  508. Tag     = dword ptr  0Ch
  509.  
  510.         push    ebp
  511.         mov ebp, esp
  512.         sub esp, 1Ch
  513.         mov eax, dword ptr [ebp+NewIrql]
  514.         push    esi
  515.         mov esi, [eax+28h]
  516.         cmp dword ptr [esi+0Ch], 1
  517.         push    edi
  518.         mov edi, [ebp+Tag]
  519.         mov [ebp+var_C], esi
  520.         jz  short loc_4006F3
  521.         and dword ptr [edi+1Ch], 0
  522.         xor dl, dl      ; PriorityBoost
  523.         mov ecx, edi    ; Irp
  524.         mov dword ptr [edi+18h], 0C0000184h
  525.         call    IofCompleteRequest
  526.  
  527. loc_4006F3:             ; CODE XREF: sub_4006C4+18j
  528.         push    18h     ; RemlockSize
  529.         push    24Ah        ; Line
  530.         push    offset aDWorkRdRamdi_0 ; "d:\\work\\rd\\ramdisk.c"
  531.         lea eax, [esi+10h]
  532.         push    edi     ; Tag
  533.         push    eax     ; RemoveLock
  534.         mov [ebp+RemoveLock], eax
  535.         call    IoAcquireRemoveLockEx
  536.         mov esi, eax
  537.         test    esi, esi
  538.         jge short loc_400729
  539.         and dword ptr [edi+1Ch], 0
  540.         xor dl, dl      ; PriorityBoost
  541.         mov ecx, edi    ; Irp
  542.         mov [edi+18h], esi
  543.         call    IofCompleteRequest
  544.         jmp loc_400899
  545. ; ---------------------------------------------------------------------------
  546.  
  547. loc_400729:             ; CODE XREF: sub_4006C4+4Dj
  548.         mov esi, [edi+60h]
  549.         mov edx, [esi+0Ch]
  550.         mov eax, [esi+4]
  551.         push    ebx
  552.         mov ebx, [esi+10h]
  553.         mov ecx, edx
  554.         shr ecx, 9
  555.         shl ebx, 17h
  556.         add ebx, ecx
  557.         mov ecx, 1FFh
  558.         test    ecx, eax
  559.         mov [ebp+var_8], eax
  560.         mov [ebp+var_4], eax
  561.         jnz loc_400875
  562.         test    ecx, edx
  563.         jnz loc_400875
  564.         mov edx, [ebp+var_C]
  565.         mov edx, [edx+64h]
  566.         mov ecx, eax
  567.         shr ecx, 9
  568.         add ecx, ebx
  569.         shl edx, 1
  570.         cmp ecx, edx
  571.         ja  loc_400875
  572.         mov ecx, [edi+4]
  573.         test    byte ptr [ecx+6], 5
  574.         jz  short loc_400783
  575.         mov ecx, [ecx+0Ch]
  576.         mov [ebp+Tag], ecx
  577.         jmp short loc_400799
  578. ; ---------------------------------------------------------------------------
  579.  
  580. loc_400783:             ; CODE XREF: sub_4006C4+B5j
  581.         push    10h     ; Priority
  582.         xor eax, eax
  583.         push    eax     ; BugCheckOnFailure
  584.         push    eax     ; BaseAddress
  585.         push    1       ; CacheType
  586.         push    eax     ; AccessMode
  587.         push    ecx     ; MemoryDescriptorList
  588.         call    MmMapLockedPagesSpecifyCache
  589.         mov [ebp+Tag], eax
  590.         mov eax, [ebp+var_8]
  591.  
  592. loc_400799:             ; CODE XREF: sub_4006C4+BDj
  593.         cmp [ebp+Tag], 0
  594.         jnz short loc_4007A9
  595.         mov ecx, 0C000009Ah
  596.         jmp loc_40087A
  597. ; ---------------------------------------------------------------------------
  598.  
  599. loc_4007A9:             ; CODE XREF: sub_4006C4+D9j
  600.         mov ecx, [ebp+var_C]
  601.         add ecx, 2Ch    ; SpinLock
  602.         mov [ebp+SpinLock], ecx
  603.         call    KfAcquireSpinLock
  604.         mov [ebp+0Bh], al
  605.         movzx   eax, byte ptr [esi]
  606.         sub eax, 3
  607.         jz  short loc_40081A
  608.         dec eax
  609.         jz  short loc_4007CF
  610.         and [ebp+var_8], 0
  611.         jmp loc_40085F
  612. ; ---------------------------------------------------------------------------
  613.  
  614. loc_4007CF:             ; CODE XREF: sub_4006C4+100j
  615.         cmp [ebp+var_8], 0
  616.         jbe loc_40085F
  617.  
  618. loc_4007D9:             ; CODE XREF: sub_4006C4+152j
  619.         mov esi, [ebp+var_C]
  620.         lea eax, [ebp+var_10]
  621.         push    eax
  622.         lea eax, [ebp+var_14]
  623.         push    eax
  624.         push    [ebp+var_4]
  625.         mov eax, ebx
  626.         push    0
  627.         call    sub_400616
  628.         test    eax, eax
  629.         jnz short loc_40085F
  630.         mov esi, [ebp+var_10]
  631.         push    esi     ; size_t
  632.         push    [ebp+Tag]   ; void *
  633.         push    [ebp+var_14]    ; void *
  634.         call    memmove
  635.         add [ebp+Tag], esi
  636.         sub [ebp+var_4], esi
  637.         shr esi, 9
  638.         add esp, 0Ch
  639.         add ebx, esi
  640.         cmp [ebp+var_4], 0
  641.         ja  short loc_4007D9
  642.         jmp short loc_40085F
  643. ; ---------------------------------------------------------------------------
  644.  
  645. loc_40081A:             ; CODE XREF: sub_4006C4+FDj
  646.         cmp [ebp+var_8], 0
  647.         jbe short loc_40085F
  648.  
  649. loc_400820:             ; CODE XREF: sub_4006C4+199j
  650.         mov esi, [ebp+var_C]
  651.         lea eax, [ebp+var_10]
  652.         push    eax
  653.         lea eax, [ebp+var_14]
  654.         push    eax
  655.         push    [ebp+var_4]
  656.         mov eax, ebx
  657.         push    0
  658.         call    sub_400616
  659.         test    eax, eax
  660.         jnz short loc_40085F
  661.         mov esi, [ebp+var_10]
  662.         push    esi     ; size_t
  663.         push    [ebp+var_14]    ; void *
  664.         push    [ebp+Tag]   ; void *
  665.         call    memmove
  666.         add [ebp+Tag], esi
  667.         sub [ebp+var_4], esi
  668.         shr esi, 9
  669.         add esp, 0Ch
  670.         add ebx, esi
  671.         cmp [ebp+var_4], 0
  672.         ja  short loc_400820
  673.  
  674. loc_40085F:             ; CODE XREF: sub_4006C4+106j
  675.                     ; sub_4006C4+10Fj ...
  676.         mov dl, [ebp+0Bh]   ; NewIrql
  677.         mov ecx, [ebp+SpinLock] ; SpinLock
  678.         call    KfReleaseSpinLock
  679.         mov eax, [ebp+var_8]
  680.         xor esi, esi
  681.         mov [edi+18h], esi
  682.         jmp short loc_40087F
  683. ; ---------------------------------------------------------------------------
  684.  
  685. loc_400875:             ; CODE XREF: sub_4006C4+89j
  686.                     ; sub_4006C4+91j ...
  687.         mov ecx, 0C000000Dh
  688.  
  689. loc_40087A:             ; CODE XREF: sub_4006C4+E0j
  690.         mov [edi+18h], ecx
  691.         mov esi, ecx
  692.  
  693. loc_40087F:             ; CODE XREF: sub_4006C4+1AFj
  694.         xor dl, dl      ; PriorityBoost
  695.         mov ecx, edi    ; Irp
  696.         mov [edi+1Ch], eax
  697.         call    IofCompleteRequest
  698.         push    18h     ; RemlockSize
  699.         push    edi     ; Tag
  700.         push    [ebp+RemoveLock] ; RemoveLock
  701.         call    IoReleaseRemoveLockEx
  702.         pop ebx
  703.  
  704. loc_400899:             ; CODE XREF: sub_4006C4+60j
  705.         pop edi
  706.         mov eax, esi
  707.         pop esi
  708.         leave
  709.         retn    8
  710. sub_4006C4  endp
  711.  
  712. ; ---------------------------------------------------------------------------
  713.         align 2
  714.  
  715. ; =============== S U B R O U T I N E =======================================
  716.  
  717. ; Attributes: bp-based frame
  718.  
  719. sub_4008A2  proc near       ; CODE XREF: sub_4015DC+165p
  720.                     ; sub_4015DC+192p ...
  721.  
  722. arg_0       = dword ptr  8
  723. arg_4       = dword ptr  0Ch
  724. arg_8       = dword ptr  10h
  725. arg_C       = dword ptr  14h
  726. arg_10      = dword ptr  18h
  727. arg_14      = dword ptr  1Ch
  728. arg_18      = byte ptr  20h
  729.  
  730.         push    ebp
  731.         mov ebp, esp
  732.         mov ecx, [ebp+arg_10]
  733.         mov edx, [ebp+arg_C]
  734.         mov eax, [ebp+arg_14]
  735.         push    esi
  736.         mov esi, [ebp+arg_8]
  737.         test    esi, esi
  738.         push    edi
  739.         jnz short loc_4008D6
  740.         movsx   edi, [ebp+arg_18]
  741.         push    ebx
  742.         mov ebx, [eax]
  743.         shr ebx, 8
  744.         shl edi, 18h
  745.         or  edi, ebx
  746.         mov bl, [ebp+arg_18]
  747.         mov [eax], edi
  748.         mov eax, [edx]
  749.         mov [eax], bl
  750.         inc dword ptr [edx]
  751.         dec dword ptr [ecx]
  752.         pop ebx
  753.         jmp short loc_4008FB
  754. ; ---------------------------------------------------------------------------
  755.  
  756. loc_4008D6:             ; CODE XREF: sub_4008A2+13j
  757.         cmp esi, 1
  758.         jnz short loc_4008E0
  759.         shr dword ptr [eax], 8
  760.         jmp short loc_4008FB
  761. ; ---------------------------------------------------------------------------
  762.  
  763. loc_4008E0:             ; CODE XREF: sub_4008A2+37j
  764.         cmp esi, 2
  765.         jnz short loc_4008ED
  766.         movzx   edi, word ptr [eax+2]
  767.  
  768. loc_4008E9:             ; CODE XREF: sub_4008A2+54j
  769.         mov [eax], edi
  770.         jmp short loc_4008FB
  771. ; ---------------------------------------------------------------------------
  772.  
  773. loc_4008ED:             ; CODE XREF: sub_4008A2+41j
  774.         cmp esi, 3
  775.         jnz short loc_4008F8
  776.         movzx   edi, byte ptr [eax+3]
  777.         jmp short loc_4008E9
  778. ; ---------------------------------------------------------------------------
  779.  
  780. loc_4008F8:             ; CODE XREF: sub_4008A2+4Ej
  781.         and dword ptr [eax], 0
  782.  
  783. loc_4008FB:             ; CODE XREF: sub_4008A2+32j
  784.                     ; sub_4008A2+3Cj ...
  785.         add [edx], esi
  786.         sub [ecx], esi
  787.         mov eax, [ecx]
  788.         test    eax, eax
  789.         jle short loc_400909
  790.         xor eax, eax
  791.         jmp short loc_40093D
  792. ; ---------------------------------------------------------------------------
  793.  
  794. loc_400909:             ; CODE XREF: sub_4008A2+61j
  795.         mov esi, [ebp+arg_4]
  796.         neg eax
  797.         sar eax, 0Eh
  798.         push    ecx
  799.         inc eax
  800.         add [esi], eax
  801.         mov ecx, [ecx]
  802.         mov eax, [esi]
  803.         mov esi, [ebp+arg_0]
  804.         push    edx
  805.         neg ecx
  806.         push    4000h
  807.         and ecx, 3FFFh
  808.         push    ecx
  809.         shl eax, 5
  810.         call    sub_400616
  811.         xor ecx, ecx
  812.         test    eax, eax
  813.         setnl   cl
  814.         dec ecx
  815.         mov eax, ecx
  816.  
  817. loc_40093D:             ; CODE XREF: sub_4008A2+65j
  818.         pop edi
  819.         pop esi
  820.         pop ebp
  821.         retn    1Ch
  822. sub_4008A2  endp
  823.  
  824. ; ---------------------------------------------------------------------------
  825.         align 4
  826. public loc_400944
  827. loc_400944:             ; DATA XREF: DriverEntry+A1o
  828.         mov eax, [esp+4]
  829.         push    esi
  830.         mov esi, [esp+0Ch]
  831.         push    edi
  832.         mov edi, [eax+28h]
  833.         cmp dword ptr [edi+0Ch], 5
  834.         push    esi
  835.         jnz short loc_400978
  836.         call    PoStartNextPowerIrp
  837.         and dword ptr [esi+1Ch], 0
  838.         mov edi, 0C0000056h
  839.         xor dl, dl
  840.         mov ecx, esi
  841.         mov [esi+18h], edi
  842.         call    IofCompleteRequest
  843.         mov eax, edi
  844.         jmp short loc_40098F
  845. ; ---------------------------------------------------------------------------
  846.  
  847. loc_400978:             ; CODE XREF: .text:00400956j
  848.         call    PoStartNextPowerIrp
  849.         inc byte ptr [esi+23h]
  850.         add dword ptr [esi+60h], 24h
  851.         push    esi
  852.         push    dword ptr [edi+4]
  853.         call    PoCallDriver
  854.  
  855. loc_40098F:             ; CODE XREF: .text:00400976j
  856.         pop edi
  857.         pop esi
  858.         retn    8
  859. ; ---------------------------------------------------------------------------
  860. public loc_400994
  861. loc_400994:             ; DATA XREF: DriverEntry+ABo
  862.         mov edx, [esp+8]
  863.         mov eax, [esp+4]
  864.         mov eax, [eax+28h]
  865.         inc byte ptr [edx+23h]
  866.         add dword ptr [edx+60h], 24h
  867.         mov ecx, [eax+4]
  868.         call    IofCallDriver
  869.         retn    8
  870. ; ---------------------------------------------------------------------------
  871.  
  872. loc_4009B2:             ; DATA XREF: sub_400E2E+DFo
  873.         push    0
  874.         push    0
  875.         push    dword ptr [esp+14h]
  876.         call    KeSetEvent
  877.         mov eax, 0C0000016h
  878.         retn    0Ch
  879.  
  880. ; =============== S U B R O U T I N E =======================================
  881.  
  882.  
  883. sub_4009C8  proc near       ; CODE XREF: sub_400A70+4Bp
  884.                     ; sub_400B14+95p ...
  885.  
  886. arg_0       = dword ptr  4
  887.  
  888.         mov eax, [esp+arg_0]
  889.         push    esi
  890.         mov esi, [eax+28h]
  891.         test    byte ptr [esi+28h], 1
  892.         jz  short loc_4009E3
  893.         lea eax, [esi+84h]
  894.         push    eax     ; SymbolicLinkName
  895.         call    IoDeleteSymbolicLink
  896.  
  897. loc_4009E3:             ; CODE XREF: sub_4009C8+Cj
  898.         mov eax, [esi+88h]
  899.         push    ebp
  900.         xor ebp, ebp
  901.         cmp eax, ebp
  902.         push    edi
  903. ;       mov edi, offset ExFreePoolWithTag
  904.         jz  short loc_4009FB
  905.         push    ebp     ; Tag
  906.         push    eax     ; P
  907.         call    ExFreePoolWithTag
  908.  
  909. loc_4009FB:             ; CODE XREF: sub_4009C8+2Dj
  910.         mov eax, [esi+80h]
  911.         cmp eax, ebp
  912.         jz  short loc_400A09
  913.         push    ebp     ; Tag
  914.         push    eax     ; P
  915.         call    ExFreePoolWithTag
  916.  
  917. loc_400A09:             ; CODE XREF: sub_4009C8+3Bj
  918.         mov eax, [esi+7Ch]
  919.         cmp eax, ebp
  920.         jz  short loc_400A14
  921.         push    ebp     ; Tag
  922.         push    eax     ; P
  923.         call    ExFreePoolWithTag
  924.  
  925. loc_400A14:             ; CODE XREF: sub_4009C8+46j
  926.         mov eax, [esi+30h]
  927.         cmp eax, ebp
  928.         jz  short loc_400A25
  929.         push    dword ptr [esi+34h] ; MemoryDescriptorList
  930.         push    eax     ; BaseAddress
  931.         call    MmUnmapLockedPages
  932.  
  933. loc_400A25:             ; CODE XREF: sub_4009C8+51j
  934.         cmp [esi+38h], ebp
  935.         jz  short loc_400A59
  936.         push    ebx
  937.         xor ebx, ebx
  938.         cmp [esi+3Ch], ebp
  939.         jbe short loc_400A52
  940.  
  941. loc_400A32:             ; CODE XREF: sub_4009C8+88j
  942.         mov eax, [esi+38h]
  943.         mov eax, [eax+ebx*4]
  944.         cmp eax, ebp
  945.         jz  short loc_400A4C
  946.         push    eax     ; MemoryDescriptorList
  947.         call    MmFreePagesFromMdl
  948.         mov eax, [esi+38h]
  949.         push    ebp     ; Tag
  950.         push    dword ptr [eax+ebx*4] ; P
  951.         call    ExFreePoolWithTag
  952.  
  953. loc_400A4C:             ; CODE XREF: sub_4009C8+72j
  954.         inc ebx
  955.         cmp ebx, [esi+3Ch]
  956.         jb  short loc_400A32
  957.  
  958. loc_400A52:             ; CODE XREF: sub_4009C8+68j
  959.         push    ebp     ; Tag
  960.         push    dword ptr [esi+38h] ; P
  961.         call    ExFreePoolWithTag
  962.         pop ebx
  963.  
  964. loc_400A59:             ; CODE XREF: sub_4009C8+60j
  965.         mov esi, [esi+4]
  966.         pop edi
  967.         cmp esi, ebp
  968.         pop ebp
  969.         jz  short loc_400A69
  970.         push    esi     ; TargetDevice
  971.         call    IoDetachDevice
  972.  
  973. loc_400A69:             ; CODE XREF: sub_4009C8+98j
  974.         pop esi
  975.         jmp IoDeleteDevice
  976. sub_4009C8  endp
  977.  
  978.  
  979. ; =============== S U B R O U T I N E =======================================
  980.  
  981.  
  982. ; int __stdcall sub_400A70(int, PIRP Tag)
  983. sub_400A70  proc near       ; CODE XREF: sub_400E2E+A0p
  984.  
  985. arg_0       = dword ptr  4
  986. Tag     = dword ptr  8
  987.  
  988.         push    ebx
  989.         mov ebx, [esp+4+arg_0]
  990.         push    esi
  991.         mov esi, [esp+8+Tag]
  992.         push    edi
  993.         mov edi, [ebx+28h]
  994.         and dword ptr [esi+18h], 0
  995.         inc byte ptr [esi+23h]
  996.         add dword ptr [esi+60h], 24h
  997.         mov ecx, [edi+4]    ; DeviceObject
  998.         mov edx, esi    ; Irp
  999.         call    IofCallDriver
  1000.         push    18h     ; RemlockSize
  1001.         mov dword ptr [edi+0Ch], 5
  1002.         push    esi     ; Tag
  1003.         add edi, 10h
  1004.         push    edi     ; RemoveLock
  1005.         call    IoReleaseRemoveLockAndWaitEx
  1006.         push    offset DriverEntry ; ClientIdentificationAddress
  1007.         push    dword ptr [ebx+8] ; DriverObject
  1008.         call    IoGetDriverObjectExtension
  1009.         and dword ptr [eax+8], 0
  1010.         push    ebx
  1011.         call    sub_4009C8
  1012.         pop edi
  1013.         pop esi
  1014.         pop ebx
  1015.         retn    8
  1016. sub_400A70  endp
  1017.  
  1018. ; ---------------------------------------------------------------------------
  1019. ; const WCHAR srcstring
  1020. srcstring   dw 5Ch          ; DATA XREF: sub_400B14+2Fo
  1021. aDeviceHarddisk:
  1022.         unicode 0, <Device\HarddiskVolumeRD>,0
  1023.         db 2 dup(0)
  1024. ; const WCHAR word_400AFA
  1025. word_400AFA dw 5Ch          ; DATA XREF: sub_400B14+276o
  1026. aDosdevices:
  1027.         unicode 0, <DosDevices\>,0
  1028.  
  1029. ; =============== S U B R O U T I N E =======================================
  1030.  
  1031. ; Attributes: bp-based frame
  1032. public sub_400B14
  1033. ; int __stdcall sub_400B14(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT TargetDevice)
  1034. sub_400B14  proc near       ; DATA XREF: DriverEntry+B5o
  1035.  
  1036. var_28      = dword ptr -28h
  1037. SourceString    = UNICODE_STRING ptr -24h
  1038. DestinationString= UNICODE_STRING ptr -1Ch
  1039. var_14      = dword ptr -14h
  1040. var_10      = dword ptr -10h
  1041. LowAddress  = PHYSICAL_ADDRESS ptr -0Ch
  1042. SourceDevice    = dword ptr -4
  1043. DriverObject    = dword ptr  8
  1044. TargetDevice    = dword ptr  0Ch
  1045.  
  1046.         push    ebp
  1047.         mov ebp, esp
  1048.         sub esp, 2Ch
  1049.         push    esi
  1050.         push    offset DriverEntry ; ClientIdentificationAddress
  1051.         push    [ebp+DriverObject] ; DriverObject
  1052.         xor esi, esi
  1053.         inc esi
  1054.         mov [ebp+LowAddress.HighPart], esi
  1055.         call    IoGetDriverObjectExtension
  1056.         cmp [eax+8], esi
  1057.         mov [ebp+var_14], eax
  1058.         jnz short loc_400B41
  1059.         mov eax, 0C0000038h
  1060.         jmp loc_400E16
  1061. ; ---------------------------------------------------------------------------
  1062.  
  1063. loc_400B41:             ; CODE XREF: sub_400B14+21j
  1064.         push    ebx
  1065.         push    edi
  1066.         push    offset srcstring ; SourceString
  1067.         lea eax, [ebp+DestinationString]
  1068.         push    eax     ; DestinationString
  1069.         call    RtlInitUnicodeString
  1070.         lea eax, [ebp+SourceDevice]
  1071.         push    eax
  1072.         xor ebx, ebx
  1073.         push    ebx
  1074.         push    100h
  1075.         push    24h
  1076.         jmp short loc_400BE1
  1077. ; ---------------------------------------------------------------------------
  1078.  
  1079. loc_400B62:             ; CODE XREF: sub_400B14+E4j
  1080.         mov eax, [ebp+SourceDevice]
  1081.         mov esi, [eax+28h]
  1082.         push    24h
  1083.         pop ecx
  1084.         push    316D6152h   ; Tag
  1085.         xor eax, eax
  1086.         mov edi, esi
  1087.         push    14h     ; NumberOfBytes
  1088.         rep stosd
  1089.         mov edi, offset ExAllocatePoolWithTag
  1090.         push    1       ; PoolType
  1091.         call    edi ; ExAllocatePoolWithTag
  1092.         cmp eax, ebx
  1093.         mov [esi+7Ch], eax
  1094.         jz  short loc_400C03
  1095.         lea eax, [esi+60h]
  1096.         push    eax
  1097.         push    [ebp+var_14]
  1098.         mov word ptr [esi+7Ah], 14h
  1099.         call    sub_401300
  1100.         mov eax, [esi+6Ch]
  1101.         cmp eax, [ebp+LowAddress.HighPart]
  1102.         jz  short loc_400C17
  1103.         push    [ebp+SourceDevice]
  1104.         mov [ebp+LowAddress.HighPart], eax
  1105.         call    sub_4009C8
  1106.         mov eax, [ebp+LowAddress.HighPart]
  1107.         dec eax
  1108.         jz  short loc_400BD0
  1109.         dec eax
  1110.         jz  short loc_400BCC
  1111.         dec eax
  1112.         jz  short loc_400BC5
  1113.         dec eax
  1114.         jnz short loc_400C0D
  1115.         push    7
  1116.         pop ecx
  1117.         push    5
  1118.         pop eax
  1119.         jmp short loc_400BD5
  1120. ; ---------------------------------------------------------------------------
  1121.  
  1122. loc_400BC5:             ; CODE XREF: sub_400B14+A4j
  1123.         xor eax, eax
  1124.         push    7
  1125.         inc eax
  1126.         jmp short loc_400BD4
  1127. ; ---------------------------------------------------------------------------
  1128.  
  1129. loc_400BCC:             ; CODE XREF: sub_400B14+A1j
  1130.         push    7
  1131.         jmp short loc_400BD2
  1132. ; ---------------------------------------------------------------------------
  1133.  
  1134. loc_400BD0:             ; CODE XREF: sub_400B14+9Ej
  1135.         push    24h
  1136.  
  1137. loc_400BD2:             ; CODE XREF: sub_400B14+BAj
  1138.         xor eax, eax
  1139.  
  1140. loc_400BD4:             ; CODE XREF: sub_400B14+B6j
  1141.         pop ecx
  1142.  
  1143. loc_400BD5:             ; CODE XREF: sub_400B14+AFj
  1144.         lea edx, [ebp+SourceDevice]
  1145.         push    edx     ; DeviceObject
  1146.         push    ebx     ; Exclusive
  1147.         or  eax, 100h
  1148.         push    eax     ; DeviceCharacteristics
  1149.         push    ecx     ; DeviceType
  1150.  
  1151. loc_400BE1:             ; CODE XREF: sub_400B14+4Cj
  1152.         lea eax, [ebp+DestinationString]
  1153.         push    eax     ; DeviceName
  1154.         push    90h     ; DeviceExtensionSize
  1155.         push    [ebp+DriverObject] ; DriverObject
  1156.         call    IoCreateDevice
  1157.         cmp eax, ebx
  1158.         mov [ebp+var_10], eax
  1159.         jge loc_400B62
  1160.         jmp loc_400E14
  1161. ; ---------------------------------------------------------------------------
  1162.  
  1163. loc_400C03:             ; CODE XREF: sub_400B14+73j
  1164.                     ; sub_400B14+20Ej ...
  1165.         mov edi, 0C000009Ah
  1166.         jmp loc_400DF7
  1167. ; ---------------------------------------------------------------------------
  1168.  
  1169. loc_400C0D:             ; CODE XREF: sub_400B14+A7j
  1170.         mov eax, 0C000009Ah
  1171.         jmp loc_400E14
  1172. ; ---------------------------------------------------------------------------
  1173.  
  1174. loc_400C17:             ; CODE XREF: sub_400B14+8Dj
  1175.         mov eax, [ebp+TargetDevice]
  1176.         push    18h     ; RemlockSize
  1177.         push    0Ah     ; HighWatermark
  1178.         mov [esi+8], eax
  1179.         mov eax, [ebp+SourceDevice]
  1180.         push    1       ; MaxLockedMinutes
  1181.         mov [esi], eax
  1182.         push    'lmaR'          ; AllocateTag
  1183.         lea eax, [esi+10h]
  1184.         push    eax     ; Lock
  1185.         mov [esi+0Ch], ebx
  1186.         call    IoInitializeRemoveLockEx
  1187.         mov eax, [ebp+SourceDevice]
  1188.         or  byte ptr [eax+1Dh], 20h
  1189.         mov eax, [ebp+SourceDevice]
  1190.         or  dword ptr [eax+1Ch], 10h
  1191.         lea eax, [esi+2Ch]
  1192.         push    eax     ; SpinLock
  1193.         call    KeInitializeSpinLock
  1194.         mov eax, [esi+68h]
  1195.         mov ecx, eax
  1196.         shl ecx, 6
  1197.         mov [esi+44h], ecx
  1198.         mov ecx, [esi+60h]
  1199.         mov [esi+3Ch], eax
  1200.         push    '1maR'          ; Tag
  1201.         shl eax, 2
  1202.         push    eax     ; NumberOfBytes
  1203.         shl ecx, 6
  1204.         push    ebx     ; PoolType
  1205.         mov [esi+40h], ecx
  1206.         call    edi ; ExAllocatePoolWithTag
  1207.         mov ecx, [esi+3Ch]
  1208.         or  [ebp+var_28], 0FFFFFFFFh
  1209.         shl ecx, 2
  1210.         mov edx, ecx
  1211.         shr ecx, 2
  1212.         mov edi, eax
  1213.         xor eax, eax
  1214.         mov [esi+38h], edi
  1215.         rep stosd
  1216.         mov ecx, edx
  1217.         and ecx, 3
  1218.         rep stosb
  1219.         cmp [esi+3Ch], ebx
  1220.         mov [ebp+LowAddress.LowPart], ebx
  1221.         mov [ebp+LowAddress.HighPart], 1
  1222.         mov [ebp+DriverObject], ebx
  1223.         jbe short loc_400D1C
  1224.         mov edi, 100000h
  1225.  
  1226. loc_400CAB:             ; CODE XREF: sub_400B14+1FBj
  1227.                     ; sub_400B14+206j
  1228.         push    edi     ; TotalBytes
  1229.         xor eax, eax
  1230.         push    eax
  1231.         push    eax     ; SkipBytes
  1232.         push    [ebp+var_28]
  1233.         or  eax, 0FFFFFFFFh
  1234.         push    eax     ; HighAddress
  1235.         push    [ebp+LowAddress.HighPart]
  1236.         push    [ebp+LowAddress.LowPart] ; LowAddress
  1237.         call    MmAllocatePagesForMdl
  1238.         mov ecx, [esi+38h]
  1239.         mov edx, [ebp+DriverObject]
  1240.         mov [ecx+edx*4], eax
  1241.         mov eax, [esi+38h]
  1242.         mov ecx, edx
  1243.         mov eax, [eax+ecx*4]
  1244.         cmp eax, ebx
  1245.         jz  short loc_400CF8
  1246.         cmp [eax+14h], edi
  1247.         jnb short loc_400D13
  1248.         cmp eax, ebx
  1249.         jz  short loc_400CF8
  1250.         push    eax     ; MemoryDescriptorList
  1251.         call    MmFreePagesFromMdl
  1252.         mov eax, [esi+38h]
  1253.         mov ecx, [ebp+DriverObject]
  1254.         push    ebx     ; Tag
  1255.         push    dword ptr [eax+ecx*4] ; P
  1256.         call    ExFreePoolWithTag
  1257.  
  1258. loc_400CF8:             ; CODE XREF: sub_400B14+1C2j
  1259.                     ; sub_400B14+1CBj
  1260.         mov eax, [ebp+LowAddress.LowPart]
  1261.         mov ecx, [ebp+LowAddress.HighPart]
  1262.         shrd    eax, ecx, 1
  1263.         shr ecx, 1
  1264.         cmp eax, 1000000h
  1265.         mov [ebp+LowAddress.LowPart], eax
  1266.         mov [ebp+LowAddress.HighPart], ecx
  1267.         jnb short loc_400CAB
  1268.         jmp short loc_400D1C
  1269. ; ---------------------------------------------------------------------------
  1270.  
  1271. loc_400D13:             ; CODE XREF: sub_400B14+1C7j
  1272.         inc ecx
  1273.         cmp ecx, [esi+3Ch]
  1274.         mov [ebp+DriverObject], ecx
  1275.         jb  short loc_400CAB
  1276.  
  1277. loc_400D1C:             ; CODE XREF: sub_400B14+190j
  1278.                     ; sub_400B14+1FDj
  1279.         mov eax, [ebp+DriverObject]
  1280.         cmp eax, [esi+3Ch]
  1281.         jb  loc_400C03
  1282.         mov eax, [esi+38h]
  1283.         mov eax, [eax]
  1284.         push    20h     ; Priority
  1285.         push    ebx     ; BugCheckOnFailure
  1286.         push    ebx     ; BaseAddress
  1287.         push    1       ; CacheType
  1288.         push    ebx     ; AccessMode
  1289.         push    eax     ; MemoryDescriptorList
  1290.         mov [esi+34h], eax
  1291.         call    MmMapLockedPagesSpecifyCache
  1292.         cmp eax, ebx
  1293.         mov [esi+30h], eax
  1294.         jz  loc_400C03
  1295.         push    [ebp+SourceDevice]
  1296.         call    sub_4015DC
  1297.         lea edi, [esi+80h]
  1298.         mov eax, [edi]
  1299.         cmp eax, ebx
  1300.         jz  short loc_400D67
  1301.         push    ebx     ; Tag
  1302.         push    eax     ; P
  1303.         call    ExFreePoolWithTag
  1304.         mov [edi], ebx
  1305.  
  1306. loc_400D67:             ; CODE XREF: sub_400B14+247j
  1307.         push    316D6152h   ; Tag
  1308.         push    2Eh     ; NumberOfBytes
  1309.         push    1       ; PoolType
  1310.         call    ExAllocatePoolWithTag
  1311.         cmp eax, ebx
  1312.         mov [esi+88h], eax
  1313.         jz  loc_400C03
  1314.         cmp [esi+78h], bx
  1315.         jz  short loc_400DDC
  1316.         push    offset word_400AFA ; SourceString
  1317.         lea eax, [ebp+SourceString]
  1318.         push    eax     ; DestinationString
  1319.         call    RtlInitUnicodeString
  1320.         mov word ptr [esi+86h], 2Eh
  1321.         mov ax, [ebp+SourceString.Length]
  1322.         lea edi, [esi+84h]
  1323.         mov [edi], ax
  1324.         lea eax, [ebp+SourceString]
  1325.         push    eax     ; SourceString
  1326.         push    edi     ; DestinationString
  1327.         call    RtlCopyUnicodeString
  1328.         lea eax, [esi+78h]
  1329.         push    eax     ; Source
  1330.         push    edi     ; Destination
  1331.         call    RtlAppendUnicodeStringToString
  1332.         lea eax, [ebp+DestinationString]
  1333.         push    eax     ; DeviceName
  1334.         push    edi     ; SymbolicLinkName
  1335.         call    IoCreateSymbolicLink
  1336.         mov edi, eax
  1337.         cmp edi, ebx
  1338.         jl  short loc_400DF7
  1339.         or  dword ptr [esi+28h], 1
  1340.         jmp short loc_400DDF
  1341. ; ---------------------------------------------------------------------------
  1342.  
  1343. loc_400DDC:             ; CODE XREF: sub_400B14+274j
  1344.         mov edi, [ebp+var_10]
  1345.  
  1346. loc_400DDF:             ; CODE XREF: sub_400B14+2C6j
  1347.         push    [ebp+TargetDevice] ; TargetDevice
  1348.         push    [ebp+SourceDevice] ; SourceDevice
  1349.         call    IoAttachDeviceToDeviceStack
  1350.         cmp eax, ebx
  1351.         mov [esi+4], eax
  1352.         jnz short loc_400E01
  1353.         mov edi, 0C000000Eh
  1354.  
  1355. loc_400DF7:             ; CODE XREF: sub_400B14+F4j
  1356.                     ; sub_400B14+2C0j
  1357.         push    [ebp+SourceDevice]
  1358.         call    sub_4009C8
  1359.         jmp short loc_400E12
  1360. ; ---------------------------------------------------------------------------
  1361.  
  1362. loc_400E01:             ; CODE XREF: sub_400B14+2DCj
  1363.         mov eax, [ebp+var_14]
  1364.         mov dword ptr [eax+8], 1
  1365.         mov eax, [ebp+SourceDevice]
  1366.         and byte ptr [eax+1Ch], 7Fh
  1367.  
  1368. loc_400E12:             ; CODE XREF: sub_400B14+2EBj
  1369.         mov eax, edi
  1370.  
  1371. loc_400E14:             ; CODE XREF: sub_400B14+EAj
  1372.                     ; sub_400B14+FEj
  1373.         pop edi
  1374.         pop ebx
  1375.  
  1376. loc_400E16:             ; CODE XREF: sub_400B14+28j
  1377.         pop esi
  1378.         leave
  1379.         retn    8
  1380. sub_400B14  endp
  1381.  
  1382. ; ---------------------------------------------------------------------------
  1383.         align 4
  1384. ; char aDWorkRdPnp_c[]
  1385. aDWorkRdPnp_c   db 'd:\work\rd\pnp.c',0 ; DATA XREF: sub_400E2E+1Fo
  1386.         align 2
  1387.  
  1388. ; =============== S U B R O U T I N E =======================================
  1389.  
  1390. ; Attributes: bp-based frame
  1391. public sub_400E2E
  1392. ; int __stdcall sub_400E2E(int, PVOID Irp)
  1393. sub_400E2E  proc near       ; DATA XREF: DriverEntry+97o
  1394.  
  1395. Event       = dword ptr -18h;_KEVENT ptr -18h
  1396. RemoveLock  = dword ptr -8
  1397. var_4       = dword ptr -4
  1398. arg_0       = dword ptr  8
  1399. Irp     = dword ptr  0Ch
  1400.  
  1401.         push    ebp
  1402.         mov ebp, esp
  1403.         sub esp, 18h
  1404.         push    ebx
  1405.         mov ebx, [ebp+Irp]
  1406.         mov eax, [ebx+60h]
  1407.         push    esi
  1408.         push    edi
  1409.         push    18h     ; RemlockSize
  1410.         mov [ebp+Irp], eax
  1411.         mov eax, [ebp+arg_0]
  1412.         mov esi, [eax+28h]
  1413.         push    181h        ; Line
  1414.         push    offset aDWorkRdPnp_c ; "d:\\work\\rd\\pnp.c"
  1415.         lea eax, [esi+10h]
  1416.         push    ebx     ; Tag
  1417.         push    eax     ; RemoveLock
  1418.         mov [ebp+var_4], esi
  1419.         mov [ebp+RemoveLock], eax
  1420.         call    IoAcquireRemoveLockEx
  1421.         mov edi, eax
  1422.         xor eax, eax
  1423.         cmp edi, eax
  1424.         jge short loc_400E80
  1425.         xor dl, dl      ; PriorityBoost
  1426.         mov ecx, ebx    ; Irp
  1427.         mov [ebx+18h], edi
  1428.         mov [ebx+1Ch], eax
  1429.         call    IofCompleteRequest
  1430.         jmp loc_400FAB
  1431. ; ---------------------------------------------------------------------------
  1432.  
  1433. loc_400E80:             ; CODE XREF: sub_400E2E+3Bj
  1434.         mov ecx, [ebp+Irp]
  1435.         movzx   ecx, byte ptr [ecx+1]
  1436.         push    4
  1437.         pop edx
  1438.         cmp ecx, edx
  1439.         jg  loc_400F5C
  1440.         jz  loc_400F57
  1441.         sub ecx, eax
  1442.         jz  short loc_400EE4
  1443.         dec ecx
  1444.         jz  short loc_400ED8
  1445.         dec ecx
  1446.         jz  short loc_400ECA
  1447.         dec ecx
  1448.         jnz loc_400F8B
  1449.         cmp dword ptr [esi+0Ch], 3
  1450.         jz  loc_400F78
  1451.  
  1452. loc_400EB3:             ; CODE XREF: sub_400E2E+144j
  1453.         xor edi, edi
  1454.         mov [ebx+18h], eax
  1455.         mov [ebx+1Ch], eax
  1456.  
  1457. loc_400EBB:             ; CODE XREF: sub_400E2E+124j
  1458.         xor dl, dl      ; PriorityBoost
  1459.         mov ecx, ebx    ; Irp
  1460.         call    IofCompleteRequest
  1461.         jmp loc_400F9F
  1462. ; ---------------------------------------------------------------------------
  1463.  
  1464. loc_400ECA:             ; CODE XREF: sub_400E2E+72j
  1465.         push    ebx     ; Tag
  1466.         push    [ebp+arg_0] ; int
  1467.         call    sub_400A70
  1468.         jmp loc_400FAB
  1469. ; ---------------------------------------------------------------------------
  1470.  
  1471. loc_400ED8:             ; CODE XREF: sub_400E2E+6Fj
  1472.         mov dword ptr [esi+0Ch], 3
  1473.         jmp loc_400F88
  1474. ; ---------------------------------------------------------------------------
  1475.  
  1476. loc_400EE4:             ; CODE XREF: sub_400E2E+6Cj
  1477.         push    eax     ; State
  1478.         push    eax     ; Type
  1479.         lea eax, [ebp+Event]
  1480.         push    eax     ; Event
  1481.         call    KeInitializeEvent
  1482.         mov esi, [ebx+60h]
  1483.         lea eax, [esi-24h]
  1484.         push    7
  1485.         mov edi, eax
  1486.         pop ecx
  1487.         rep movsd
  1488.         mov esi, [ebp+var_4]
  1489.         mov byte ptr [eax+3], 0
  1490.         mov eax, [ebx+60h]
  1491.         sub eax, 24h
  1492.         lea ecx, [ebp+Event]
  1493.         mov dword ptr [eax+1Ch], offset loc_4009B2
  1494.         mov [eax+20h], ecx
  1495.         mov byte ptr [eax+3], 0E0h
  1496.         mov ecx, [esi+4]    ; DeviceObject
  1497.         mov edx, ebx    ; Irp
  1498.         call    IofCallDriver
  1499.         mov edi, eax
  1500.         cmp edi, 103h
  1501.         jnz short loc_400F40
  1502.         xor eax, eax
  1503.         push    eax     ; Timeout
  1504.         push    eax     ; Alertable
  1505.         push    eax     ; WaitMode
  1506.         push    eax     ; WaitReason
  1507.         lea eax, [ebp+Event]
  1508.         push    eax     ; Object
  1509.         call    KeWaitForSingleObject
  1510.  
  1511. loc_400F40:             ; CODE XREF: sub_400E2E+100j
  1512.         test    edi, edi
  1513.         jl  short loc_400F4B
  1514.         mov dword ptr [esi+0Ch], 1
  1515.  
  1516. loc_400F4B:             ; CODE XREF: sub_400E2E+114j
  1517.         and dword ptr [ebx+1Ch], 0
  1518.         mov [ebx+18h], edi
  1519.         jmp loc_400EBB
  1520. ; ---------------------------------------------------------------------------
  1521.  
  1522. loc_400F57:             ; CODE XREF: sub_400E2E+64j
  1523.         mov [esi+0Ch], eax
  1524.         jmp short loc_400F88
  1525. ; ---------------------------------------------------------------------------
  1526.  
  1527. loc_400F5C:             ; CODE XREF: sub_400E2E+5Ej
  1528.         sub ecx, 5
  1529.         jz  short loc_400F81
  1530.         dec ecx
  1531.         jz  short loc_400F6E
  1532.         sub ecx, 11h
  1533.         jnz short loc_400F8B
  1534.         mov [esi+0Ch], edx
  1535.         jmp short loc_400F88
  1536. ; ---------------------------------------------------------------------------
  1537.  
  1538. loc_400F6E:             ; CODE XREF: sub_400E2E+134j
  1539.         cmp dword ptr [esi+0Ch], 2
  1540.         jnz loc_400EB3
  1541.  
  1542. loc_400F78:             ; CODE XREF: sub_400E2E+7Fj
  1543.         mov dword ptr [esi+0Ch], 1
  1544.         jmp short loc_400F88
  1545. ; ---------------------------------------------------------------------------
  1546.  
  1547. loc_400F81:             ; CODE XREF: sub_400E2E+131j
  1548.         mov dword ptr [esi+0Ch], 2
  1549.  
  1550. loc_400F88:             ; CODE XREF: sub_400E2E+B1j
  1551.                     ; sub_400E2E+12Cj ...
  1552.         mov [ebx+18h], eax
  1553.  
  1554. loc_400F8B:             ; CODE XREF: sub_400E2E+75j
  1555.                     ; sub_400E2E+139j
  1556.         add dword ptr [ebx+60h], 24h
  1557.         inc byte ptr [ebx+23h]
  1558.         mov ecx, [esi+4]    ; DeviceObject
  1559.         mov edx, ebx    ; Irp
  1560.         call    IofCallDriver
  1561.         mov edi, eax
  1562.  
  1563. loc_400F9F:             ; CODE XREF: sub_400E2E+97j
  1564.         push    18h     ; RemlockSize
  1565.         push    ebx     ; Tag
  1566.         push    [ebp+RemoveLock] ; RemoveLock
  1567.         call    IoReleaseRemoveLockEx
  1568.  
  1569. loc_400FAB:             ; CODE XREF: sub_400E2E+4Dj
  1570.                     ; sub_400E2E+A5j
  1571.         mov eax, edi
  1572.         pop edi
  1573.         pop esi
  1574.         pop ebx
  1575.         leave
  1576.         retn    8
  1577. sub_400E2E  endp
  1578.  
  1579. ; ---------------------------------------------------------------------------
  1580. ;       align 80h
  1581. ;_text      ends
  1582.  
  1583.  
  1584.  
  1585. ; ===========================================================================
  1586.  
  1587. ; Segment type: Pure data
  1588. ; Segment permissions: Read
  1589. ;_rdata     segment para public 'DATA' use32
  1590. ;       assume cs:_rdata
  1591.         ;org 401090h
  1592.         db    0
  1593.         db    0
  1594.         db    0
  1595.         db    0
  1596.         db 0B7h ; ·
  1597.         db  2Dh ; -
  1598.         db 0D5h ; Ð¥
  1599.         db  3Fh ; ?
  1600.         db    0
  1601.         db    0
  1602.         db    0
  1603.         db    0
  1604.         db    2
  1605.         db    0
  1606.         db    0
  1607.         db    0
  1608.         db  44h ; D
  1609.         db    0
  1610.         db    0
  1611.         db    0
  1612.         db 0F8h ; ш
  1613.         db  10h
  1614.         db    0
  1615.         db    0
  1616.         db 0F8h ; ш
  1617.         db  10h
  1618.         db    0
  1619.         db    0
  1620. aUnknown    db 'UNKNOWN',0          ; DATA XREF: .data:00401198o
  1621. aRemoved    db 'REMOVED',0          ; DATA XREF: .data:00401194o
  1622. aSurpriseremove db 'SURPRISEREMOVED',0  ; DATA XREF: .data:00401190o
  1623. aPendingremove  db 'PENDINGREMOVE',0    ; DATA XREF: .data:0040118Co
  1624.         db    0
  1625.         db    0
  1626. aPendingstop    db 'PENDINGSTOP',0      ; DATA XREF: .data:00401188o
  1627. aWorking    db 'WORKING',0          ; DATA XREF: .data:00401184o
  1628. aStopped    db 'STOPPED',0          ; DATA XREF: .data:00401180o
  1629.  
  1630.         db    0
  1631.         db    0
  1632. ;_rdata     ends
  1633.  
  1634. ; Section 3. (virtual address 00001180)
  1635. ; Virtual size          : 0000001D (     29.)
  1636. ; Section size in file      : 00000080 (    128.)
  1637. ; Offset to raw data for section: 00001180
  1638. ; Flags C8000040: Data Not pageable Readable Writable
  1639. ; Alignment : default
  1640. ; ===========================================================================
  1641.  
  1642. ; Segment type: Pure data
  1643. ; Segment permissions: Read/Write
  1644. ;_data      segment para public 'DATA' use32
  1645. ;       assume cs:_data
  1646.         ;org 401180h
  1647.         dd offset aStopped  ; "STOPPED"
  1648.         dd offset aWorking  ; "WORKING"
  1649.         dd offset aPendingstop  ; "PENDINGSTOP"
  1650.         dd offset aPendingremove ; "PENDINGREMOVE"
  1651.         dd offset aSurpriseremove ; "SURPRISEREMOVED"
  1652.         dd offset aRemoved  ; "REMOVED"
  1653.         dd offset aUnknown  ; "UNKNOWN"
  1654. byte_40119C db 0            ; DATA XREF: sub_400496:loc_40053Fr
  1655.                     ; sub_400496+151w ...
  1656. ;       align 80h
  1657. ;_data      ends
  1658.  
  1659. ; Section 4. (virtual address 00001200)
  1660. ; Virtual size          : 00000C1E (   3102.)
  1661. ; Section size in file      : 00000C80 (   3200.)
  1662. ; Offset to raw data for section: 00001200
  1663. ; Flags 60000020: Text Executable Readable
  1664. ; Alignment : default
  1665. ; ===========================================================================
  1666.  
  1667. ; Segment type: Pure code
  1668. ; Segment permissions: Read/Execute
  1669. ;PAGE       segment para public 'CODE' use32
  1670. ;       assume cs:PAGE
  1671. ;       ;org 401200h
  1672. ;       assume es:nothing, ss:nothing, _data, fs:nothing, gs:nothing
  1673.  
  1674. public loc_401200
  1675. loc_401200:             ; DATA XREF: DriverEntry+77o
  1676.         mov ecx, [esp+8]
  1677.         mov eax, [ecx+60h]
  1678.         movzx   eax, byte ptr [eax]
  1679.         xor edx, edx
  1680.         push    esi
  1681.         xor esi, esi
  1682.         sub eax, edx
  1683.         mov [ecx+1Ch], edx
  1684.         jz  short loc_401226
  1685.         dec eax
  1686.         dec eax
  1687.         jz  short loc_401226
  1688.         mov eax, 0C0000002h
  1689.         mov esi, eax
  1690.         mov [ecx+18h], eax
  1691.         jmp short loc_401229
  1692. ; ---------------------------------------------------------------------------
  1693.  
  1694. loc_401226:             ; CODE XREF: PAGE:00401214j
  1695.                     ; PAGE:00401218j
  1696.         mov [ecx+18h], edx
  1697.  
  1698. loc_401229:             ; CODE XREF: PAGE:00401224j
  1699.         xor dl, dl
  1700.         call    IofCompleteRequest
  1701.         mov eax, esi
  1702.         pop esi
  1703.         retn    8
  1704. ; ---------------------------------------------------------------------------
  1705.         align 4
  1706. ; const WCHAR aR
  1707. aR:                 ; DATA XREF: sub_401300+Co
  1708.         unicode 0, <R:>,0
  1709.         align 10h
  1710. dword_401240    dd 0            ; DATA XREF: sub_401300+32o
  1711. aParameters:                ; DATA XREF: sub_401300+F0o
  1712.         unicode 0, <Parameters>,0
  1713.         align 4
  1714. aDisksizem:             ; DATA XREF: sub_401300+100o
  1715.         unicode 0, <DiskSizeM>,0
  1716. aDisksizek:             ; DATA XREF: sub_401300+122o
  1717.         unicode 0, <DiskSizeK>,0
  1718. aRootdirentries:            ; DATA XREF: sub_401300+13Eo
  1719.         unicode 0, <RootDirEntries>,0
  1720.         align 4
  1721. aDriveletter:               ; DATA XREF: sub_401300+15Ao
  1722.         unicode 0, <DriveLetter>,0
  1723. aMediatype:             ; DATA XREF: sub_401300+17Ao
  1724.         unicode 0, <MediaType>,0
  1725. aSectorsperclus:            ; DATA XREF: sub_401300+1C5o
  1726.         unicode 0, <SectorsPerCluster>,0
  1727. aImage:                 ; DATA XREF: sub_401300+1D5o
  1728.         unicode 0, <Image>,0
  1729.  
  1730. ; =============== S U B R O U T I N E =======================================
  1731.  
  1732. ; Attributes: bp-based frame
  1733.  
  1734. sub_401300  proc near       ; CODE XREF: sub_400B14+82p
  1735.  
  1736. QueryTable  = _RTL_QUERY_REGISTRY_TABLE ptr -124h
  1737. var_104     = dword ptr -104h
  1738. var_100     = dword ptr -100h
  1739. var_FC      = dword ptr -0FCh
  1740. var_F8      = dword ptr -0F8h
  1741. var_F4      = dword ptr -0F4h
  1742. var_F0      = dword ptr -0F0h
  1743. var_E8      = dword ptr -0E8h
  1744. var_E4      = dword ptr -0E4h
  1745. var_E0      = dword ptr -0E0h
  1746. var_DC      = dword ptr -0DCh
  1747. var_D8      = dword ptr -0D8h
  1748. var_D4      = dword ptr -0D4h
  1749. var_CC      = dword ptr -0CCh
  1750. var_C8      = dword ptr -0C8h
  1751. var_C4      = dword ptr -0C4h
  1752. var_C0      = dword ptr -0C0h
  1753. var_BC      = dword ptr -0BCh
  1754. var_B8      = dword ptr -0B8h
  1755. var_B0      = dword ptr -0B0h
  1756. var_AC      = dword ptr -0ACh
  1757. var_A8      = dword ptr -0A8h
  1758. var_A4      = dword ptr -0A4h
  1759. var_A0      = dword ptr -0A0h
  1760. var_9C      = dword ptr -9Ch
  1761. var_94      = dword ptr -94h
  1762. var_90      = dword ptr -90h
  1763. var_8C      = dword ptr -8Ch
  1764. var_88      = dword ptr -88h
  1765. var_84      = dword ptr -84h
  1766. var_80      = dword ptr -80h
  1767. var_78      = dword ptr -78h
  1768. var_74      = dword ptr -74h
  1769. var_70      = dword ptr -70h
  1770. var_6C      = dword ptr -6Ch
  1771. var_68      = dword ptr -68h
  1772. var_64      = dword ptr -64h
  1773. var_5C      = dword ptr -5Ch
  1774. var_58      = dword ptr -58h
  1775. var_54      = dword ptr -54h
  1776. var_50      = dword ptr -50h
  1777. var_4C      = dword ptr -4Ch
  1778. var_48      = dword ptr -48h
  1779. var_28      = dword ptr -28h
  1780. var_24      = dword ptr -24h
  1781. var_20      = dword ptr -20h
  1782. var_18      = dword ptr -18h
  1783. var_14      = dword ptr -14h
  1784. var_10      = dword ptr -10h
  1785. DestinationString= UNICODE_STRING ptr -0Ch
  1786. var_4       = dword ptr -4
  1787. arg_0       = dword ptr  8
  1788. arg_4       = dword ptr  0Ch
  1789.  
  1790.         push    ebp
  1791.         mov ebp, esp
  1792.         sub esp, 124h
  1793.         push    ebx
  1794.         push    esi
  1795.         push    edi
  1796.         push    offset aR   ; "R:"
  1797.         lea eax, [ebp+DestinationString]
  1798.         xor esi, esi
  1799.         push    eax     ; DestinationString
  1800.         mov [ebp+var_24], 8
  1801.         mov [ebp+var_20], esi
  1802.         mov [ebp+var_18], 2
  1803.         mov [ebp+var_14], 200h
  1804.         mov [ebp+var_10], esi
  1805.         mov [ebp+var_4], offset dword_401240
  1806.         call    RtlInitUnicodeString
  1807.         push    3Fh
  1808.         pop ecx
  1809.         push    316D6152h   ; Tag
  1810.         push    10000h      ; NumberOfBytes
  1811.         xor eax, eax
  1812.         lea edi, [ebp+QueryTable]
  1813.         push    1       ; PoolType
  1814.         rep stosd
  1815.         call    ExAllocatePoolWithTag
  1816.         mov ebx, [ebp+arg_4]
  1817.         mov edi, eax
  1818.         xor eax, eax
  1819.         mov [ebx+20h], edi
  1820.         mov ecx, 4000h
  1821.         rep stosd
  1822.         mov eax, [ebx+20h]
  1823.         mov dword ptr [eax], 0FFFF0000h
  1824.         lea eax, [ebp+var_24]
  1825.         mov [ebp+var_F4], eax
  1826.         lea eax, [ebx+4]
  1827.         mov [ebp+var_E0], eax
  1828.         lea eax, [ebp+var_20]
  1829.         mov [ebp+var_D8], eax
  1830.         lea eax, [ebx+10h]
  1831.         mov [ebp+var_C4], eax
  1832.         lea eax, [ebp+var_14]
  1833.         mov [ebp+var_BC], eax
  1834.         lea eax, [ebx+18h]
  1835.         mov [ebp+var_A8], eax
  1836.         mov eax, [ebp+DestinationString.Buffer]
  1837.         push    20h
  1838.         pop edi
  1839.         mov [ebp+var_A0], eax
  1840.         lea eax, [ebx+0Ch]
  1841.         push    4
  1842.         mov [ebp+QueryTable.EntryContext], esi
  1843.         mov [ebp+QueryTable.DefaultType], esi
  1844.         mov [ebp+QueryTable.DefaultData], esi
  1845.         mov [ebp+QueryTable.DefaultLength], esi
  1846.         pop esi
  1847.         mov [ebp+arg_4], eax
  1848.         mov [ebp+var_8C], eax
  1849.         xor ecx, ecx
  1850.         lea eax, [ebp+var_18]
  1851.         mov [ebp+QueryTable.Flags], 1
  1852.         mov [ebp+QueryTable.Name], offset aParameters ; "Parameters"
  1853.         mov [ebp+var_104], edi
  1854.         mov [ebp+var_100], offset aDisksizem ; "DiskSizeM"
  1855.         mov [ebp+var_FC], ebx
  1856.         mov [ebp+var_F8], esi
  1857.         mov [ebp+var_F0], esi
  1858.         mov [ebp+var_E8], edi
  1859.         mov [ebp+var_E4], offset aDisksizek ; "DiskSizeK"
  1860.         mov [ebp+var_DC], esi
  1861.         mov [ebp+var_D4], esi
  1862.         mov [ebp+var_CC], edi
  1863.         mov [ebp+var_C8], offset aRootdirentries ; "RootDirEntries"
  1864.         mov [ebp+var_C0], esi
  1865.         mov [ebp+var_B8], esi
  1866.         mov [ebp+var_B0], edi
  1867.         mov [ebp+var_AC], offset aDriveletter ; "DriveLetter"
  1868.         mov [ebp+var_A4], 1
  1869.         mov [ebp+var_9C], ecx
  1870.         mov [ebp+var_94], edi
  1871.         mov [ebp+var_90], offset aMediatype ; "MediaType"
  1872.         mov [ebp+var_88], esi
  1873.         mov [ebp+var_84], eax
  1874.         lea eax, [ebx+14h]
  1875.         mov [ebp+var_28], eax
  1876.         mov [ebp+var_70], eax
  1877.         lea eax, [ebp+var_10]
  1878.         mov [ebp+var_68], eax
  1879.         mov eax, [ebx+20h]
  1880.         mov [ebp+var_54], eax
  1881.         mov eax, [ebp+var_4]
  1882.         push    ecx     ; Environment
  1883.         mov [ebp+var_4C], eax
  1884.         push    ecx     ; Context
  1885.         lea eax, [ebp+QueryTable]
  1886.         push    eax     ; QueryTable
  1887.         mov eax, [ebp+arg_0]
  1888.         push    dword ptr [eax+4] ; Path
  1889.         mov [ebp+var_80], esi
  1890.         push    80000000h   ; RelativeTo
  1891.         mov [ebp+var_78], edi
  1892.         mov [ebp+var_74], offset aSectorsperclus ; "SectorsPerCluster"
  1893.         mov [ebp+var_6C], esi
  1894.         mov [ebp+var_64], esi
  1895.         mov [ebp+var_5C], edi
  1896.         mov [ebp+var_58], offset aImage ; "Image"
  1897.         mov [ebp+var_50], 3
  1898.         mov [ebp+var_48], esi
  1899.         call    RtlQueryRegistryValues
  1900.         test    eax, eax
  1901.         jge short loc_40150D
  1902.         mov eax, [ebp+var_24]
  1903.         and dword ptr [ebx+4], 0
  1904.         mov [ebx], eax
  1905.         mov eax, [ebp+var_14]
  1906.         mov [ebx+10h], eax
  1907.         lea eax, [ebp+DestinationString]
  1908.         push    eax     ; SourceString
  1909.         lea eax, [ebx+18h]
  1910.         push    eax     ; DestinationString
  1911.         call    RtlCopyUnicodeString
  1912.  
  1913. loc_40150D:             ; CODE XREF: sub_401300+1EEj
  1914.         mov eax, [ebx+4]
  1915.         test    eax, eax
  1916.         jnz short loc_40151E
  1917.         mov eax, [ebx]
  1918.         shl eax, 0Ah
  1919.         mov [ebx+4], eax
  1920.         jmp short loc_401528
  1921. ; ---------------------------------------------------------------------------
  1922.  
  1923. loc_40151E:             ; CODE XREF: sub_401300+212j
  1924.         add eax, 3FFh
  1925.         shr eax, 0Ah
  1926.         mov [ebx], eax
  1927.  
  1928. loc_401528:             ; CODE XREF: sub_401300+21Cj
  1929.         mov eax, [ebx]
  1930.         mov [ebx+8], eax
  1931.         mov eax, [ebp+arg_4]
  1932.         cmp dword ptr [eax], 0
  1933.         jnz short loc_40153A
  1934.         mov ecx, [ebp+var_18]
  1935.         mov [eax], ecx
  1936.  
  1937. loc_40153A:             ; CODE XREF: sub_401300+233j
  1938.         mov ecx, [ebp+var_28]
  1939.         mov eax, [ecx]
  1940.         cmp eax, 10h
  1941.         ja  short loc_401558
  1942.         jz  short loc_401568
  1943.         test    eax, eax
  1944.         jbe short loc_401565
  1945.         cmp eax, 2
  1946.         jbe short loc_401568
  1947.         cmp eax, esi
  1948.         jz  short loc_401568
  1949.         cmp eax, 8
  1950.         jmp short loc_401563
  1951. ; ---------------------------------------------------------------------------
  1952.  
  1953. loc_401558:             ; CODE XREF: sub_401300+242j
  1954.         sub eax, edi
  1955.         jz  short loc_401568
  1956.         sub eax, edi
  1957.         jz  short loc_401568
  1958.         sub eax, 40h
  1959.  
  1960. loc_401563:             ; CODE XREF: sub_401300+256j
  1961.         jz  short loc_401568
  1962.  
  1963. loc_401565:             ; CODE XREF: sub_401300+248j
  1964.         and dword ptr [ecx], 0
  1965.  
  1966. loc_401568:             ; CODE XREF: sub_401300+244j
  1967.                     ; sub_401300+24Dj ...
  1968.         pop edi
  1969.         pop esi
  1970.         pop ebx
  1971.         leave
  1972.         retn    8
  1973. sub_401300  endp
  1974.  
  1975. ; ---------------------------------------------------------------------------
  1976.         align 10h
  1977. ; char aMswin4_0[9]
  1978. aMswin4_0   db 'MSWIN4.0',0         ; DATA XREF: sub_4015DC+549o
  1979.                 db    0
  1980.                 db    0
  1981.                 db    0
  1982.  
  1983. ; char aRamdisk[12]
  1984. aRamdisk    db 'RamDisk    ',0      ; DATA XREF: sub_4015DC+5DBo
  1985. ; char aFat1?[9]
  1986. aFat1?      db 'FAT1?   ',0         ; DATA XREF: sub_4015DC+5F3o
  1987.         align 4
  1988. ; char aRamdisk_0[12]
  1989. aRamdisk_0  db 'RamDisk    ',0      ; DATA XREF: sub_4015DC+668o
  1990. ; char aFat32[9]
  1991. aFat32      db 'FAT32   ',0         ; DATA XREF: sub_4015DC+684o
  1992.                 db    0
  1993.                 db    0
  1994.                 db    0
  1995.  
  1996.  
  1997. ;loc_4015AC:                ; DATA XREF: sub_4015DC+764o
  1998. aRamdisk_1      db 'RamDisk    ',0      ; DATA XREF: sub_4015DC+764o
  1999.  
  2000.                 db    0
  2001.                 db    0
  2002.                 db    0
  2003.  
  2004. loc_4015B7:             ; DATA XREF: sub_4015DC+779o
  2005. aTemp           db 'TEMP       ',0      ; DATA XREF: sub_4015DC+779o
  2006.                 db    0
  2007.                 db    0
  2008.                 db    0
  2009.  
  2010. loc_4015C4:             ; DATA XREF: sub_4015DC+7D7o
  2011. a_              db '.          ',0      ; DATA XREF: sub_4015DC+7D7o
  2012.                 db    0
  2013.                 db    0
  2014.                 db    0
  2015.  
  2016. loc_4015CF:             ; DATA XREF: sub_4015DC+7ECo
  2017.  
  2018. a__             db '..         ',0      ; DATA XREF: sub_4015DC+7ECo
  2019.                 db    0
  2020.                 db    0
  2021.                 db    0
  2022.                 db    0
  2023.                 db    0
  2024.                 db    0
  2025.  
  2026. ; =============== S U B R O U T I N E =======================================
  2027.  
  2028. ; Attributes: bp-based frame
  2029.  
  2030. sub_4015DC  proc near       ; CODE XREF: sub_400B14+238p
  2031.  
  2032. var_24      = dword ptr -24h
  2033. var_1C      = dword ptr -1Ch
  2034. var_14      = dword ptr -14h
  2035. var_10      = dword ptr -10h
  2036. var_C       = dword ptr -0Ch
  2037. var_8       = dword ptr -8
  2038. var_4       = dword ptr -4
  2039. arg_0       = dword ptr  8
  2040.  
  2041.         push    ebp
  2042.         mov ebp, esp
  2043.         sub esp, 24h
  2044.         mov eax, [ebp+arg_0]
  2045.         push    ebx
  2046.         mov ebx, [eax+28h]
  2047.         push    esi
  2048.         push    edi
  2049.         xor edi, edi
  2050.         push    edi
  2051.         lea eax, [ebp+var_C]
  2052.         push    eax
  2053.         push    4000h
  2054.         push    edi
  2055.         xor eax, eax
  2056.         mov esi, ebx
  2057.         call    sub_400616
  2058.         mov ecx, [ebx+64h]
  2059.         cmp ecx, 4B0h
  2060.         mov esi, [ebp+var_C]
  2061.         push    2
  2062.         pop edx
  2063.         mov [ebx+4Ch], edi
  2064.         mov dword ptr [ebx+5Ch], 200h
  2065.         jz  short loc_401665
  2066.         cmp ecx, 5A0h
  2067.         jz  short loc_401659
  2068.         cmp ecx, 0B40h
  2069.         jz  short loc_401649
  2070.         mov eax, [ebx+60h]
  2071.         mov dword ptr [ebx+58h], 20h
  2072.         mov dword ptr [ebx+54h], 40h
  2073.         mov [ebx+48h], eax
  2074.         mov dword ptr [ebx+50h], 0Ch
  2075.         jmp short loc_40167D
  2076. ; ---------------------------------------------------------------------------
  2077.  
  2078. loc_401649:             ; CODE XREF: sub_4015DC+4Ej
  2079.         mov dword ptr [ebx+58h], 24h
  2080.         mov dword ptr [ebx+50h], 3
  2081.         jmp short loc_401673
  2082. ; ---------------------------------------------------------------------------
  2083.  
  2084. loc_401659:             ; CODE XREF: sub_4015DC+46j
  2085.         mov dword ptr [ebx+58h], 12h
  2086.         mov [ebx+50h], edx
  2087.         jmp short loc_401673
  2088. ; ---------------------------------------------------------------------------
  2089.  
  2090. loc_401665:             ; CODE XREF: sub_4015DC+3Ej
  2091.         mov dword ptr [ebx+58h], 0Fh
  2092.         mov dword ptr [ebx+50h], 1
  2093.  
  2094. loc_401673:             ; CODE XREF: sub_4015DC+7Bj
  2095.                     ; sub_4015DC+87j
  2096.         mov [ebx+54h], edx
  2097.         mov dword ptr [ebx+48h], 50h
  2098.  
  2099. loc_40167D:             ; CODE XREF: sub_4015DC+6Bj
  2100.         mov eax, [ebx+80h]
  2101.         cmp eax, edi
  2102.         jz  loc_401903
  2103.         mov edi, [eax]
  2104.         test    edi, edi
  2105.         jz  loc_401903
  2106.         cmp edi, ecx
  2107.         jnz loc_401DF3
  2108.         mov ecx, [eax+4]
  2109.         cmp ecx, 10000h
  2110.         ja  loc_401DF3
  2111.         and [ebp+var_4], 0
  2112.         lea edi, [eax+8]
  2113.         lea eax, [ecx+edi-8]
  2114.         cmp edi, eax
  2115.         mov [ebp+var_14], eax
  2116.         mov [ebp+var_8], esi
  2117.         mov [ebp+arg_0], 4000h
  2118.         jnb loc_401DF3
  2119.         jmp short loc_4016D1
  2120. ; ---------------------------------------------------------------------------
  2121.  
  2122. loc_4016CE:             ; CODE XREF: sub_4015DC+24Cj
  2123.         mov eax, [ebp+var_14]
  2124.  
  2125. loc_4016D1:             ; CODE XREF: sub_4015DC+F0j
  2126.         movzx   esi, byte ptr [edi]
  2127.         inc edi
  2128.         cmp esi, 80h
  2129.         jnb loc_401781
  2130.         mov ecx, esi
  2131.         and ecx, 40h
  2132.         mov [ebp+var_10], ecx
  2133.         jz  short loc_4016F9
  2134.         mov ecx, esi
  2135.         shr ecx, 4
  2136.         sub ecx, 3
  2137.         mov [ebp+var_10], ecx
  2138.         and esi, 0Fh
  2139.  
  2140. loc_4016F9:             ; CODE XREF: sub_4015DC+10Dj
  2141.         inc esi
  2142.         lea ecx, [esi+edi]
  2143.         cmp ecx, eax
  2144.         jbe short loc_40174B
  2145.  
  2146. loc_401701:             ; CODE XREF: sub_4015DC+16Dj
  2147.                     ; sub_4015DC+199j ...
  2148.         push    0
  2149.         lea eax, [ebp+var_C]
  2150.         push    eax
  2151.         push    4000h
  2152.         push    0
  2153.         xor eax, eax
  2154.         mov esi, ebx
  2155.         call    sub_400616
  2156.         mov edi, [ebp+var_C]
  2157.         mov ecx, 80h
  2158.         xor eax, eax
  2159.         rep stosd
  2160.         jmp loc_401DF3
  2161. ; ---------------------------------------------------------------------------
  2162.  
  2163. loc_401728:             ; CODE XREF: sub_4015DC+171j
  2164.         xor eax, eax
  2165.         mov al, [edi]
  2166.         dec esi
  2167.         push    eax
  2168.         lea eax, [ebp+var_1C]
  2169.         push    eax
  2170.         lea eax, [ebp+arg_0]
  2171.         push    eax
  2172.         lea eax, [ebp+var_8]
  2173.         push    eax
  2174.         push    0
  2175.         lea eax, [ebp+var_4]
  2176.         push    eax
  2177.         push    ebx
  2178.         call    sub_4008A2
  2179.         inc edi
  2180.         test    eax, eax
  2181.         jnz short loc_401701
  2182.  
  2183. loc_40174B:             ; CODE XREF: sub_4015DC+123j
  2184.         test    esi, esi
  2185.         jnz short loc_401728
  2186.         cmp [ebp+var_10], esi
  2187.         jz  loc_401825
  2188.  
  2189. loc_401758:             ; CODE XREF: sub_4015DC+19Ej
  2190.         dec [ebp+var_10]
  2191.         push    esi
  2192.         lea eax, [ebp+var_1C]
  2193.         push    eax
  2194.         lea eax, [ebp+arg_0]
  2195.         push    eax
  2196.         lea eax, [ebp+var_8]
  2197.         push    eax
  2198.         push    esi
  2199.         lea eax, [ebp+var_4]
  2200.         push    eax
  2201.         push    ebx
  2202.         call    sub_4008A2
  2203.         test    eax, eax
  2204.         jnz short loc_401701
  2205.         cmp [ebp+var_10], esi
  2206.         jnz short loc_401758
  2207.         jmp loc_401825
  2208. ; ---------------------------------------------------------------------------
  2209.  
  2210. loc_401781:             ; CODE XREF: sub_4015DC+FFj
  2211.         mov edx, esi
  2212.         and esi, 3Fh
  2213.         mov ecx, esi
  2214.         and edx, 40h
  2215.         sub ecx, 3Ch
  2216.         jz  short loc_4017E1
  2217.         dec ecx
  2218.         jz  short loc_4017CB
  2219.         dec ecx
  2220.         jz  short loc_4017AB
  2221.         dec ecx
  2222.         jz  short loc_40179C
  2223.         inc esi
  2224.         jmp short loc_4017F4
  2225. ; ---------------------------------------------------------------------------
  2226.  
  2227. loc_40179C:             ; CODE XREF: sub_4015DC+1BBj
  2228.         lea ecx, [edi+4]
  2229.         cmp ecx, eax
  2230.         ja  loc_401701
  2231.         mov esi, [edi]
  2232.         jmp short loc_4017F2
  2233. ; ---------------------------------------------------------------------------
  2234.  
  2235. loc_4017AB:             ; CODE XREF: sub_4015DC+1B8j
  2236.         lea ecx, [edi+3]
  2237.         cmp ecx, eax
  2238.         ja  loc_401701
  2239.         movzx   esi, word ptr [edi]
  2240.         inc edi
  2241.         inc edi
  2242.         movzx   eax, byte ptr [edi]
  2243.         shl eax, 10h
  2244.         lea esi, [esi+eax+1013Dh]
  2245.         inc edi
  2246.         jmp short loc_4017F4
  2247. ; ---------------------------------------------------------------------------
  2248.  
  2249. loc_4017CB:             ; CODE XREF: sub_4015DC+1B5j
  2250.         lea ecx, [edi+2]
  2251.         cmp ecx, eax
  2252.         ja  loc_401701
  2253.         movzx   esi, word ptr [edi]
  2254.         add esi, 13Dh
  2255.         jmp short loc_4017F2
  2256. ; ---------------------------------------------------------------------------
  2257.  
  2258. loc_4017E1:             ; CODE XREF: sub_4015DC+1B2j
  2259.         lea ecx, [edi+1]
  2260.         cmp ecx, eax
  2261.         ja  loc_401701
  2262.         movzx   esi, byte ptr [edi]
  2263.         add esi, 3Dh
  2264.  
  2265. loc_4017F2:             ; CODE XREF: sub_4015DC+1CDj
  2266.                     ; sub_4015DC+203j
  2267.         mov edi, ecx
  2268.  
  2269. loc_4017F4:             ; CODE XREF: sub_4015DC+1BEj
  2270.                     ; sub_4015DC+1EDj
  2271.         test    edx, edx
  2272.         jnz loc_4018C9
  2273.         cmp byte ptr [ebp+var_1C+3], dl
  2274.         jnz loc_4018FA
  2275.         push    edx
  2276.         lea eax, [ebp+var_1C]
  2277.         push    eax
  2278.         lea eax, [ebp+arg_0]
  2279.         push    eax
  2280.         lea eax, [ebp+var_8]
  2281.         push    eax
  2282.         push    esi
  2283.         lea eax, [ebp+var_4]
  2284.         push    eax
  2285.         push    ebx
  2286.         call    sub_4008A2
  2287.         test    eax, eax
  2288.         jnz loc_401701
  2289.  
  2290. loc_401825:             ; CODE XREF: sub_4015DC+176j
  2291.                     ; sub_4015DC+1A0j ...
  2292.         cmp edi, [ebp+var_14]
  2293.         jb  loc_4016CE
  2294.         jmp loc_401DF3
  2295. ; ---------------------------------------------------------------------------
  2296.  
  2297. loc_401833:             ; CODE XREF: sub_4015DC+2EFj
  2298.         mov eax, [ebp+var_1C]
  2299.         add eax, 20002h
  2300.         push    eax
  2301.         mov [ebp+var_24], eax
  2302.         lea eax, [ebp+var_1C]
  2303.         push    eax
  2304.         lea eax, [ebp+arg_0]
  2305.         push    eax
  2306.         lea eax, [ebp+var_8]
  2307.         push    eax
  2308.         push    0
  2309.         lea eax, [ebp+var_4]
  2310.         push    eax
  2311.         push    ebx
  2312.         dec esi
  2313.         call    sub_4008A2
  2314.         test    eax, eax
  2315.         jnz loc_401701
  2316.         push    [ebp+var_24+1]
  2317.         lea eax, [ebp+var_1C]
  2318.         push    eax
  2319.         lea eax, [ebp+arg_0]
  2320.         push    eax
  2321.         lea eax, [ebp+var_8]
  2322.         push    eax
  2323.         push    0
  2324.         lea eax, [ebp+var_4]
  2325.         push    eax
  2326.         push    ebx
  2327.         call    sub_4008A2
  2328.         test    eax, eax
  2329.         jnz loc_401701
  2330.         push    [ebp+var_24+2]
  2331.         lea eax, [ebp+var_1C]
  2332.         push    eax
  2333.         lea eax, [ebp+arg_0]
  2334.         push    eax
  2335.         lea eax, [ebp+var_8]
  2336.         push    eax
  2337.         push    0
  2338.         lea eax, [ebp+var_4]
  2339.         push    eax
  2340.         push    ebx
  2341.         call    sub_4008A2
  2342.         test    eax, eax
  2343.         jnz loc_401701
  2344.         push    [ebp+var_24+3]
  2345.         lea eax, [ebp+var_1C]
  2346.         push    eax
  2347.         lea eax, [ebp+arg_0]
  2348.         push    eax
  2349.         lea eax, [ebp+var_8]
  2350.         push    eax
  2351.         push    0
  2352.         lea eax, [ebp+var_4]
  2353.         push    eax
  2354.         push    ebx
  2355.         call    sub_4008A2
  2356.         test    eax, eax
  2357.         jnz loc_401701
  2358.  
  2359. loc_4018C9:             ; CODE XREF: sub_4015DC+21Aj
  2360.         test    esi, esi
  2361.         jnz loc_401833
  2362.         jmp loc_401825
  2363. ; ---------------------------------------------------------------------------
  2364.  
  2365. loc_4018D6:             ; CODE XREF: sub_4015DC+320j
  2366.         push    [ebp+var_1C+3]
  2367.         lea eax, [ebp+var_1C]
  2368.         push    eax
  2369.         lea eax, [ebp+arg_0]
  2370.         push    eax
  2371.         lea eax, [ebp+var_8]
  2372.         push    eax
  2373.         push    0
  2374.         lea eax, [ebp+var_4]
  2375.         push    eax
  2376.         push    ebx
  2377.         dec esi
  2378.         call    sub_4008A2
  2379.         test    eax, eax
  2380.         jnz loc_401701
  2381.  
  2382. loc_4018FA:             ; CODE XREF: sub_4015DC+223j
  2383.         test    esi, esi
  2384.         jnz short loc_4018D6
  2385.         jmp loc_401825
  2386. ; ---------------------------------------------------------------------------
  2387.  
  2388. loc_401903:             ; CODE XREF: sub_4015DC+A9j
  2389.                     ; sub_4015DC+B3j
  2390.         mov eax, [ebx+70h]
  2391.         test    eax, eax
  2392.         mov [ebp+var_C], eax
  2393.         jnz short loc_401914
  2394.         mov [ebp+var_C], 200h
  2395.  
  2396. loc_401914:             ; CODE XREF: sub_4015DC+32Fj
  2397.         mov eax, [ebp+var_C]
  2398.         test    al, 0Fh
  2399.         jz  short loc_401924
  2400.         add eax, 0Fh
  2401.         and eax, 0FFFFFFF0h
  2402.         mov [ebp+var_C], eax
  2403.  
  2404. loc_401924:             ; CODE XREF: sub_4015DC+33Dj
  2405.         mov eax, [ebp+var_C]
  2406.         shr eax, 4
  2407.         lea edi, [ecx+ecx]
  2408.         sub edi, eax
  2409.         mov eax, [ebx+74h]
  2410.         sub edi, 101h
  2411.         test    eax, eax
  2412.         mov [ebp+var_10], edi
  2413.         jz  short loc_401992
  2414.         mov [ebp+arg_0], eax
  2415.         xor edx, edx
  2416.         mov eax, edi
  2417.         div [ebp+arg_0]
  2418.         cmp eax, 0FFF6h
  2419.         jbe short loc_401957
  2420.  
  2421. loc_401950:             ; CODE XREF: sub_4015DC+3EBj
  2422.         mov byte_40119C, 0Bh
  2423.  
  2424. loc_401957:             ; CODE XREF: sub_4015DC+372j
  2425.                     ; sub_4015DC+3C5j ...
  2426.         cmp byte_40119C, 0Bh
  2427.         jnz loc_401A77
  2428.         mov eax, [ebx+64h]
  2429.         and [ebp+var_C], 0
  2430.         cmp dword ptr [ebx+74h], 0
  2431.         lea eax, [eax+eax-7FE2h]
  2432.         mov [ebp+var_10], eax
  2433.         jnz loc_401A24
  2434.         cmp eax, 3FFFEh
  2435.         ja  short loc_4019D2
  2436.         mov [ebp+arg_0], 1
  2437.         jmp loc_401A24
  2438. ; ---------------------------------------------------------------------------
  2439.  
  2440. loc_401992:             ; CODE XREF: sub_4015DC+361j
  2441.         cmp edi, 0FFF6h
  2442.         ja  short loc_4019A3
  2443.         mov [ebp+arg_0], 1
  2444.         jmp short loc_401957
  2445. ; ---------------------------------------------------------------------------
  2446.  
  2447. loc_4019A3:             ; CODE XREF: sub_4015DC+3BCj
  2448.         cmp edi, 1FFECh
  2449.         ja  short loc_4019B0
  2450.         mov [ebp+arg_0], edx
  2451.         jmp short loc_401957
  2452. ; ---------------------------------------------------------------------------
  2453.  
  2454. loc_4019B0:             ; CODE XREF: sub_4015DC+3CDj
  2455.         cmp edi, 3FFD8h
  2456.         ja  short loc_4019C1
  2457.         mov [ebp+arg_0], 4
  2458.         jmp short loc_401957
  2459. ; ---------------------------------------------------------------------------
  2460.  
  2461. loc_4019C1:             ; CODE XREF: sub_4015DC+3DAj
  2462.         cmp edi, 7FFB0h
  2463.         ja  short loc_401950
  2464.         mov [ebp+arg_0], 8
  2465.         jmp short loc_401957
  2466. ; ---------------------------------------------------------------------------
  2467.  
  2468. loc_4019D2:             ; CODE XREF: sub_4015DC+3A8j
  2469.         cmp eax, 7FFFCh
  2470.         ja  short loc_4019E2
  2471.         mov [ebp+arg_0], 2
  2472.         jmp short loc_401A24
  2473. ; ---------------------------------------------------------------------------
  2474.  
  2475. loc_4019E2:             ; CODE XREF: sub_4015DC+3FBj
  2476.         cmp eax, 0FFFF8h
  2477.         ja  short loc_4019F2
  2478.         mov [ebp+arg_0], 4
  2479.         jmp short loc_401A24
  2480. ; ---------------------------------------------------------------------------
  2481.  
  2482. loc_4019F2:             ; CODE XREF: sub_4015DC+40Bj
  2483.         cmp eax, 1FDFFF0h
  2484.         ja  short loc_401A02
  2485.         mov [ebp+arg_0], 8
  2486.         jmp short loc_401A24
  2487. ; ---------------------------------------------------------------------------
  2488.  
  2489. loc_401A02:             ; CODE XREF: sub_4015DC+41Bj
  2490.         cmp eax, 3FBFFE0h
  2491.         ja  short loc_401A12
  2492.         mov [ebp+arg_0], 10h
  2493.         jmp short loc_401A24
  2494. ; ---------------------------------------------------------------------------
  2495.  
  2496. loc_401A12:             ; CODE XREF: sub_4015DC+42Bj
  2497.         mov ecx, 7F7FFC0h
  2498.         cmp ecx, eax
  2499.         sbb ecx, ecx
  2500.         and ecx, 20h
  2501.         add ecx, 20h
  2502.         mov [ebp+arg_0], ecx
  2503.  
  2504. loc_401A24:             ; CODE XREF: sub_4015DC+39Dj
  2505.                     ; sub_4015DC+3B1j ...
  2506.         mov ecx, [ebp+arg_0]
  2507.         imul    ecx, 3FBFFEh
  2508.         cmp eax, ecx
  2509.         jbe short loc_401A36
  2510.         mov eax, ecx
  2511.         mov [ebp+var_10], eax
  2512.  
  2513. loc_401A36:             ; CODE XREF: sub_4015DC+453j
  2514.         xor edx, edx
  2515.         div [ebp+arg_0]
  2516.         lea eax, 207h[eax*4]
  2517.         shr eax, 9
  2518.         mov [ebp+var_8], eax
  2519.  
  2520. loc_401A48:             ; CODE XREF: sub_4015DC+494j
  2521.         mov ecx, [ebp+var_8]
  2522.         mov eax, [ebp+var_10]
  2523.         sub eax, ecx
  2524.         add eax, 7FE0h
  2525.         xor edx, edx
  2526.         div [ebp+arg_0]
  2527.         mov [ebp+var_4], ecx
  2528.         mov edi, eax
  2529.         inc edi
  2530.         inc edi
  2531.         lea eax, 1FFh[edi*4]
  2532.         shr eax, 9
  2533.         cmp ecx, eax
  2534.         mov [ebp+var_8], eax
  2535.         jnz short loc_401A48
  2536.         jmp loc_401B1D
  2537. ; ---------------------------------------------------------------------------
  2538.  
  2539. loc_401A77:             ; CODE XREF: sub_4015DC+382j
  2540.         lea eax, [edi+0F4h]
  2541.         xor edx, edx
  2542.         mov [ebp+var_14], eax
  2543.         div [ebp+arg_0]
  2544.         xor edx, edx
  2545.         cmp eax, 0FF6h
  2546.         ja  short loc_401ADA
  2547.         mov eax, [ebp+var_14]
  2548.         div [ebp+arg_0]
  2549.         mov byte_40119C, 1
  2550.         lea eax, [eax+eax*2+7]
  2551.         shr eax, 1
  2552.         add eax, 1FFh
  2553.         shr eax, 9
  2554.         mov [ebp+var_8], eax
  2555.  
  2556. loc_401AAC:             ; CODE XREF: sub_4015DC+4FAj
  2557.         mov ecx, [ebp+var_8]
  2558.         mov eax, [ebp+var_14]
  2559.         sub eax, ecx
  2560.         add eax, 0Ch
  2561.         xor edx, edx
  2562.         div [ebp+arg_0]
  2563.         mov [ebp+var_4], ecx
  2564.         mov edi, eax
  2565.         inc edi
  2566.         inc edi
  2567.         lea eax, [edi+edi*2+1]
  2568.         shr eax, 1
  2569.         add eax, 1FFh
  2570.         shr eax, 9
  2571.         cmp ecx, eax
  2572.         mov [ebp+var_8], eax
  2573.         jnz short loc_401AAC
  2574.         jmp short loc_401B1D
  2575. ; ---------------------------------------------------------------------------
  2576.  
  2577. loc_401ADA:             ; CODE XREF: sub_4015DC+4B0j
  2578.         mov eax, edi
  2579.         div [ebp+arg_0]
  2580.         mov byte_40119C, 4
  2581.         lea eax, [eax+eax+203h]
  2582.         shr eax, 9
  2583.         mov [ebp+var_8], eax
  2584.  
  2585. loc_401AF3:             ; CODE XREF: sub_4015DC+53Fj
  2586.         mov ecx, [ebp+var_8]
  2587.         mov eax, [ebp+var_10]
  2588.         sub eax, ecx
  2589.         add eax, 100h
  2590.         xor edx, edx
  2591.         div [ebp+arg_0]
  2592.         mov [ebp+var_4], ecx
  2593.         mov edi, eax
  2594.         inc edi
  2595.         inc edi
  2596.         lea eax, [edi+edi+1FFh]
  2597.         shr eax, 9
  2598.         cmp ecx, eax
  2599.         mov [ebp+var_8], eax
  2600.         jnz short loc_401AF3
  2601.  
  2602. loc_401B1D:             ; CODE XREF: sub_4015DC+496j
  2603.                     ; sub_4015DC+4FCj
  2604.         push    8       ; size_t
  2605.         mov byte ptr [esi], 0EBh
  2606.         lea eax, [esi+3]
  2607.         push    offset aMswin4_0 ; "MSWIN4.0"
  2608.         mov byte ptr [esi+1], 3Ch
  2609.         push    eax     ; char *
  2610.         mov byte ptr [esi+2], 90h
  2611.         call    strncpy
  2612.         mov ax, [ebx+5Ch]
  2613.         mov [esi+0Bh], ax
  2614.         mov byte ptr [esi+10h], 1
  2615.         mov ecx, [ebx+64h]
  2616.         lea eax, [esi+20h]
  2617.         shl ecx, 1
  2618.         mov [eax], ecx
  2619.         add esp, 0Ch
  2620.         mov byte ptr [esi+15h], 0F8h
  2621.         cmp dword ptr [eax], 10000h
  2622.         jnb short loc_401B6B
  2623.         mov cx, [eax]
  2624.         mov [esi+13h], cx
  2625.         xor ecx, ecx
  2626.         mov [eax], ecx
  2627.         jmp short loc_401B6D
  2628. ; ---------------------------------------------------------------------------
  2629.  
  2630. loc_401B6B:             ; CODE XREF: sub_4015DC+580j
  2631.         xor ecx, ecx
  2632.  
  2633. loc_401B6D:             ; CODE XREF: sub_4015DC+58Dj
  2634.         mov ax, [ebx+58h]
  2635.         mov [esi+18h], ax
  2636.         mov ax, [ebx+54h]
  2637.         mov [esi+1Ah], ax
  2638.         cmp byte_40119C, 0Bh
  2639.         jz  short loc_401C01
  2640.         mov ax, word ptr [ebp+var_C]
  2641.         mov word ptr [esi+0Eh], 1
  2642.         mov [esi+11h], ax
  2643.         mov al, byte ptr [ebp+arg_0]
  2644.         mov [esi+0Dh], al
  2645.         mov ax, word ptr [ebp+var_8]
  2646.         mov [esi+16h], ax
  2647.         cmp dword ptr [ebx+6Ch], 4
  2648.         jz  short loc_401BAC
  2649.         mov byte ptr [esi+24h], 80h
  2650.  
  2651. loc_401BAC:             ; CODE XREF: sub_4015DC+5CAj
  2652.         mov edi, offset strncpy
  2653.         push    0Bh     ; size_t
  2654.         lea eax, [esi+2Bh]
  2655.         push    offset aRamdisk ; "RamDisk    "
  2656.         mov byte ptr [esi+26h], 29h
  2657.         push    eax     ; char *
  2658.         mov dword ptr [esi+27h], 12345678h
  2659.         call    edi ; strncpy
  2660.         push    8       ; size_t
  2661.         lea eax, [esi+36h]
  2662.         push    offset aFat1?   ; "FAT1?   "
  2663.         push    eax     ; char *
  2664.         call    edi ; strncpy
  2665.         add esp, 18h
  2666.         cmp byte_40119C, 4
  2667.         setz    al
  2668.         lea eax, 32h[eax*4]
  2669.         mov [esi+3Ah], al
  2670.         mov byte ptr [esi+1FEh], 55h
  2671.         mov byte ptr [esi+1FFh], 0AAh
  2672.         jmp loc_401CB2
  2673. ; ---------------------------------------------------------------------------
  2674.  
  2675. loc_401C01:             ; CODE XREF: sub_4015DC+5A8j
  2676.         mov al, byte ptr [ebp+arg_0]
  2677.         mov edx, [ebp+var_8]
  2678.         mov [esi+0Dh], al
  2679.         push    2
  2680.         pop eax
  2681.         mov [esi+16h], cx
  2682.         mov [esi+0Eh], ax
  2683.         mov [esi+11h], cx
  2684.         mov [esi+24h], edx
  2685.         mov [esi+28h], cx
  2686.         mov byte ptr [esi+2Ah], 0
  2687.         mov byte ptr [esi+2Bh], 0
  2688.         mov [esi+2Ch], eax
  2689.         mov word ptr [esi+30h], 1
  2690.         mov [esi+32h], cx
  2691.         cmp dword ptr [ebx+6Ch], 4
  2692.         jz  short loc_401C3F
  2693.         mov byte ptr [esi+40h], 80h
  2694.  
  2695. loc_401C3F:             ; CODE XREF: sub_4015DC+65Dj
  2696.         push    0Bh     ; size_t
  2697.         lea eax, [esi+47h]
  2698.         push    offset aRamdisk_0 ; "RamDisk    "
  2699.         push    eax     ; char *
  2700.         mov byte ptr [esi+42h], 29h
  2701.         mov dword ptr [esi+43h], 12345678h
  2702.         call    strncpy
  2703.         push    8       ; size_t
  2704.         lea eax, [esi+52h]
  2705.         push    offset aFat32   ; "FAT32   "
  2706.         push    eax     ; char *
  2707.         call    strncpy
  2708.         mov byte ptr [esi+1FEh], 55h
  2709.         mov byte ptr [esi+1FFh], 0AAh
  2710.         add esp, 18h
  2711.         add edi, 0FFFFFFFCh
  2712.         mov dword ptr [esi+200h], 61417272h
  2713.         mov dword ptr [esi+3E4h], 41615252h
  2714.         mov [esi+3E8h], edi
  2715.         mov dword ptr [esi+3ECh], 3
  2716.         mov byte ptr [esi+3FEh], 55h
  2717.         mov byte ptr [esi+3FFh], 0AAh
  2718.  
  2719. loc_401CB2:             ; CODE XREF: sub_4015DC+620j
  2720.         movzx   eax, word ptr [esi+0Eh]
  2721.         mov cl, byte_40119C
  2722.         shl eax, 9
  2723.         add eax, esi
  2724.         cmp cl, 0Bh
  2725.         jnz short loc_401CF5
  2726.         mov cl, 0FFh
  2727.         mov byte ptr [eax+3], 0Fh
  2728.         mov [eax+4], cl
  2729.         mov [eax+5], cl
  2730.         mov [eax+6], cl
  2731.         mov byte ptr [eax+7], 0Fh
  2732.         mov [eax+8], cl
  2733.         mov [eax+9], cl
  2734.         mov [eax+0Ah], cl
  2735.         mov byte ptr [eax+0Bh], 0Fh
  2736.         mov [eax+0Ch], cl
  2737.         mov [eax+0Dh], cl
  2738.         mov [eax+0Eh], cl
  2739.         mov byte ptr [eax+0Fh], 0Fh
  2740.         jmp short loc_401D0B
  2741. ; ---------------------------------------------------------------------------
  2742.  
  2743. loc_401CF5:             ; CODE XREF: sub_4015DC+6E8j
  2744.         cmp cl, 4
  2745.         mov cl, 0FFh
  2746.         mov [eax+3], cl
  2747.         jnz short loc_401D07
  2748.         mov [eax+4], cl
  2749.         mov [eax+5], cl
  2750.         jmp short loc_401D0B
  2751. ; ---------------------------------------------------------------------------
  2752.  
  2753. loc_401D07:             ; CODE XREF: sub_4015DC+721j
  2754.         mov byte ptr [eax+4], 0Fh
  2755.  
  2756. loc_401D0B:             ; CODE XREF: sub_4015DC+717j
  2757.                     ; sub_4015DC+729j
  2758.         mov [eax+1], cl
  2759.         mov [eax+2], cl
  2760.         mov byte ptr [eax], 0F8h
  2761.         xor eax, eax
  2762.         cmp byte_40119C, 0Bh
  2763.         push    0
  2764.         setz    al
  2765.         lea ecx, [ebp+var_8]
  2766.         push    ecx
  2767.         push    200h
  2768.         push    0
  2769.         mov esi, ebx
  2770.         inc eax
  2771.         add eax, [ebp+var_8]
  2772.         mov [ebp+var_10], eax
  2773.         call    sub_400616
  2774.         mov eax, [ebp+var_8]
  2775.         mov edi, eax
  2776.                 mov     esi, offset aRamdisk_1 ; "RamDisk    "
  2777.         movsd
  2778.         movsd
  2779.         movsd
  2780.         mov byte ptr [eax+0Bh], 8
  2781.         mov word ptr [eax+18h], 2E21h
  2782.         add eax, 20h
  2783.         mov esi, offset aTemp
  2784.         mov edi, eax
  2785.         movsd
  2786.         movsd
  2787.         movsd
  2788.         xor ecx, ecx
  2789.         mov byte ptr [eax+0Bh], 10h
  2790.         cmp byte_40119C, 0Bh
  2791.         mov [ebp+var_8], eax
  2792.         setz    cl
  2793.         inc ecx
  2794.         inc ecx
  2795.         mov [eax+1Ah], cx
  2796.         mov word ptr [eax+18h], 2E21h
  2797.         cmp byte_40119C, 0Bh
  2798.         jnz short loc_401D8F
  2799.         mov eax, [ebp+arg_0]
  2800.         shl eax, 9
  2801.         jmp short loc_401D95
  2802. ; ---------------------------------------------------------------------------
  2803.  
  2804. loc_401D8F:             ; CODE XREF: sub_4015DC+7A9j
  2805.         mov eax, [ebp+var_C]
  2806.         shr eax, 4
  2807.  
  2808. loc_401D95:             ; CODE XREF: sub_4015DC+7B1j
  2809.         push    0
  2810.         lea ecx, [ebp+var_8]
  2811.         push    ecx
  2812.         mov ecx, [ebp+var_10]
  2813.         push    200h
  2814.         push    0
  2815.         add eax, ecx
  2816.         mov esi, ebx
  2817.         call    sub_400616
  2818.         mov eax, [ebp+var_8]
  2819.         mov edi, eax
  2820.         mov esi, offset loc_4015C4
  2821.         movsd
  2822.         movsd
  2823.         movsd
  2824.         mov byte ptr [eax+0Bh], 10h
  2825.         xor ecx, ecx
  2826.         cmp byte_40119C, 0Bh
  2827.         mov esi, offset loc_4015CF
  2828.         setz    cl
  2829.         add eax, 20h
  2830.         mov edi, eax
  2831.         inc ecx
  2832.         inc ecx
  2833.         mov [eax-6], cx
  2834.         mov word ptr [eax-8], 2E21h
  2835.         movsd
  2836.         movsd
  2837.         movsd
  2838.         mov byte ptr [eax+0Bh], 10h
  2839.         and word ptr [eax+1Ah], 0
  2840.         mov word ptr [eax+18h], 2E21h
  2841.  
  2842. loc_401DF3:             ; CODE XREF: sub_4015DC+BBj
  2843.                     ; sub_4015DC+CAj ...
  2844.         pop edi
  2845.         pop esi
  2846.         xor eax, eax
  2847.         pop ebx
  2848.         leave
  2849.         retn    4
  2850. sub_4015DC  endp
  2851.  
  2852.  
  2853. ; =============== S U B R O U T I N E =======================================
  2854.  
  2855. public sub_401DFC
  2856. ; int __stdcall sub_401DFC(PDRIVER_OBJECT DriverObject)
  2857. sub_401DFC  proc near       ; DATA XREF: DriverEntry+BCo
  2858.  
  2859. DriverObject    = dword ptr  4
  2860.  
  2861.         push    offset DriverEntry ; ClientIdentificationAddress
  2862.         push    [esp+4+DriverObject] ; DriverObject
  2863.         call    IoGetDriverObjectExtension
  2864.         mov eax, [eax+4]
  2865.         test    eax, eax
  2866.         jz  short locret_401E1B
  2867.         push    0       ; Tag
  2868.         push    eax     ; P
  2869.         call    ExFreePoolWithTag
  2870.  
  2871. locret_401E1B:              ; CODE XREF: sub_401DFC+14j
  2872.         retn    4
  2873. sub_401DFC  endp
  2874.  
  2875. ; ---------------------------------------------------------------------------
  2876. ;       align 80h
  2877. ;PAGE       ends
  2878.  
  2879. ; Section 5. (virtual address 00001E80)
  2880. ; Virtual size          : 000004B4 (   1204.)
  2881. ; Section size in file      : 00000500 (   1280.)
  2882. ; Offset to raw data for section: 00001E80
  2883. ; Flags E2000020: Text Discardable Executable Readable Writable
  2884. ; Alignment : default
  2885. ; ===========================================================================
  2886.  
  2887. ; Segment type: Pure code
  2888. ; Segment permissions: Read/Write/Execute
  2889. ;INIT       segment para public 'CODE' use32
  2890. ;       assume cs:INIT
  2891.         ;org 401E80h
  2892. ;       assume es:nothing, ss:nothing, _data, fs:nothing, gs:nothing
  2893.  
  2894. ; =============== S U B R O U T I N E =======================================
  2895.  
  2896. ; Attributes: bp-based frame
  2897.  
  2898. ; NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
  2899.         public DriverEntryx
  2900. DriverEntryx    proc near       ; DATA XREF: sub_400A70+38o
  2901.                     ; sub_400B14+7o ...
  2902.  
  2903. DriverObjectExtension= dword ptr  8
  2904. SourceString    = dword ptr  0Ch
  2905.  
  2906.         push    ebp
  2907.         mov ebp, esp
  2908.         push    esi
  2909.         mov esi, [ebp+DriverObjectExtension]
  2910.         lea eax, [ebp+DriverObjectExtension]
  2911.         push    eax     ; DriverObjectExtension
  2912.         push    0Ch     ; DriverObjectExtensionSize
  2913.         push    offset DriverEntry ; ClientIdentificationAddress
  2914.         push    esi     ; DriverObject
  2915.         call    IoAllocateDriverObjectExtension
  2916.         test    eax, eax
  2917.         jl  loc_401F46
  2918.         mov ecx, [ebp+DriverObjectExtension]
  2919.         push    edi
  2920.         mov edi, [ebp+SourceString]
  2921.         mov ax, [edi]
  2922.         mov [ecx], ax
  2923.         mov ax, [edi+2]
  2924.         mov ecx, [ebp+DriverObjectExtension]
  2925.         add ax, 2
  2926.         mov [ecx+2], ax
  2927.         mov eax, [ebp+DriverObjectExtension]
  2928.         movzx   eax, word ptr [eax+2]
  2929.         push    '1maR'          ; Tag
  2930.         push    eax     ; NumberOfBytes
  2931.         push    1       ; PoolType
  2932.         call    ExAllocatePoolWithTag
  2933.         mov ecx, [ebp+DriverObjectExtension]
  2934.         mov [ecx+4], eax
  2935.         mov eax, [ebp+DriverObjectExtension]
  2936.         cmp dword ptr [eax+4], 0
  2937.         jnz short loc_401EE8
  2938.         mov eax, 0C000009Ah
  2939.         jmp short loc_401F45
  2940. ; ---------------------------------------------------------------------------
  2941.  
  2942. loc_401EE8:             ; CODE XREF: DriverEntry+5Fj
  2943.         push    edi     ; SourceString
  2944.         push    eax     ; DestinationString
  2945.         call    RtlCopyUnicodeString
  2946.         mov eax, [ebp+DriverObjectExtension]
  2947.         and dword ptr [eax+8], 0
  2948.         mov eax, offset loc_401200
  2949.         mov [esi+38h], eax
  2950.         mov [esi+40h], eax
  2951.         mov eax, offset sub_4006C4
  2952.         mov [esi+44h], eax
  2953.         mov [esi+48h], eax
  2954.         mov eax, [esi+18h]
  2955.         mov dword ptr [esi+70h], offset sub_400496
  2956.         mov dword ptr [esi+0A4h], offset sub_400E2E
  2957.         mov dword ptr [esi+90h], offset loc_400944
  2958.         mov dword ptr [esi+94h], offset loc_400994
  2959.         mov dword ptr [eax+4], offset sub_400B14
  2960.         mov dword ptr [esi+34h], offset sub_401DFC
  2961.         xor eax, eax
  2962.  
  2963. loc_401F45:             ; CODE XREF: DriverEntry+66j
  2964.         pop edi
  2965.  
  2966. loc_401F46:             ; CODE XREF: DriverEntry+1Bj
  2967.         pop esi
  2968.         pop ebp
  2969.         retn    8
  2970. DriverEntryx    endp
  2971.  
  2972. ; ---------------------------------------------------------------------------
  2973. ;INIT       ends
  2974. ends
  2975.  
  2976.  
  2977. ; Section 2. (virtual address 00001000)
  2978. ; Virtual size          : 0000013C (    316.)
  2979. ; Section size in file      : 00000180 (    384.)
  2980. ; Offset to raw data for section: 00001000
  2981. ; Flags 48000040: Data Not pageable Readable
  2982. ; Alignment : default
  2983. ;
  2984. ; Imports from HAL.dll
  2985. ;
  2986. ; ===========================================================================
  2987.  
  2988. ; Segment type: Externs
  2989. ; _idata
  2990. ; void __fastcall KfReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL NewIrql)
  2991.         extrn KfReleaseSpinLock:proc  ; CODE XREF: sub_4006C4+1A1p
  2992.                     ; DATA XREF: sub_4006C4+1A1r ...
  2993. ; KIRQL __fastcall KfAcquireSpinLock(PKSPIN_LOCK SpinLock)
  2994.         extrn KfAcquireSpinLock:proc  ; CODE XREF: sub_4006C4+EEp
  2995.                     ; DATA XREF: sub_4006C4+EEr
  2996.  
  2997. ;
  2998. ; Imports from ntoskrnl.exe
  2999. ;
  3000. ; NTSTATUS __stdcall IoAcquireRemoveLockEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, PCSTR File, ULONG Line, ULONG RemlockSize)
  3001.         extrn IoAcquireRemoveLockEx:proc  ; CODE XREF: sub_400496+28p
  3002.                     ; sub_4006C4+43p ...
  3003. ; PVOID __stdcall MmMapLockedPagesSpecifyCache(PMDL MemoryDescriptorList, KPROCESSOR_MODE AccessMode, MEMORY_CACHING_TYPE CacheType, PVOID BaseAddress, ULONG BugCheckOnFailure, MM_PAGE_PRIORITY Priority)
  3004.         extrn MmMapLockedPagesSpecifyCache:proc  ; CODE XREF: sub_400616+69p
  3005.                     ; sub_4006C4+C9p ...
  3006. ; void __stdcall MmUnmapLockedPages(PVOID BaseAddress, PMDL MemoryDescriptorList)
  3007.         extrn MmUnmapLockedPages:proc  ; CODE XREF: sub_400616+50p
  3008.                     ; sub_4009C8+57p
  3009.                     ; DATA XREF: ...
  3010. ; void *__cdecl memmove(void *, const void *, size_t)
  3011.         extrn memmove:proc  ; CODE XREF: sub_4006C4+13Ap
  3012.                     ; sub_4006C4+181p
  3013.                     ; DATA XREF: ...
  3014. ; void __stdcall RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PCUNICODE_STRING SourceString)
  3015.         extrn RtlCopyUnicodeString:proc  ; CODE XREF: sub_400B14+2A0p
  3016.                     ; sub_401300+207p ...
  3017. ; NTSTATUS __stdcall RtlQueryRegistryValues(ULONG RelativeTo, PCWSTR Path, PRTL_QUERY_REGISTRY_TABLE QueryTable, PVOID Context, PVOID Environment)
  3018.         extrn RtlQueryRegistryValues:proc  ; CODE XREF: sub_401300+1E6p
  3019.                     ; DATA XREF: sub_401300+1E6r
  3020. ; PVOID __stdcall ExAllocatePoolWithTag(POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG Tag)
  3021.         extrn ExAllocatePoolWithTag:proc  ; CODE XREF: sub_400B14+6Cp
  3022.                     ; sub_400B14+15Fp ...
  3023. ; void __stdcall RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
  3024.         extrn RtlInitUnicodeString:proc  ; CODE XREF: sub_400B14+38p
  3025.                     ; sub_400B14+27Fp ...
  3026. ; char *__cdecl strncpy(char *, const char *, size_t)
  3027.         extrn strncpy:proc  ; CODE XREF: sub_4015DC+557p
  3028.                     ; sub_4015DC+5ECp ...
  3029. ; NTSTATUS __stdcall IoAllocateDriverObjectExtension(PDRIVER_OBJECT DriverObject, PVOID ClientIdentificationAddress, ULONG DriverObjectExtensionSize, PVOID *DriverObjectExtension)
  3030.         extrn IoAllocateDriverObjectExtension:proc  ; CODE XREF: DriverEntry+13p
  3031.                     ; DATA XREF: DriverEntry+13r
  3032. ; void __stdcall ExFreePoolWithTag(PVOID P, ULONG Tag)
  3033.         extrn ExFreePoolWithTag:proc  ; CODE XREF: sub_4009C8+31p
  3034.                     ; sub_4009C8+3Fp ...
  3035. ; PVOID __stdcall IoGetDriverObjectExtension(PDRIVER_OBJECT DriverObject, PVOID ClientIdentificationAddress)
  3036.         extrn IoGetDriverObjectExtension:proc  ; CODE XREF: sub_400A70+40p
  3037.                     ; sub_400B14+15p ...
  3038. ; NTSTATUS __stdcall PoCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp)
  3039.         extrn PoCallDriver:proc  ; CODE XREF: .text:00400989p
  3040.                     ; DATA XREF: .text:00400989r
  3041. ; void __stdcall PoStartNextPowerIrp(PIRP Irp)
  3042.         extrn PoStartNextPowerIrp:proc  ; CODE XREF: .text:00400958p
  3043.                     ; .text:loc_400978p
  3044.                     ; DATA XREF: ...
  3045. ; void __stdcall IoReleaseRemoveLockEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, ULONG RemlockSize)
  3046.         extrn IoReleaseRemoveLockEx:proc  ; CODE XREF: sub_400496+171p
  3047.                     ; sub_4006C4+1CEp ...
  3048. ; LONG __stdcall KeSetEvent(PRKEVENT Event, KPRIORITY Increment, BOOLEAN Wait)
  3049.         extrn KeSetEvent:proc   ; CODE XREF: .text:004009BAp
  3050.                     ; DATA XREF: .text:004009BAr
  3051. ; void __stdcall IoDeleteDevice(PDEVICE_OBJECT DeviceObject)
  3052.         extrn IoDeleteDevice:proc  ; DATA XREF: sub_4009C8+A2r
  3053. ; void __stdcall IoDetachDevice(PDEVICE_OBJECT TargetDevice)
  3054.         extrn IoDetachDevice:proc  ; CODE XREF: sub_4009C8+9Bp
  3055.                     ; DATA XREF: sub_4009C8+9Br
  3056. ; void __stdcall MmFreePagesFromMdl(PMDL MemoryDescriptorList)
  3057.         extrn MmFreePagesFromMdl:proc  ; CODE XREF: sub_4009C8+75p
  3058.                     ; sub_400B14+1CEp
  3059.                     ; DATA XREF: ...
  3060. ; NTSTATUS __stdcall IoDeleteSymbolicLink(PUNICODE_STRING SymbolicLinkName)
  3061.         extrn IoDeleteSymbolicLink:proc  ; CODE XREF: sub_4009C8+15p
  3062.                     ; DATA XREF: sub_4009C8+15r
  3063. ; void __stdcall IoReleaseRemoveLockAndWaitEx(PIO_REMOVE_LOCK RemoveLock, PVOID Tag, ULONG RemlockSize)
  3064.         extrn IoReleaseRemoveLockAndWaitEx:proc  ; CODE XREF: sub_400A70+32p
  3065.                     ; DATA XREF: sub_400A70+32r
  3066. ; PDEVICE_OBJECT __stdcall IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, PDEVICE_OBJECT TargetDevice)
  3067.         extrn IoAttachDeviceToDeviceStack:proc  ; CODE XREF: sub_400B14+2D1p
  3068.                     ; DATA XREF: sub_400B14+2D1r
  3069. ; NTSTATUS __stdcall IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName, PUNICODE_STRING DeviceName)
  3070.         extrn IoCreateSymbolicLink:proc  ; CODE XREF: sub_400B14+2B6p
  3071.                     ; DATA XREF: sub_400B14+2B6r
  3072. ; NTSTATUS __stdcall RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PCUNICODE_STRING Source)
  3073.         extrn RtlAppendUnicodeStringToString:proc  ; CODE XREF: sub_400B14+2ABp
  3074.                     ; DATA XREF: sub_400B14+2ABr
  3075. ; PMDL __stdcall MmAllocatePagesForMdl(PHYSICAL_ADDRESS LowAddress, PHYSICAL_ADDRESS HighAddress, PHYSICAL_ADDRESS SkipBytes, SIZE_T TotalBytes)
  3076.         extrn MmAllocatePagesForMdl:proc  ; CODE XREF: sub_400B14+1A9p
  3077.                     ; DATA XREF: sub_400B14+1A9r
  3078. ; void __stdcall KeInitializeSpinLock(PKSPIN_LOCK SpinLock)
  3079.         extrn KeInitializeSpinLock:proc  ; CODE XREF: sub_400B14+138p
  3080.                     ; DATA XREF: sub_400B14+138r
  3081. ; void __stdcall IoInitializeRemoveLockEx(PIO_REMOVE_LOCK Lock, ULONG AllocateTag, ULONG MaxLockedMinutes, ULONG HighWatermark, ULONG RemlockSize)
  3082.         extrn IoInitializeRemoveLockEx:proc  ; CODE XREF: sub_400B14+120p
  3083.                     ; DATA XREF: sub_400B14+120r
  3084. ; NTSTATUS __stdcall IoCreateDevice(PDRIVER_OBJECT DriverObject, ULONG DeviceExtensionSize, PUNICODE_STRING DeviceName, ULONG DeviceType, ULONG DeviceCharacteristics, BOOLEAN Exclusive, PDEVICE_OBJECT *DeviceObject)
  3085.         extrn IoCreateDevice:proc  ; CODE XREF: sub_400B14+D9p
  3086.                     ; DATA XREF: sub_400B14+D9r
  3087. ; NTSTATUS __stdcall KeWaitForSingleObject(PVOID Object, KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
  3088.         extrn KeWaitForSingleObject:proc  ; CODE XREF: sub_400E2E+10Cp
  3089.                     ; DATA XREF: sub_400E2E+10Cr
  3090. ; void __stdcall KeInitializeEvent(PRKEVENT Event, EVENT_TYPE Type, BOOLEAN State)
  3091.         extrn KeInitializeEvent:proc  ; CODE XREF: sub_400E2E+BCp
  3092.                     ; DATA XREF: sub_400E2E+BCr
  3093. ; void __fastcall IofCompleteRequest(PIRP Irp, CCHAR PriorityBoost)
  3094.         extrn IofCompleteRequest:proc  ; CODE XREF: sub_400496+40p
  3095.                     ; sub_400496+165p ...
  3096. ; NTSTATUS __fastcall IofCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp)
  3097.         extrn IofCallDriver:proc
  3098.  ; CODE XREF: .text:004009A9p
  3099.                     ; sub_400A70+1Ep ...
  3100.  
  3101.  
  3102.  
  3103.  
  3104. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement