AsyncQue.asm
上传用户:lnzz01
上传日期:2013-05-23
资源大小:130k
文件大小:3k
源码类别:

DNA

开发平台:

C/C++

  1. .386p
  2. .xlist
  3. include vmm.inc
  4. include blockdev.inc
  5. include ior.inc
  6. include iop.inc
  7. include dcb.inc
  8. MASM=1
  9. include ifs.inc
  10. include ifsmgr.inc
  11. include ilb.inc
  12. include debug.inc
  13. include med.inc ; required for iodebug.inc
  14. ; include iodebug.inc     ; various IOS assertions (like AssertIOP)
  15. .list
  16. memcpy proto C, pd:ptr, ps:ptr, size_t:DWORD
  17. VXD_LOCKED_DATA_SEG
  18. extrn milb:DWORD
  19. public hFile
  20. hFile dw 0
  21. VXD_LOCKED_DATA_ENDS
  22. ;;;;;;;;;;;;;;;;;;;
  23. VXD_LOCKED_CODE_SEG
  24. OnCDRomIOCtl proto stdcall, IOR_ptr:DWORD
  25. ;;;==========================================
  26. PAGE
  27. SUBTTL OnAsyncRequest
  28. BeginProc   OnAsyncRequest,esp
  29. ArgVar IOP_ptr, DWORD
  30. TRAP
  31. EnterProc
  32. mov ebx, IOP_ptr
  33. ; AssertIOP <ebx>
  34. .ERRNZ IOR_READ - 0
  35. .ERRNZ IOR_WRITE - 1
  36. .ERRNZ IOR_VERIFY - 2
  37. .ERRNZ IOR_MEDIA_CHECK_RESET - 06H
  38. mov [ebx].IOP_ior.IOR_status, IORS_SUCCESS
  39. mov eax, DCB_DEV_IO_ACTIVE
  40. or [ebx].IOP_physical_dcb.DCB_device_flags, eax
  41. movzx eax, [ebx].IOP_ior.IOR_func
  42. cmp eax, IOR_FORMAT
  43. ja On_Call_Down
  44. cmp eax, IOR_READ
  45. je Read_cd
  46. cmp eax, IOR_MEDIA_CHECK_RESET
  47. je Media_check
  48. cmp eax, IOR_GEN_IOCTL
  49. je Gen_IOctl
  50. cmp eax, IOR_COMPUTE_GEOM
  51. je Compute_geom
  52. On_Call_Down:
  53. mov eax, DCB_DEV_IO_ACTIVE
  54. xor [ebx].IOP_physical_dcb.DCB_device_flags, eax
  55. cmp [ebx].IOP_ior.IOR_func, IOR_RESTART_QUEUE
  56. jne @F
  57. mov [ebx].IOP_ior.IOR_status, IORS_SUCCESS
  58. jmp Callback_next
  59. @@:
  60. mov [ebx].IOP_ior.IOR_status, IORS_INVALID_COMMAND
  61. On_Call_Back:
  62. mov eax, DCB_DEV_IO_ACTIVE
  63. xor [ebx].IOP_physical_dcb.DCB_device_flags, eax
  64. Callback_next:
  65. mov eax, [ebx].IOP_callback_ptr
  66. sub eax, size IOP_callback_entry
  67. mov [ebx].IOP_callback_ptr, eax
  68. push ebx
  69. call     dword ptr [eax]  
  70. add esp, 4
  71. LeaveProc ; deallocute local variable
  72. Return
  73. Media_check:
  74. mov [ebx].IOP_ior.IOR_status, IORS_NOT_READY
  75. jmp On_Call_Back
  76. Read_cd:
  77. cmp [ebx].IOP_ior.IOR_start_addr, 10h
  78. jb invalid_sector
  79. movzx eax, hFile
  80. Test eax, eax
  81. jnz @F
  82. ; call  OpenImgFile  // 用于打开镜像文件的 OpenImgFile 函数未建立。
  83. ;          可以通过呼叫 0 级文件系统建立。
  84. test ax,ax
  85. jz @F
  86. @@:
  87. mov [ebx].IOP_ior.IOR_status, IORS_NO_MEDIA
  88. jmp On_Call_Back
  89. invalid_sector:
  90. mov [ebx].IOP_ior.IOR_status, IORS_INVALID_SECTOR
  91. jmp On_Call_Back
  92. Gen_IOctl:
  93. invoke OnCDRomIOCtl, addr [ebx.IOP_ior]
  94. jmp On_Call_Back
  95. Compute_geom:
  96. mov [ebx].IOP_ior.IOR_status, IORS_SUCCESS
  97. jmp On_Call_Back
  98. EndProc OnAsyncRequest
  99. VXD_LOCKED_CODE_ENDS
  100. end