Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
4.3 KiB

  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. remlock.c
  5. Abstract:
  6. This is the NT SCSI port driver.
  7. Authors:
  8. Peter Wieland
  9. Kenneth Ray
  10. Environment:
  11. kernel mode only
  12. Notes:
  13. This module is a driver dll for scsi miniports.
  14. Revision History:
  15. --*/
  16. #include "precomp.h"
  17. //#include <nt.h>
  18. //#include <ntos.h>
  19. //#include <io.h>
  20. //
  21. // From remlock.h
  22. //
  23. #define IO_REMOVE_LOCK_SIG 'COLR'
  24. /*
  25. typedef struct FULL_REMOVE_LOCK {
  26. IO_REMOVE_LOCK_COMMON_BLOCK Common;
  27. IO_REMOVE_LOCK_DBG_BLOCK Dbg;
  28. } FULL_REMOVE_LOCK;
  29. */
  30. typedef union _REMLOCK_FLAGS {
  31. struct {
  32. ULONG Checked: 1;
  33. ULONG Filler: 31;
  34. };
  35. ULONG Raw;
  36. } REMLOCK_FLAGS;
  37. DECLARE_API ( remlock )
  38. /*++
  39. Routine Description:
  40. Dump a remove lock structure
  41. --*/
  42. {
  43. ULONG64 memLoc=0;
  44. UCHAR buffer[256];
  45. ULONG result;
  46. ULONG64 blockLoc;
  47. UCHAR allocateTag[8];
  48. REMLOCK_FLAGS flags;
  49. // FULL_REMOVE_LOCK fullLock;
  50. // IO_REMOVE_LOCK_DBG_BLOCK dbgLock;
  51. // IO_REMOVE_LOCK_COMMON_BLOCK commonLock;
  52. // IO_REMOVE_LOCK_TRACKING_BLOCK block;
  53. ULONG64 pDbgLock = 0;
  54. ULONG64 pCommonLock;
  55. ULONG64 pBlock;
  56. ULONG IoCount, Removed, Signature;
  57. buffer[0] = '\0';
  58. if (!*args) {
  59. memLoc = EXPRLastDump;
  60. } else {
  61. if (GetExpressionEx(args, &memLoc, &args)) {
  62. if (StringCchCopy(buffer, sizeof(buffer), args) != S_OK)
  63. {
  64. buffer[0] = 0;
  65. }
  66. }
  67. }
  68. flags.Raw = 0;
  69. if ('\0' != buffer[0]) {
  70. flags.Raw = (ULONG) GetExpression(buffer);
  71. }
  72. dprintf ("Dump Remove Lock: %I64x %x ", memLoc, flags.Raw);
  73. if (flags.Checked) {
  74. ULONG Sz = GetTypeSize("IO_REMOVE_LOCK_COMMON_BLOCK");
  75. dprintf ("as Checked\n");
  76. pCommonLock = memLoc; pDbgLock = memLoc + Sz;
  77. if (GetFieldValue (pCommonLock, "IO_REMOVE_LOCK_COMMON_BLOCK",
  78. "Removed", Removed) ||
  79. GetFieldValue (pDbgLock, "IO_REMOVE_LOCK_DBG_BLOCK",
  80. "Signature", Signature)) {
  81. dprintf ("Could not read memLock extension\n");
  82. return E_INVALIDARG;
  83. }
  84. if (IO_REMOVE_LOCK_SIG != Signature) {
  85. dprintf ("Signature does not match that of a remove lock\n");
  86. return E_INVALIDARG;
  87. }
  88. } else {
  89. dprintf ("as Free\n");
  90. pCommonLock = memLoc;
  91. if (GetFieldValue (memLoc, "IO_REMOVE_LOCK_COMMON_BLOCK",
  92. "Removed", Removed)) {
  93. dprintf ("Could not read memLock extension\n");
  94. return E_INVALIDARG;
  95. }
  96. }
  97. GetFieldValue (pCommonLock, "IO_REMOVE_LOCK_COMMON_BLOCK", "IoCount", IoCount);
  98. dprintf ("IsRemoved %x, IoCount %x\n", Removed, IoCount);
  99. if (flags.Checked && pDbgLock) { // checked
  100. SYM_DUMP_PARAM sym = { 0 };
  101. sym.sName = (PUCHAR) "PCHAR";
  102. sym.size = sizeof(sym);
  103. InitTypeRead(pDbgLock, IO_REMOVE_LOCK_DBG_BLOCK);
  104. allocateTag [4] = '\0';
  105. * (PULONG) allocateTag = (ULONG) ReadField(AllocateTag);
  106. dprintf ("HighWatermark %x, MaxLockedTicks %I64x, AllocateTag %s \n",
  107. (ULONG) ReadField(HighWatermark),
  108. ReadField(MaxLockedTicks),
  109. allocateTag);
  110. blockLoc = ReadField(Blocks);
  111. while (blockLoc) {
  112. ULONG offset = 0;
  113. InitTypeRead(blockLoc, _IO_REMOVE_LOCK_TRACKING_BLOCK);
  114. dprintf ("Block Tag %p Line %d TimeLock %I64d\n",
  115. ReadField(Tag),
  116. (ULONG) ReadField(Line),
  117. ReadField(TimeLocked));
  118. //
  119. // Using ReadField(File) returns the wrong pointer. I need a pointer
  120. // to the pointer value, so we must use the field offset
  121. //
  122. if (!GetFieldOffset("_IO_REMOVE_LOCK_TRACKING_BLOCK", "File", &offset)) {
  123. dprintf(" File ");
  124. sym.addr = blockLoc + offset;
  125. Ioctl(IG_DUMP_SYMBOL_INFO, &sym, sym.size);
  126. }
  127. blockLoc = ReadField(Link);
  128. }
  129. }
  130. return S_OK;
  131. }