[BRANCHES]
[reactos.git] / reactos / dll / win32 / devmgr / hwresource.c
1 /*
2 * PROJECT: ReactOS devmgr.dll
3 * FILE: dll/win32/devmgr/hwresource.c
4 * PURPOSE: ReactOS Device Manager
5 * PROGRAMMER: Johannes Anderwald <johannes.anderwald@reactos.org>
6 * UPDATE HISTORY:
7 * 2005/11/24 Created
8 */
9
10 #include "precomp.h"
11
12 #define NDEBUG
13 #include <debug.h>
14
15 typedef struct
16 {
17 HWND hWnd;
18 HWND hWndDevList;
19
20
21 }HARDWARE_RESOURCE_DATA, *PHARDWARE_RESOURCE_DATA;
22
23 /* Physical Addresses are always treated as 64-bit wide */
24 typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
25
26 #include <pshpack4.h>
27 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
28 UCHAR Type;
29 UCHAR ShareDisposition;
30 USHORT Flags;
31 union {
32 struct {
33 PHYSICAL_ADDRESS Start;
34 ULONG Length;
35 } Generic;
36 struct {
37 PHYSICAL_ADDRESS Start;
38 ULONG Length;
39 } Port;
40 struct {
41 #if defined(NT_PROCESSOR_GROUPS)
42 USHORT Level;
43 USHORT Group;
44 #else
45 ULONG Level;
46 #endif
47 ULONG Vector;
48 KAFFINITY Affinity;
49 } Interrupt;
50 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
51 struct {
52 _ANONYMOUS_UNION union {
53 struct {
54 #if defined(NT_PROCESSOR_GROUPS)
55 USHORT Group;
56 #else
57 USHORT Reserved;
58 #endif
59 USHORT MessageCount;
60 ULONG Vector;
61 KAFFINITY Affinity;
62 } Raw;
63 struct {
64 #if defined(NT_PROCESSOR_GROUPS)
65 USHORT Level;
66 USHORT Group;
67 #else
68 ULONG Level;
69 #endif
70 ULONG Vector;
71 KAFFINITY Affinity;
72 } Translated;
73 } DUMMYUNIONNAME;
74 } MessageInterrupt;
75 #endif
76 struct {
77 PHYSICAL_ADDRESS Start;
78 ULONG Length;
79 } Memory;
80 struct {
81 ULONG Channel;
82 ULONG Port;
83 ULONG Reserved1;
84 } Dma;
85 struct {
86 ULONG Data[3];
87 } DevicePrivate;
88 struct {
89 ULONG Start;
90 ULONG Length;
91 ULONG Reserved;
92 } BusNumber;
93 struct {
94 ULONG DataSize;
95 ULONG Reserved1;
96 ULONG Reserved2;
97 } DeviceSpecificData;
98 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
99 struct {
100 PHYSICAL_ADDRESS Start;
101 ULONG Length40;
102 } Memory40;
103 struct {
104 PHYSICAL_ADDRESS Start;
105 ULONG Length48;
106 } Memory48;
107 struct {
108 PHYSICAL_ADDRESS Start;
109 ULONG Length64;
110 } Memory64;
111 #endif
112 } u;
113 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
114 #include <poppack.h>
115 typedef struct _CM_PARTIAL_RESOURCE_LIST {
116 USHORT Version;
117 USHORT Revision;
118 ULONG Count;
119 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
120 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
121
122 #define CmResourceTypeNull 0
123 #define CmResourceTypePort 1
124 #define CmResourceTypeInterrupt 2
125 #define CmResourceTypeMemory 3
126 #define CmResourceTypeDma 4
127 #define CmResourceTypeDeviceSpecific 5
128 #define CmResourceTypeBusNumber 6
129 #define CmResourceTypeNonArbitrated 128
130 #define CmResourceTypeConfigData 128
131 #define CmResourceTypeDevicePrivate 129
132 #define CmResourceTypePcCardConfig 130
133 #define CmResourceTypeMfCardConfig 131
134
135 typedef enum _INTERFACE_TYPE {
136 InterfaceTypeUndefined = -1,
137 Internal,
138 Isa,
139 Eisa,
140 MicroChannel,
141 TurboChannel,
142 PCIBus,
143 VMEBus,
144 NuBus,
145 PCMCIABus,
146 CBus,
147 MPIBus,
148 MPSABus,
149 ProcessorInternal,
150 InternalPowerBus,
151 PNPISABus,
152 PNPBus,
153 Vmcs,
154 MaximumInterfaceType
155 } INTERFACE_TYPE, *PINTERFACE_TYPE;
156
157 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
158 INTERFACE_TYPE InterfaceType;
159 ULONG BusNumber;
160 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
161 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
162
163 typedef struct _CM_RESOURCE_LIST {
164 ULONG Count;
165 CM_FULL_RESOURCE_DESCRIPTOR List[1];
166 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
167
168
169 #define CX_TYPECOLUMN_WIDTH 120
170
171 static VOID
172 InitializeDevicesList(
173 IN HWND hWndDevList)
174 {
175 LVCOLUMN lvc;
176 RECT rcClient;
177 WCHAR szColName[255];
178 int iCol = 0;
179
180 /* set the list view style */
181 (void)ListView_SetExtendedListViewStyle(hWndDevList,
182 LVS_EX_FULLROWSELECT);
183
184 GetClientRect(hWndDevList,
185 &rcClient);
186
187 /* add the list view columns */
188 lvc.mask = LVCF_TEXT | LVCF_WIDTH;
189 lvc.fmt = LVCFMT_LEFT;
190 lvc.pszText = szColName;
191
192 if (LoadString(hDllInstance,
193 IDS_RESOURCE_COLUMN,
194 szColName,
195 sizeof(szColName) / sizeof(szColName[0])))
196 {
197 lvc.cx = CX_TYPECOLUMN_WIDTH;
198 (void)ListView_InsertColumn(hWndDevList,
199 iCol++,
200 &lvc);
201 }
202 if (LoadString(hDllInstance,
203 IDS_SETTING_COLUMN,
204 szColName,
205 sizeof(szColName) / sizeof(szColName[0])))
206 {
207 lvc.cx = rcClient.right - CX_TYPECOLUMN_WIDTH -
208 GetSystemMetrics(SM_CXVSCROLL);
209
210 (void)ListView_InsertColumn(hWndDevList,
211 iCol++,
212 &lvc);
213 }
214 }
215
216 VOID
217 InsertListItem(
218 IN HWND hWndDevList,
219 IN INT ItemCount,
220 IN LPWSTR ResourceType,
221 IN LPWSTR ResourceDescription)
222 {
223 INT iItem;
224 LVITEM li = {0};
225
226 li.mask = LVIF_STATE | LVIF_TEXT;
227 li.iItem = ItemCount;
228 li.pszText = ResourceType;
229 //li.iImage = ClassDevInfo->ImageIndex;
230 iItem = ListView_InsertItem(hWndDevList, &li);
231
232 if (iItem != -1)
233 {
234 li.mask = LVIF_TEXT;
235 li.iItem = iItem;
236 li.iSubItem = 1;
237 li.pszText = ResourceDescription;
238 (void)ListView_SetItem(hWndDevList, &li);
239 }
240 }
241
242 VOID
243 AddResourceItems(
244 IN PDEVADVPROP_INFO dap,
245 IN HWND hWndDevList)
246 {
247 HKEY hKey;
248 WCHAR szBuffer[100];
249 WCHAR szDetail[100];
250 BYTE szData[512];
251 DWORD dwSize;
252 PCM_RESOURCE_LIST ResourceList;
253 LONG Result;
254 ULONG ItemCount = 0, Index;
255
256 wsprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Enum\\%s\\LogConf", dap->szDeviceID);
257 Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey);
258 if (Result != ERROR_SUCCESS)
259 {
260 /* failed to open device instance log conf dir */
261 return;
262 }
263
264 dwSize = sizeof(szData);
265 Result = RegQueryValueExW(hKey, L"BootConfig", NULL, NULL, szData, &dwSize);
266
267 RegCloseKey(hKey);
268 if (Result != ERROR_SUCCESS)
269 {
270 /* failed to query resources */
271 return;
272 }
273
274 ResourceList = (PCM_RESOURCE_LIST)szData;
275
276 for (Index = 0; Index < ResourceList->List[0].PartialResourceList.Count; Index++)
277 {
278 PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[Index];
279 if (Descriptor->Type == CmResourceTypeInterrupt)
280 {
281 if (LoadString(hDllInstance, IDS_RESOURCE_INTERRUPT, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])))
282 {
283 wsprintf(szDetail, L"0x%08x(%d)", Descriptor->u.Interrupt.Level, Descriptor->u.Interrupt.Vector);
284 InsertListItem(hWndDevList, ItemCount, szBuffer, szDetail);
285 ItemCount++;
286 }
287 }
288 else if (Descriptor->Type == CmResourceTypePort)
289 {
290 if (LoadString(hDllInstance, IDS_RESOURCE_PORT, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])))
291 {
292 wsprintf(szDetail, L"%08lx - %08lx", Descriptor->u.Port.Start.LowPart, Descriptor->u.Port.Start.LowPart + Descriptor->u.Port.Length - 1);
293 InsertListItem(hWndDevList, ItemCount, szBuffer, szDetail);
294 ItemCount++;
295 }
296 }
297 else if (Descriptor->Type == CmResourceTypeMemory)
298 {
299 if (LoadString(hDllInstance, IDS_RESOURCE_MEMORY_RANGE, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])))
300 {
301 wsprintf(szDetail, L"%08I64x - %08I64x", Descriptor->u.Memory.Start.QuadPart, Descriptor->u.Memory.Start.QuadPart + Descriptor->u.Memory.Length - 1);
302 InsertListItem(hWndDevList, ItemCount, szBuffer, szDetail);
303 ItemCount++;
304 }
305 }
306 else if (Descriptor->Type == CmResourceTypeDma)
307 {
308 if (LoadString(hDllInstance, IDS_RESOURCE_DMA, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])))
309 {
310 wsprintf(szDetail, L"%08ld", Descriptor->u.Dma.Channel);
311 InsertListItem(hWndDevList, ItemCount, szBuffer, szDetail);
312 ItemCount++;
313 }
314 }
315 }
316 }
317
318
319 static VOID
320 UpdateDriverResourceDlg(IN HWND hwndDlg,
321 IN PDEVADVPROP_INFO dap)
322 {
323 /* set the device image */
324 SendDlgItemMessage(hwndDlg,
325 IDC_DEVICON,
326 STM_SETICON,
327 (WPARAM)dap->hDevIcon,
328 0);
329
330 /* set the device name edit control text */
331 SetDlgItemText(hwndDlg,
332 IDC_DEVNAME,
333 dap->szDevName);
334 }
335
336 INT_PTR
337 CALLBACK
338 ResourcesProcDriverDlgProc(IN HWND hwndDlg,
339 IN UINT uMsg,
340 IN WPARAM wParam,
341 IN LPARAM lParam)
342 {
343 PDEVADVPROP_INFO hpd;
344 HWND hWndDevList;
345 INT_PTR Ret = FALSE;
346
347 hpd = (PDEVADVPROP_INFO)GetWindowLongPtr(hwndDlg,
348 DWL_USER);
349
350 if (hpd != NULL || uMsg == WM_INITDIALOG)
351 {
352 switch (uMsg)
353 {
354 case WM_INITDIALOG:
355 {
356 /* init list */
357 hWndDevList = GetDlgItem(hwndDlg, IDC_DRIVERRESOURCES);
358 InitializeDevicesList(hWndDevList);
359
360 hpd = (PDEVADVPROP_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
361 if (hpd != NULL)
362 {
363 SetWindowLongPtr(hwndDlg,
364 DWL_USER,
365 (DWORD_PTR)hpd);
366
367 SetWindowLongPtr(hwndDlg,
368 DWL_USER,
369 (DWORD_PTR)hpd);
370
371 UpdateDriverResourceDlg(hwndDlg, hpd);
372 AddResourceItems(hpd, hWndDevList);
373 }
374
375 Ret = TRUE;
376 break;
377 }
378 }
379 }
380
381 return Ret;
382 }
383