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.

436 lines
8.2 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. resenum.c
  5. Abstract:
  6. Win95 hardware resource enumeration routines.
  7. Author:
  8. Jim Schmidt (jimschm) 28-Jul-1998
  9. Revision History:
  10. jimschm 28-Sep-1998 Auto DMA added to resource enum
  11. --*/
  12. #include "pch.h"
  13. #include "hwcompp.h"
  14. #include <cfgmgr32.h>
  15. BOOL
  16. pFindDynamicValue (
  17. IN PCTSTR DevNode,
  18. OUT PTSTR DynamicKey
  19. );
  20. PBYTE
  21. GetDevNodeResources (
  22. IN PCTSTR DevNodeKey
  23. )
  24. {
  25. PBYTE Data = NULL;
  26. TCHAR DynDataKey[MAX_REGISTRY_KEY];
  27. HKEY Key;
  28. //
  29. // Given a dev node, locate the dynamic entry
  30. //
  31. if (!pFindDynamicValue (DevNodeKey, DynDataKey)) {
  32. return NULL;
  33. }
  34. //
  35. // Get resource binary blob from HKEY_DYN_DATA\Config Manager\Enum\*\Allocation.
  36. //
  37. Key = OpenRegKeyStr (DynDataKey);
  38. if (!Key) {
  39. DEBUGMSG ((DBG_WHOOPS, "Can't open key: %s", DynDataKey));
  40. return NULL;
  41. }
  42. Data = GetRegValueBinary (Key, S_ALLOCATION);
  43. CloseRegKey (Key);
  44. return Data;
  45. }
  46. VOID
  47. FreeDevNodeResources (
  48. IN PBYTE ResourceData
  49. )
  50. {
  51. if (ResourceData) {
  52. MemFree (g_hHeap, 0, ResourceData);
  53. }
  54. }
  55. BOOL
  56. pFindDynamicValue (
  57. IN PCTSTR DevNode,
  58. OUT PTSTR DynamicKey
  59. )
  60. {
  61. REGKEY_ENUM e;
  62. PCTSTR HardwareKey;
  63. HKEY SubKey;
  64. BOOL Found = FALSE;
  65. TCHAR BaseCfgMgrKey[MAX_REGISTRY_KEY];
  66. StringCopy (BaseCfgMgrKey, TEXT("HKDD\\"));
  67. StringCat (BaseCfgMgrKey, S_CONFIG_MANAGER);
  68. if (StringIMatchTcharCount (TEXT("HKLM\\Enum\\"), DevNode, 10)) {
  69. DevNode += 10;
  70. } else if (StringIMatchTcharCount (TEXT("HKEY_LOCAL_MACHINE\\Enum\\"), DevNode, 24)) {
  71. DevNode += 24;
  72. }
  73. if (EnumFirstRegKeyStr (&e, BaseCfgMgrKey)) {
  74. do {
  75. SubKey = OpenRegKey (e.KeyHandle, e.SubKeyName);
  76. if (!SubKey) {
  77. DEBUGMSG ((DBG_ERROR, "Can't open subkey %s in HKDD\\Config Manager\\Enum", e.SubKeyName));
  78. continue;
  79. }
  80. HardwareKey = GetRegValueString (SubKey, S_HARDWAREKEY_VALUENAME);
  81. if (HardwareKey) {
  82. if (StringIMatch (DevNode, HardwareKey)) {
  83. Found = TRUE;
  84. AbortRegKeyEnum (&e);
  85. StringCopy (DynamicKey, BaseCfgMgrKey);
  86. StringCopy (AppendWack (DynamicKey), e.SubKeyName);
  87. }
  88. MemFree (g_hHeap, 0, HardwareKey);
  89. }
  90. CloseRegKey (SubKey);
  91. } while (!Found && EnumNextRegKey (&e));
  92. }
  93. return Found;
  94. }
  95. BOOL
  96. EnumFirstDevNodeResourceEx (
  97. OUT PDEVNODERESOURCE_ENUM EnumPtr,
  98. IN PBYTE DevNodeResources
  99. )
  100. {
  101. ZeroMemory (EnumPtr, sizeof (DEVNODERESOURCE_ENUM));
  102. EnumPtr->Resources = DevNodeResources;
  103. if (!DevNodeResources) {
  104. return FALSE;
  105. }
  106. if (*((PDWORD) EnumPtr->Resources) != 0x0400) {
  107. DEBUGMSG ((DBG_ERROR, "Enumeration of dev node resources, cfg mgr != v4"));
  108. return FALSE;
  109. }
  110. EnumPtr->NextResource = DevNodeResources + sizeof (DWORD) * 2;
  111. return EnumNextDevNodeResourceEx (EnumPtr);
  112. }
  113. BOOL
  114. EnumNextDevNodeResourceEx (
  115. IN OUT PDEVNODERESOURCE_ENUM EnumPtr
  116. )
  117. {
  118. DWORD Len;
  119. Len = *((PDWORD) EnumPtr->NextResource);
  120. if (!Len) {
  121. return FALSE;
  122. }
  123. EnumPtr->Resource = EnumPtr->NextResource;
  124. EnumPtr->ResourceData = EnumPtr->Resource + sizeof (DWORD) * 2;
  125. EnumPtr->Type = *((PDWORD) (EnumPtr->Resource + sizeof (DWORD)));
  126. EnumPtr->NextResource += Len;
  127. return TRUE;
  128. }
  129. BOOL
  130. EnumFirstDevNodeResource (
  131. OUT PDEVNODERESOURCE_ENUM EnumPtr,
  132. IN PCTSTR DevNode
  133. )
  134. {
  135. if (!EnumFirstDevNodeResourceEx (
  136. EnumPtr,
  137. GetDevNodeResources (DevNode)
  138. )) {
  139. FreeDevNodeResources (EnumPtr->Resources);
  140. return FALSE;
  141. }
  142. return TRUE;
  143. }
  144. BOOL
  145. EnumNextDevNodeResource (
  146. IN OUT PDEVNODERESOURCE_ENUM EnumPtr
  147. )
  148. {
  149. if (!EnumNextDevNodeResourceEx (EnumPtr)) {
  150. FreeDevNodeResources (EnumPtr->Resources);
  151. return FALSE;
  152. }
  153. return TRUE;
  154. }
  155. BOOL
  156. pIsDisplayableType (
  157. IN PDEVNODESTRING_ENUM EnumPtr
  158. )
  159. {
  160. BOOL b = TRUE;
  161. switch (EnumPtr->Enum.Type) {
  162. case ResType_Mem:
  163. break;
  164. case ResType_IO:
  165. break;
  166. case ResType_DMA:
  167. break;
  168. case ResType_IRQ:
  169. break;
  170. default:
  171. b = FALSE;
  172. break;
  173. }
  174. return b;
  175. }
  176. VOID
  177. pFormatMemoryResource (
  178. IN OUT PDEVNODESTRING_ENUM EnumPtr
  179. )
  180. {
  181. PMEM_RESOURCE_9X MemRes;
  182. MemRes = (PMEM_RESOURCE_9X) EnumPtr->Enum.ResourceData;
  183. wsprintf (
  184. EnumPtr->Value,
  185. TEXT("%08X - %08X"),
  186. MemRes->MEM_Header.MD_Alloc_Base,
  187. MemRes->MEM_Header.MD_Alloc_End
  188. );
  189. }
  190. VOID
  191. pFormatIoResource (
  192. IN OUT PDEVNODESTRING_ENUM EnumPtr
  193. )
  194. {
  195. PIO_RESOURCE_9X IoRes;
  196. IoRes = (PIO_RESOURCE_9X) EnumPtr->Enum.ResourceData;
  197. wsprintf (
  198. EnumPtr->Value,
  199. TEXT("%04X - %04X"),
  200. IoRes->IO_Header.IOD_Alloc_Base,
  201. IoRes->IO_Header.IOD_Alloc_End
  202. );
  203. }
  204. VOID
  205. pAddChannel (
  206. IN OUT PTSTR String,
  207. IN UINT Channel
  208. )
  209. {
  210. if (String[0]) {
  211. StringCat (String, TEXT(" "));
  212. }
  213. wsprintf (
  214. GetEndOfString (String),
  215. TEXT("%02X"),
  216. Channel
  217. );
  218. }
  219. VOID
  220. pFormatDmaResource (
  221. IN OUT PDEVNODESTRING_ENUM EnumPtr
  222. )
  223. {
  224. PDMA_RESOURCE_9X DmaRes;
  225. DWORD Bit, Channel;
  226. PCTSTR ResText;
  227. DmaRes = (PDMA_RESOURCE_9X) EnumPtr->Enum.ResourceData;
  228. EnumPtr->Value[0] = 0;
  229. Channel = 0;
  230. for (Bit = 1 ; Bit ; Bit <<= 1) {
  231. if (DmaRes->DMA_Bits & Bit) {
  232. pAddChannel (EnumPtr->Value, Channel);
  233. }
  234. Channel++;
  235. }
  236. if (EnumPtr->Value[0] == 0) {
  237. ResText = GetStringResource (MSG_AUTO_DMA);
  238. if (ResText) { // otherwise... do nothing, I guess, since this function
  239. // doesn't return a status value right now.
  240. StringCopy (EnumPtr->Value, ResText);
  241. FreeStringResource (ResText);
  242. }
  243. }
  244. }
  245. VOID
  246. pFormatIrqResource (
  247. IN OUT PDEVNODESTRING_ENUM EnumPtr
  248. )
  249. {
  250. PIRQ_RESOURCE_9X IrqRes;
  251. IrqRes = (PIRQ_RESOURCE_9X) EnumPtr->Enum.ResourceData;
  252. wsprintf (
  253. EnumPtr->Value,
  254. TEXT("%02X"),
  255. IrqRes->AllocNum
  256. );
  257. }
  258. BOOL
  259. pEnumDevNodeStringWorker (
  260. IN OUT PDEVNODESTRING_ENUM EnumPtr
  261. )
  262. {
  263. UINT Id = 0;
  264. PCTSTR Name;
  265. //
  266. // Format each type of resource for display
  267. //
  268. switch (EnumPtr->Enum.Type) {
  269. case ResType_Mem:
  270. Id = MSG_RESTYPE_MEMORY;
  271. pFormatMemoryResource (EnumPtr);
  272. break;
  273. case ResType_IO:
  274. Id = MSG_RESTYPE_IO;
  275. pFormatIoResource (EnumPtr);
  276. break;
  277. case ResType_DMA:
  278. Id = MSG_RESTYPE_DMA;
  279. pFormatDmaResource (EnumPtr);
  280. break;
  281. case ResType_IRQ:
  282. Id = MSG_RESTYPE_IRQ;
  283. pFormatIrqResource (EnumPtr);
  284. break;
  285. }
  286. if (Id) {
  287. Name = GetStringResource (Id);
  288. if (Name) {
  289. StringCopy (
  290. EnumPtr->ResourceName,
  291. Name
  292. );
  293. FreeStringResource (Name);
  294. return TRUE;
  295. }
  296. }
  297. return FALSE;
  298. }
  299. BOOL
  300. EnumFirstDevNodeString (
  301. OUT PDEVNODESTRING_ENUM EnumPtr,
  302. IN PCTSTR DevNodeKeyStr
  303. )
  304. {
  305. if (!EnumFirstDevNodeResource (&EnumPtr->Enum, DevNodeKeyStr)) {
  306. return FALSE;
  307. }
  308. if (pIsDisplayableType (EnumPtr)) {
  309. return pEnumDevNodeStringWorker (EnumPtr);
  310. }
  311. return EnumNextDevNodeString (EnumPtr);
  312. }
  313. BOOL
  314. EnumNextDevNodeString (
  315. IN OUT PDEVNODESTRING_ENUM EnumPtr
  316. )
  317. {
  318. do {
  319. if (!EnumNextDevNodeResource (&EnumPtr->Enum)) {
  320. return FALSE;
  321. }
  322. } while (!pIsDisplayableType (EnumPtr));
  323. return pEnumDevNodeStringWorker (EnumPtr);
  324. }