Windows NT 4.0 source code leak
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.

799 lines
24 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. rdrkd.c
  5. Abstract:
  6. Rdr Kernel Debugger extension
  7. Author:
  8. Milan Shah (milans) 16-Feb-1996
  9. Revision History:
  10. 16-Feb-1996 Milans Created
  11. --*/
  12. #include <ntifs.h>
  13. #include <windef.h>
  14. #include <ntkdexts.h>
  15. #include <rdr.h>
  16. #include <kdextlib.h>
  17. VOID
  18. dumplist(
  19. DWORD dwListEntryAddress,
  20. DWORD linkOffset,
  21. VOID (*dumpRoutine)(DWORD dwStructAddress)
  22. );
  23. /*
  24. * Rdr global variables.
  25. *
  26. */
  27. #define NO_SYMBOLS_MESSAGE \
  28. "Unable to get address of Rdr!RdrData - do you have symbols?\n"
  29. LPSTR ExtensionNames[] = {
  30. "Rdr1 debugger extensions",
  31. 0
  32. };
  33. LPSTR Extensions[] = {
  34. "RdrData - dumps Rdr!RdrData",
  35. "ActiveSeList - dumps active se list given address of list head",
  36. "DefaultSeList - dumps default se list given address of list head",
  37. "GlobalCleList - dumps global list of connections",
  38. "ServerCleList - dumps connect list given address of list head",
  39. "ConnectFcbs - dumps FCBS for a connection given FCB list head",
  40. "Dump - dump a data structure. Type in 'rdrkd.dump' for more info",
  41. 0
  42. };
  43. /*
  44. * REDIRDATA
  45. *
  46. */
  47. ENUM_VALUE_DESCRIPTOR RdrStateEnum[] = {
  48. {RdrStopped, "Rdr Stopped"},
  49. {RdrStarted, "Rdr Started"},
  50. {RdrStopping, "Rdr Stopping"},
  51. 0
  52. };
  53. FIELD_DESCRIPTOR RdrDataFields[] = {
  54. FIELD4(FieldTypeEnum,REDIRDATA,Initialized,RdrStateEnum),
  55. FIELD3(FieldTypeStruct,REDIRDATA,ComputerName),
  56. FIELD3(FieldTypeULong,REDIRDATA,DormantConnectionTimeout),
  57. FIELD3(FieldTypeULong,REDIRDATA,LockIncrement),
  58. FIELD3(FieldTypeULong,REDIRDATA,LockMaximum),
  59. FIELD3(FieldTypeULong,REDIRDATA,PipeIncrement),
  60. FIELD3(FieldTypeULong,REDIRDATA,PipeMaximum),
  61. FIELD3(FieldTypeULong,REDIRDATA,PipeBufferSize),
  62. FIELD3(FieldTypeULong,REDIRDATA,PipeWaitTimeout),
  63. FIELD3(FieldTypeULong,REDIRDATA,CollectDataTimeMs),
  64. FIELD3(FieldTypeULong,REDIRDATA,LockAndReadQuota),
  65. FIELD3(FieldTypeULong,REDIRDATA,MaximumNumberOfThreads),
  66. FIELD3(FieldTypeULong,REDIRDATA,CachedFileTimeout),
  67. FIELD3(FieldTypeULong,REDIRDATA,DormantFileLimit),
  68. FIELD3(FieldTypeULong,REDIRDATA,ReadAheadThroughput),
  69. FIELD3(FieldTypeBoolean,REDIRDATA,UseOpportunisticLocking),
  70. FIELD3(FieldTypeBoolean,REDIRDATA,UseOpBatch),
  71. FIELD3(FieldTypeBoolean,REDIRDATA,UseUnlockBehind),
  72. FIELD3(FieldTypeBoolean,REDIRDATA,UseCloseBehind),
  73. FIELD3(FieldTypeBoolean,REDIRDATA,BufferNamedPipes),
  74. FIELD3(FieldTypeBoolean,REDIRDATA,UseLockAndReadWriteAndUnlock),
  75. FIELD3(FieldTypeBoolean,REDIRDATA,UtilizeNtCaching),
  76. FIELD3(FieldTypeBoolean,REDIRDATA,UseRawRead),
  77. FIELD3(FieldTypeBoolean,REDIRDATA,UseRawWrite),
  78. FIELD3(FieldTypeBoolean,REDIRDATA,UseWriteRawWithData),
  79. FIELD3(FieldTypeBoolean,REDIRDATA,UseEncryption),
  80. FIELD3(FieldTypeBoolean,REDIRDATA,BufferFilesWithDenyWrite),
  81. FIELD3(FieldTypeBoolean,REDIRDATA,BufferReadOnlyFiles),
  82. FIELD3(FieldTypeBoolean,REDIRDATA,ForceCoreCreateMode),
  83. FIELD3(FieldTypeBoolean,REDIRDATA,Use512ByteMaximumTransfer),
  84. FIELD3(FieldTypeBoolean,REDIRDATA,NtSecurityEnabled),
  85. 0
  86. };
  87. BIT_MASK_DESCRIPTOR ServerCaps[] = {
  88. {DF_CORE, "Core"},
  89. {DF_MIXEDCASEPW, "MixedCasePasswords"},
  90. {DF_OLDRAWIO, "Old Raw IO"},
  91. {DF_NEWRAWIO, "New Raw IO"},
  92. {DF_LANMAN10, "Lanman 10"},
  93. {DF_LANMAN20, "Lanman 20"},
  94. {DF_MIXEDCASE, "Mixed case file names"},
  95. {DF_LONGNAME, "Long file names"},
  96. {DF_EXTENDNEGOT, "Supports Extended Negotiate"},
  97. {DF_LOCKREAD, "Supports LockReadWriteUnlock"},
  98. {DF_SECURITY, "Supports enhanced security"},
  99. {DF_NTPROTOCOL, "Supports NT Protocol"},
  100. {DF_SUPPORTEA, "Supports EAs"},
  101. {DF_LANMAN21, "Lanman 2.1"},
  102. {DF_CANCEL, "Supports NT style Cancel"},
  103. {DF_UNICODE, "Supports Unicode"},
  104. {DF_NTNEGOTIATE, "Supports NT style negotiate"},
  105. {DF_LARGE_FILES, "Supports large files"},
  106. {DF_NT_SMBS, "Supports NT SMBs"},
  107. {DF_RPC_REMOTE, "Supports server administration via RPC"},
  108. {DF_NT_STATUS, "Returns NT style status"},
  109. {DF_OPLOCK_LVL2, "Supports Level 2 oplocks"},
  110. {DF_TIME_IS_UTC, "Server time is UTC"},
  111. {DF_WFW, "Server is Windows for Workgroups"},
  112. {DF_TRANS2_FSCTL, "Supports remoted fsctls via trans2"},
  113. {DF_DFSAWARE, "Server is Dfs Enabled"},
  114. {DF_NT_FIND, "Supports NT info levels"},
  115. {DF_NT_40, "NT 4.0 Server"},
  116. 0
  117. };
  118. BIT_MASK_DESCRIPTOR ServerFlags[] = {
  119. {SLE_PAGING_FILE, "Server has a paging file"},
  120. {SLE_PINGING, "Ping outstanding"},
  121. 0
  122. };
  123. FIELD_DESCRIPTOR ServerListEntryFields[] = {
  124. FIELD3(FieldTypeUShort,SERVERLISTENTRY,Signature),
  125. FIELD3(FieldTypeUShort,SERVERLISTENTRY,Size),
  126. FIELD3(FieldTypePointer,SERVERLISTENTRY,RefCount),
  127. FIELD4(FieldTypeDWordBitMask,SERVERLISTENTRY,Flags,ServerFlags),
  128. FIELD4(FieldTypeDWordBitMask,SERVERLISTENTRY,Capabilities,ServerCaps),
  129. FIELD3(FieldTypeUnicodeString,SERVERLISTENTRY,Text),
  130. FIELD3(FieldTypePointer,SERVERLISTENTRY,LastConnectStatus),
  131. FIELD3(FieldTypeULong,SERVERLISTENTRY,LastConnectTime),
  132. FIELD3(FieldTypeUnicodeString,SERVERLISTENTRY,DomainName),
  133. FIELD3(FieldTypeStruct,SERVERLISTENTRY,GlobalNext),
  134. FIELD3(FieldTypeStruct,SERVERLISTENTRY,CLEHead),
  135. FIELD3(FieldTypeStruct,SERVERLISTENTRY,DefaultSeList),
  136. FIELD3(FieldTypeStruct,SERVERLISTENTRY,ActiveSecurityList),
  137. FIELD3(FieldTypeStruct,SERVERLISTENTRY,PotentialSecurityList),
  138. FIELD3(FieldTypePointer,SERVERLISTENTRY,SpecificTransportProvider),
  139. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,IsLoopback),
  140. FIELD3(FieldTypeStruct,SERVERLISTENTRY,TimeZoneBias),
  141. FIELD3(FieldTypeULong,SERVERLISTENTRY,ConnectionReferenceCount),
  142. FIELD3(FieldTypePointer,SERVERLISTENTRY,ConnectionContext),
  143. FIELD3(FieldTypeLong,SERVERLISTENTRY,SecurityEntryCount),
  144. FIELD3(FieldTypeULong,SERVERLISTENTRY,SessionKey),
  145. FIELD3(FieldTypeULong,SERVERLISTENTRY,BufferSize),
  146. FIELD3(FieldTypeUShort,SERVERLISTENTRY,MaximumRequests),
  147. FIELD3(FieldTypeUShort,SERVERLISTENTRY,MaximumVCs),
  148. FIELD3(FieldTypePointer,SERVERLISTENTRY,MpxTable),
  149. FIELD3(FieldTypePointer,SERVERLISTENTRY,OpLockMpxEntry),
  150. FIELD3(FieldTypeULong,SERVERLISTENTRY,NumberOfEntries),
  151. FIELD3(FieldTypeULong,SERVERLISTENTRY,NumberOfActiveEntries),
  152. FIELD3(FieldTypeULong,SERVERLISTENTRY,NumberOfLongTermEntries),
  153. FIELD3(FieldTypeULong,SERVERLISTENTRY,MaximumCommands),
  154. FIELD3(FieldTypeUShort,SERVERLISTENTRY,MultiplexedCounter),
  155. FIELD3(FieldTypeUShort,SERVERLISTENTRY,MultiplexedIncrement),
  156. FIELD3(FieldTypeUShort,SERVERLISTENTRY,MultiplexedMask),
  157. FIELD3(FieldTypeUShort,SERVERLISTENTRY,CryptKeyLength),
  158. FIELD3(FieldTypeStruct,SERVERLISTENTRY,GateSemaphore),
  159. FIELD3(FieldTypeStruct,SERVERLISTENTRY,CreationLock),
  160. FIELD3(FieldTypeStruct,SERVERLISTENTRY,SessionStateModifiedLock),
  161. FIELD3(FieldTypeStruct,SERVERLISTENTRY,OutstandingRequestResource),
  162. FIELD3(FieldTypeStruct,SERVERLISTENTRY,RawResource),
  163. FIELD3(FieldTypeULong,SERVERLISTENTRY,Throughput),
  164. FIELD3(FieldTypeULong,SERVERLISTENTRY,Delay),
  165. FIELD3(FieldTypeULong,SERVERLISTENTRY,WriteBehindPages),
  166. FIELD3(FieldTypeStruct,SERVERLISTENTRY,ThirtySecondsOfData),
  167. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,Reliable),
  168. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,ReadAhead),
  169. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,ConnectionValid),
  170. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,DisconnectNeeded),
  171. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,UserSecurity),
  172. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,EncryptPasswords),
  173. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,SupportsRawRead),
  174. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,SupportsRawWrite),
  175. FIELD3(FieldTypeBoolean,SERVERLISTENTRY,Scanning),
  176. FIELD3(FieldTypeStruct,SERVERLISTENTRY,CryptKey),
  177. #ifdef RDRDBG_REQUEST_RESOURCE
  178. FIELD3(FieldTypeStruct,SERVERLISTENTRY,RequestHistoryLock),
  179. FIELD3(FieldTypeULong,SERVERLISTENTRY,RequestHistoryIndex),
  180. FIELD3(FieldTypeStruct,SERVERLISTENTRY,RequestHistory),
  181. #endif
  182. 0
  183. };
  184. ENUM_VALUE_DESCRIPTOR ConnectTypeEnum[] = {
  185. {(ULONG) CONNECT_WILD, "Connect Wild"},
  186. {CONNECT_DISK, "Connect Disk"},
  187. {CONNECT_PRINT, "Connect Print"},
  188. {CONNECT_COMM, "Connect Comm"},
  189. {CONNECT_IPC, "Connect IPC"},
  190. 0
  191. };
  192. BIT_MASK_DESCRIPTOR ConnectFlags[] = {
  193. {CLE_SCANNED, "Connection has been scanned during dormant scan"},
  194. {CLE_DORMANT, "Connection is dormant"},
  195. {CLE_TREECONNECTED, "Connection has a tree connection"},
  196. {CLE_DOESNT_NOTIFY, "ChangeNotify not supported"},
  197. {CLE_IS_A_DFS_SHARE, "Share is in Dfs"},
  198. 0
  199. };
  200. FIELD_DESCRIPTOR ConnectListEntryFields[] = {
  201. FIELD3(FieldTypeUShort,CONNECTLISTENTRY,Signature),
  202. FIELD3(FieldTypeUShort,CONNECTLISTENTRY,Size),
  203. FIELD3(FieldTypeULong,CONNECTLISTENTRY,RefCount),
  204. FIELD4(FieldTypeEnum,CONNECTLISTENTRY,Type,ConnectTypeEnum),
  205. FIELD4(FieldTypeDWordBitMask,CONNECTLISTENTRY,Flags,ConnectFlags),
  206. FIELD3(FieldTypeLong,CONNECTLISTENTRY,NumberOfDormantFiles),
  207. FIELD3(FieldTypePointer,CONNECTLISTENTRY,Server),
  208. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,SiblingNext),
  209. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,GlobalNext),
  210. FIELD3(FieldTypeUnicodeString,CONNECTLISTENTRY,Text),
  211. FIELD3(FieldTypeULong,CONNECTLISTENTRY,SerialNumber),
  212. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,FcbChain),
  213. #ifdef NOTIFY
  214. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,DirNotifyList),
  215. #endif
  216. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,DefaultSeList),
  217. #ifdef NOTIFY
  218. FIELD3(FieldTypePointer,CONNECTLISTENTRY,NotifySync),
  219. #endif
  220. FIELD3(FieldTypeULong,CONNECTLISTENTRY,FileSystemGranularity),
  221. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,FileSystemSize),
  222. FIELD3(FieldTypeULong,CONNECTLISTENTRY,FileSystemAttributes),
  223. FIELD3(FieldTypeLong,CONNECTLISTENTRY,MaximumComponentLength),
  224. FIELD3(FieldTypeUShort,CONNECTLISTENTRY,FileSystemTypeLength),
  225. FIELD3(FieldTypeUShort,CONNECTLISTENTRY,TreeId),
  226. FIELD3(FieldTypeBoolean,CONNECTLISTENTRY,HasTreeId),
  227. FIELD3(FieldTypeBoolean,CONNECTLISTENTRY,Deleted),
  228. FIELD3(FieldTypeStruct,CONNECTLISTENTRY,FileSystemType),
  229. 0
  230. };
  231. /*
  232. * SECURITYENTRY
  233. *
  234. */
  235. BIT_MASK_DESCRIPTOR SecurityEntryFlags[] = {
  236. {SE_HAS_SESSION, "Has Session"},
  237. {SE_USE_DEFAULT_PASS, "Use Default Password"},
  238. {SE_USE_DEFAULT_USER, "Use Default User"},
  239. {SE_USE_DEFAULT_DOMAIN, "Use Default Domain"},
  240. {SE_IS_NULL_SESSION, "Is Null Session"},
  241. {SE_HAS_CONTEXT, "Has security context"},
  242. {SE_BLOB_NEEDS_VERIFYING, "Kerberos blob needs verifying"},
  243. {SE_RETURN_ON_ERROR, "Return on error"},
  244. {SE_HAS_CRED_HANDLE, "Has credential handle"},
  245. 0
  246. };
  247. FIELD_DESCRIPTOR SecurityEntryFields[] = {
  248. FIELD3(FieldTypeUShort,SECURITY_ENTRY,Signature),
  249. FIELD3(FieldTypeUShort,SECURITY_ENTRY,Size),
  250. FIELD3(FieldTypePointer,SECURITY_ENTRY,NonPagedSecurityEntry),
  251. FIELD4(FieldTypeDWordBitMask,SECURITY_ENTRY,Flags,SecurityEntryFlags),
  252. FIELD3(FieldTypeLong,SECURITY_ENTRY,OpenFileReferenceCount),
  253. FIELD3(FieldTypePointer,SECURITY_ENTRY,Server),
  254. FIELD3(FieldTypePointer,SECURITY_ENTRY,Connection),
  255. FIELD3(FieldTypeUnicodeString,SECURITY_ENTRY,UserName),
  256. FIELD3(FieldTypeUnicodeString,SECURITY_ENTRY,Password),
  257. FIELD3(FieldTypeUnicodeString,SECURITY_ENTRY,Domain),
  258. FIELD3(FieldTypeStruct,SECURITY_ENTRY,LogonId),
  259. FIELD3(FieldTypeStruct,SECURITY_ENTRY,ActiveNext),
  260. FIELD3(FieldTypeStruct,SECURITY_ENTRY,PotentialNext),
  261. FIELD3(FieldTypeStruct,SECURITY_ENTRY,DefaultSeNext),
  262. #if DBG
  263. FIELD3(FieldTypeStruct,SECURITY_ENTRY,GlobalNext),
  264. #endif
  265. FIELD3(FieldTypeStruct,SECURITY_ENTRY,Khandle),
  266. FIELD3(FieldTypeStruct,SECURITY_ENTRY,Chandle),
  267. FIELD3(FieldTypeUShort,SECURITY_ENTRY,UserId),
  268. FIELD3(FieldTypeStruct,SECURITY_ENTRY,UserSessionKey),
  269. FIELD3(FieldTypeStruct,SECURITY_ENTRY,LanmanSessionKey),
  270. 0
  271. };
  272. /*
  273. * ICB and FCB
  274. *
  275. */
  276. ENUM_VALUE_DESCRIPTOR FcbTypeEnum[] = {
  277. {Unknown, "Unknown"},
  278. {Redirector, "Redirector"},
  279. {NetRoot, "NetRoot"},
  280. {ServerRoot, "ServerRoot"},
  281. {TreeConnect, "TreeConnect"},
  282. {DiskFile, "DiskFile"},
  283. {PrinterFile, "PrinterFile"},
  284. {Directory, "Directory"},
  285. {NamedPipe, "NamedPipe"},
  286. {Com, "Com"},
  287. {Mailslot, "Mailslot"},
  288. {FileOrDirectory, "FileOrDirectory"},
  289. 0
  290. };
  291. BIT_MASK_DESCRIPTOR FcbFlags[] = {
  292. {FCB_ERROR, "File is in error"},
  293. {FCB_CLOSING, "File is in the process of closing"},
  294. {FCB_IMMUTABLE, "File cannot be modified"},
  295. {FCB_DELETEPEND, "File has delete pending on it"},
  296. {FCB_DOESNTEXIST, "File doesn't really exist"},
  297. {FCB_OPLOCKED, "File is oplocked"},
  298. {FCB_HASOPLOCKHANDLE, "Fcb->OplockFileId is valid"},
  299. {FCB_OPLOCKBREAKING, "Oplock breaking"},
  300. {FCB_WRITE_THROUGH, "Write through handle is open"},
  301. {FCB_PAGING_FILE, "File is a paging file"},
  302. {FCB_DELETEONCLOSE, "Delete the file on close"},
  303. {FCB_DFSFILE, "File opened by Dfs"},
  304. 0
  305. };
  306. BIT_MASK_DESCRIPTOR IcbFlags[] = {
  307. {ICB_ERROR, "File is in error"},
  308. {ICB_FORCECLOSED, "File was force closed"},
  309. {ICB_RENAMED, "File was renamed"},
  310. {ICB_TCONCREATED, "File was created as tree connect"},
  311. {ICB_HASHANDLE, "File has handle"},
  312. {ICB_PSEUDOOPENED, "File was pseudo-opened"},
  313. {ICB_DELETE_PENDING, "Delete Pending"},
  314. {ICB_OPENED, "File has been opened"},
  315. {ICB_SETDATEONCLOSE, "Set data-time on close"},
  316. {ICB_DEFERREDOPEN, "Deferred open"},
  317. {ICB_OPEN_TARGET_DIR, "Handle to target directory"},
  318. {ICB_SET_DEFAULT_SE, "Set Default SE"},
  319. {ICB_USER_SET_TIMES, "User set times"},
  320. {ICB_SETATTRONCLOSE, "Update attr. after close"},
  321. {ICB_DELETEONCLOSE, "Delete file on close"},
  322. {ICB_BACKUP_INTENT, "Opened for backup intent"},
  323. 0
  324. };
  325. /*
  326. * ICB
  327. *
  328. */
  329. FIELD_DESCRIPTOR IcbFileFields[] = {
  330. FIELD3(FieldTypeULong,ICB,Signature),
  331. FIELD4(FieldTypeDWordBitMask,ICB,Flags,IcbFlags),
  332. FIELD3(FieldTypePointer,ICB,Fcb),
  333. FIELD3(FieldTypePointer,ICB,NonPagedFcb),
  334. FIELD3(FieldTypeStruct,ICB,InstanceNext),
  335. FIELD3(FieldTypePointer,ICB,Se),
  336. FIELD3(FieldTypePointer,ICB,NonPagedSe),
  337. FIELD3(FieldTypeULong,ICB,GrantedAccess),
  338. FIELD3(FieldTypeUShort,ICB,FileId),
  339. FIELD4(FieldTypeEnum,ICB,Type,FcbTypeEnum),
  340. FIELD3(FieldTypeULong,ICB,EaIndex),
  341. FIELD3(FieldTypePointer,ICB,u.f.Scb),
  342. FIELD3(FieldTypePointer,ICB,u.f.FileObject),
  343. FIELD3(FieldTypeStruct,ICB,u.f.NextReadOffset),
  344. FIELD3(FieldTypeStruct,ICB,u.f.NextWriteOffset),
  345. FIELD3(FieldTypeStruct,ICB,u.f.BackOff),
  346. FIELD3(FieldTypeStruct,ICB,u.f.LockHead),
  347. FIELD3(FieldTypeULong,ICB,u.f.Flags),
  348. FIELD3(FieldTypeStruct,ICB,u.f.AndXBehind),
  349. FIELD3(FieldTypeChar,ICB,u.f.OplockLevel),
  350. FIELD3(FieldTypeBoolean,ICB,u.f.CcReadAhead),
  351. FIELD3(FieldTypeBoolean,ICB,u.f.CcReliable),
  352. 0
  353. };
  354. FIELD_DESCRIPTOR IcbDirectoryFields[] = {
  355. FIELD3(FieldTypeULong,ICB,Signature),
  356. FIELD4(FieldTypeDWordBitMask,ICB,Flags,IcbFlags),
  357. FIELD3(FieldTypePointer,ICB,Fcb),
  358. FIELD3(FieldTypePointer,ICB,NonPagedFcb),
  359. FIELD3(FieldTypeStruct,ICB,InstanceNext),
  360. FIELD3(FieldTypePointer,ICB,Se),
  361. FIELD3(FieldTypePointer,ICB,NonPagedSe),
  362. FIELD3(FieldTypeStruct,ICB,GrantedAccess),
  363. FIELD3(FieldTypeUShort,ICB,FileId),
  364. FIELD4(FieldTypeEnum,ICB,Type,FcbTypeEnum),
  365. FIELD3(FieldTypeULong,ICB,EaIndex),
  366. FIELD3(FieldTypePointer,ICB,u.d.Scb),
  367. FIELD3(FieldTypeStruct,ICB,u.d.DirCtrlOutstanding),
  368. FIELD3(FieldTypeULong,ICB,u.d.OpenOptions),
  369. FIELD3(FieldTypeUShort,ICB,u.d.ShareAccess),
  370. FIELD3(FieldTypeULong,ICB,u.d.FileAttributes),
  371. FIELD3(FieldTypeULong,ICB,u.d.DesiredAccess),
  372. FIELD3(FieldTypeULong,ICB,u.d.Disposition),
  373. 0
  374. };
  375. FIELD_DESCRIPTOR FcbFields[] = {
  376. FIELD3(FieldTypeStruct,FCB,Header),
  377. FIELD3(FieldTypePointer,FCB,NonPagedFcb),
  378. FIELD3(FieldTypeLong,FCB,NumberOfOpens),
  379. FIELD3(FieldTypeULong,FCB,OpenError),
  380. FIELD3(FieldTypeStruct,FCB,GlobalNext),
  381. FIELD3(FieldTypeStruct,FCB,ConnectNext),
  382. FIELD3(FieldTypeStruct,FCB,InstanceChain),
  383. FIELD3(FieldTypeUnicodeString,FCB,FileName),
  384. FIELD3(FieldTypeUnicodeString,FCB,LastFileName),
  385. FIELD3(FieldTypeStruct,FCB,ShareAccess),
  386. FIELD3(FieldTypeStruct,FCB,CreationTime),
  387. FIELD3(FieldTypeStruct,FCB,LastAccessTime),
  388. FIELD3(FieldTypeStruct,FCB,LastWriteTime),
  389. FIELD3(FieldTypeStruct,FCB,ChangeTime),
  390. FIELD3(FieldTypeULong,FCB,Attribute),
  391. FIELD3(FieldTypeStruct,FCB,FileLock),
  392. FIELD3(FieldTypeULong,FCB,WriteBehindPages),
  393. FIELD3(FieldTypeULong,FCB,DormantTimeout),
  394. FIELD3(FieldTypePointer,FCB,LazyWritingThread),
  395. FIELD3(FieldTypePointer,FCB,ServerFileId),
  396. FIELD3(FieldTypePointer,FCB,AcquireSizeRoutine),
  397. FIELD3(FieldTypePointer,FCB,ReleaseSizeRoutine),
  398. FIELD3(FieldTypeULong,FCB,GrantedAccess),
  399. FIELD3(FieldTypeUShort,FCB,GrantedShareAccess),
  400. FIELD3(FieldTypeUShort,FCB,AccessGranted),
  401. FIELD3(FieldTypeULong,FCB,UpdatedFile),
  402. FIELD3(FieldTypeULong,FCB,HaveSetCacheReadAhead),
  403. 0
  404. };
  405. FIELD_DESCRIPTOR NonPagedFcbFields[] = {
  406. FIELD3(FieldTypeUShort,NONPAGED_FCB,Signature),
  407. FIELD3(FieldTypeUShort,NONPAGED_FCB,Size),
  408. FIELD3(FieldTypePointer,NONPAGED_FCB,PagedFcb),
  409. #ifdef RDRDBG_FCBREF
  410. FIELD3(FieldTypeStruct,NONPAGED_FCB,ReferenceHistory),
  411. #endif
  412. FIELD3(FieldTypeLong,NONPAGED_FCB,RefCount),
  413. FIELD4(FieldTypeDWordBitMask,NONPAGED_FCB,Flags, FcbFlags),
  414. FIELD4(FieldTypeEnum,NONPAGED_FCB,Type,FcbTypeEnum),
  415. FIELD3(FieldTypePointer,NONPAGED_FCB,SharingCheckFcb),
  416. FIELD3(FieldTypeStruct,NONPAGED_FCB,SectionObjectPointer),
  417. FIELD3(FieldTypeStruct,NONPAGED_FCB,CreateComplete),
  418. FIELD3(FieldTypeStruct,NONPAGED_FCB,PurgeCacheSynchronizer),
  419. FIELD3(FieldTypePointer,NONPAGED_FCB,OplockedSecurityEntry),
  420. FIELD3(FieldTypeStruct,NONPAGED_FCB,InstanceChainLock),
  421. FIELD3(FieldTypeUShort,NONPAGED_FCB,OplockedFileId),
  422. FIELD3(FieldTypeChar,NONPAGED_FCB,OplockLevel),
  423. 0
  424. };
  425. STRUCT_DESCRIPTOR Structs[] = {
  426. STRUCT(REDIRDATA,RdrDataFields),
  427. STRUCT(SERVERLISTENTRY,ServerListEntryFields),
  428. STRUCT(CONNECTLISTENTRY,ConnectListEntryFields),
  429. STRUCT(SECURITY_ENTRY,SecurityEntryFields),
  430. STRUCT(FCB,FcbFields),
  431. STRUCT(NONPAGED_FCB,NonPagedFcbFields),
  432. {"ICB_FILE", sizeof(ICB), IcbFileFields},
  433. {"ICB_DIRECTORY", sizeof(ICB), IcbDirectoryFields},
  434. 0
  435. };
  436. /*
  437. * Rdr specific dump routines
  438. *
  439. */
  440. /*
  441. * rdrdata : Routine to dump the global rdr data structure
  442. *
  443. */
  444. BOOL
  445. rdrdata(
  446. DWORD dwCurrentPC,
  447. PNTKD_EXTENSION_APIS lpExtensionApis,
  448. LPSTR lpArgumentString
  449. )
  450. {
  451. DWORD dwAddress;
  452. SETCALLBACKS();
  453. dwAddress = (lpGetExpressionRoutine)("rdr!RdrData");
  454. if (dwAddress) {
  455. REDIRDATA RdrData;
  456. if (GetData( dwAddress, &RdrData, sizeof(RdrData) )) {
  457. PrintStructFields( dwAddress, &RdrData, RdrDataFields);
  458. } else {
  459. PRINTF( "Unable to read RdrData @ %08lx\n", dwAddress );
  460. }
  461. } else {
  462. PRINTF( NO_SYMBOLS_MESSAGE );
  463. }
  464. return( TRUE );
  465. }
  466. /*
  467. * SecurityEntryList
  468. *
  469. */
  470. VOID
  471. dumpSecurityEntry(
  472. DWORD dwAddress
  473. )
  474. {
  475. SECURITY_ENTRY se;
  476. if (GetData(dwAddress, &se, sizeof(se))) {
  477. PRINTF("\n--- Security Entry @ %08lx\n", dwAddress);
  478. PrintStructFields( dwAddress, &se, SecurityEntryFields );
  479. } else {
  480. PRINTF("\n*** Unable to read Security Entry @ %08lx\n", dwAddress );
  481. }
  482. }
  483. BOOL
  484. activeselist(
  485. DWORD dwCurrentPC,
  486. PNTKD_EXTENSION_APIS lpExtensionApis,
  487. LPSTR lpArgumentString
  488. )
  489. {
  490. DWORD dwAddress;
  491. SETCALLBACKS();
  492. if (lpArgumentString && *lpArgumentString) {
  493. dwAddress = (lpGetExpressionRoutine)(lpArgumentString);
  494. } else {
  495. PRINTF( "Must specify address of security entry list head\n" );
  496. return( TRUE );
  497. }
  498. if (dwAddress) {
  499. dumplist(
  500. dwAddress,
  501. FIELD_OFFSET(SECURITY_ENTRY,ActiveNext),
  502. dumpSecurityEntry);
  503. } else {
  504. PRINTF( NO_SYMBOLS_MESSAGE );
  505. }
  506. return(TRUE);
  507. }
  508. BOOL
  509. defaultselist(
  510. DWORD dwCurrentPC,
  511. PNTKD_EXTENSION_APIS lpExtensionApis,
  512. LPSTR lpArgumentString
  513. )
  514. {
  515. DWORD dwAddress;
  516. SETCALLBACKS();
  517. if (lpArgumentString && *lpArgumentString) {
  518. dwAddress = (lpGetExpressionRoutine)(lpArgumentString);
  519. } else {
  520. PRINTF( "Must specify address of security entry list head\n" );
  521. return( TRUE );
  522. }
  523. if (dwAddress) {
  524. dumplist(
  525. dwAddress,
  526. FIELD_OFFSET(SECURITY_ENTRY,DefaultSeNext),
  527. dumpSecurityEntry);
  528. } else {
  529. PRINTF( NO_SYMBOLS_MESSAGE );
  530. }
  531. return(TRUE);
  532. }
  533. /*
  534. * ConnectList
  535. *
  536. */
  537. VOID
  538. dumpConnectListEntry(
  539. DWORD dwAddress
  540. )
  541. {
  542. CONNECTLISTENTRY cle;
  543. if (GetData(dwAddress, &cle, sizeof(cle))) {
  544. PRINTF("\n--- Connect List Entry @ %08lx\n", dwAddress);
  545. PrintStructFields( dwAddress, &cle, ConnectListEntryFields );
  546. } else {
  547. PRINTF("\n*** Unable to read Connect List Entry @ %08lx\n", dwAddress );
  548. }
  549. }
  550. BOOL
  551. globalclelist(
  552. DWORD dwCurrentPC,
  553. PNTKD_EXTENSION_APIS lpExtensionApis,
  554. LPSTR lpArgumentString
  555. )
  556. {
  557. DWORD dwAddress;
  558. SETCALLBACKS();
  559. dwAddress = (lpGetExpressionRoutine)("rdr!RdrConnectHead");
  560. if (dwAddress) {
  561. dumplist(
  562. dwAddress,
  563. FIELD_OFFSET(CONNECTLISTENTRY,GlobalNext),
  564. dumpConnectListEntry);
  565. } else {
  566. PRINTF( NO_SYMBOLS_MESSAGE );
  567. }
  568. return(TRUE);
  569. }
  570. BOOL
  571. serverclelist(
  572. DWORD dwCurrentPC,
  573. PNTKD_EXTENSION_APIS lpExtensionApis,
  574. LPSTR lpArgumentString
  575. )
  576. {
  577. DWORD dwAddress;
  578. SETCALLBACKS();
  579. if (lpArgumentString && *lpArgumentString) {
  580. dwAddress = (lpGetExpressionRoutine)(lpArgumentString);
  581. } else {
  582. PRINTF( "Must specify address of connect list entry head\n" );
  583. return( TRUE );
  584. }
  585. if (dwAddress) {
  586. dumplist(
  587. dwAddress,
  588. FIELD_OFFSET(CONNECTLISTENTRY,SiblingNext),
  589. dumpConnectListEntry);
  590. } else {
  591. PRINTF( NO_SYMBOLS_MESSAGE );
  592. }
  593. return(TRUE);
  594. }
  595. /*
  596. * FcbList
  597. *
  598. */
  599. VOID
  600. dumpFcbListEntry(
  601. DWORD dwAddress
  602. )
  603. {
  604. FCB fcb;
  605. if (GetData(dwAddress, &fcb, sizeof(fcb))) {
  606. PRINTF("\n--- FCB @ %08lx\n", dwAddress);
  607. PrintStructFields( dwAddress, &fcb, FcbFields );
  608. } else {
  609. PRINTF("\n*** Unable to read Fcb @ %08lx\n", dwAddress );
  610. }
  611. }
  612. BOOL
  613. connectfcbs(
  614. DWORD dwCurrentPC,
  615. PNTKD_EXTENSION_APIS lpExtensionApis,
  616. LPSTR lpArgumentString
  617. )
  618. {
  619. DWORD dwAddress;
  620. SETCALLBACKS();
  621. if (lpArgumentString && *lpArgumentString) {
  622. dwAddress = (lpGetExpressionRoutine)(lpArgumentString);
  623. } else {
  624. PRINTF( "Must specify address of fcb list entry head\n" );
  625. return( TRUE );
  626. }
  627. if (dwAddress) {
  628. dumplist(
  629. dwAddress,
  630. FIELD_OFFSET(FCB,ConnectNext),
  631. dumpFcbListEntry);
  632. } else {
  633. PRINTF( NO_SYMBOLS_MESSAGE );
  634. }
  635. return(TRUE);
  636. }
  637. /*
  638. * dumplist : A general-purpose routine to dump a list of structures
  639. *
  640. */
  641. VOID
  642. dumplist(
  643. DWORD dwListEntryAddress,
  644. DWORD linkOffset,
  645. VOID (*dumpRoutine)(DWORD dwStructAddress)
  646. )
  647. {
  648. LIST_ENTRY listHead, listNext;
  649. //
  650. // Get the value in the LIST_ENTRY at dwAddress
  651. //
  652. PRINTF( "Dumping list @ %08lx\n", dwListEntryAddress );
  653. if (GetData(dwListEntryAddress, &listHead, sizeof(LIST_ENTRY))) {
  654. DWORD dwNextLink = (DWORD) listHead.Flink;
  655. if (dwNextLink == 0) {
  656. PRINTF( "Uninitialized list!\n" );
  657. } else if (dwNextLink == dwListEntryAddress) {
  658. PRINTF( "Empty list!\n" );
  659. } else {
  660. while( dwNextLink != dwListEntryAddress) {
  661. DWORD dwStructAddress;
  662. dwStructAddress = dwNextLink - linkOffset;
  663. dumpRoutine(dwStructAddress);
  664. if (GetData( dwNextLink, &listNext, sizeof(LIST_ENTRY))) {
  665. dwNextLink = (DWORD) listNext.Flink;
  666. } else {
  667. PRINTF( "Unable to get next item @%08lx\n", dwNextLink );
  668. break;
  669. }
  670. }
  671. }
  672. } else {
  673. PRINTF("Unable to read list head @ %08lx\n", dwListEntryAddress);
  674. }
  675. }