- Create another branch for networking fixes
[reactos.git] / dll / shellext / devcpux / processor.c
1 /*
2 * PROJECT: ReactOS Shell Extensions
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: dll\win32\shellext\devcpux\processor.c
5 * PURPOSE:
6 * COPYRIGHT: Copyright 2007 Christoph von Wittich <Christoph_vW@ReactOS.org>
7 *
8 */
9
10 #include <windows.h>
11 #include <setupapi.h>
12 #include <powrprof.h>
13
14 #include "resource.h"
15
16 HINSTANCE g_hInstance = NULL;
17 INT_PTR CALLBACK ProcessorDlgProc (HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
18
19 BOOL
20 APIENTRY
21 DllMain (HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
22 {
23 switch (dwReason)
24 {
25 case DLL_THREAD_ATTACH:
26 case DLL_THREAD_DETACH:
27 case DLL_PROCESS_ATTACH:
28 case DLL_PROCESS_DETACH:
29 break;
30 }
31
32 g_hInstance = (HINSTANCE) hInstance;
33 return TRUE;
34 }
35
36
37 BOOL
38 APIENTRY
39 PropSheetExtProc(PSP_PROPSHEETPAGE_REQUEST PropPageRequest, LPFNADDPROPSHEETPAGE fAddFunc, LPARAM lParam)
40 {
41 PROPSHEETPAGE PropSheetPage;
42 HPROPSHEETPAGE hPropSheetPage;
43
44 if(PropPageRequest->PageRequested != SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
45 return FALSE;
46
47 if ((!PropPageRequest->DeviceInfoSet) || (!PropPageRequest->DeviceInfoData))
48 return FALSE;
49
50 ZeroMemory(&PropSheetPage, sizeof(PROPSHEETPAGE));
51 PropSheetPage.dwSize = sizeof(PROPSHEETPAGE);
52 PropSheetPage.hInstance = g_hInstance;
53 PropSheetPage.pszTemplate = MAKEINTRESOURCE(DLG_PROCESSORINFO);
54 PropSheetPage.pfnDlgProc = ProcessorDlgProc;
55
56 hPropSheetPage = CreatePropertySheetPage(&PropSheetPage);
57 if(!hPropSheetPage)
58 return FALSE;
59
60 if(!(fAddFunc)(hPropSheetPage, lParam)) {
61 DestroyPropertySheetPage (hPropSheetPage);
62 return FALSE;
63 }
64
65 return TRUE;
66 }
67
68 void
69 AddFeature(WCHAR* szFeatures, WCHAR* Feature, BOOL* bFirst)
70 {
71 if (!*bFirst)
72 wcscat(szFeatures, L", ");
73 *bFirst = FALSE;
74 wcscat(szFeatures, Feature);
75 }
76
77 INT_PTR
78 CALLBACK
79 ProcessorDlgProc (HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
80 {
81 switch (uMessage) {
82 case WM_INITDIALOG:
83 {
84 WCHAR szFeatures[MAX_PATH] = L"";
85 WCHAR szModel[3];
86 WCHAR szStepping[3];
87 WCHAR szCurrentMhz[10];
88 BOOL bFirst = TRUE;
89 SYSTEM_INFO SystemInfo;
90 PROCESSOR_POWER_INFORMATION PowerInfo;
91
92 if (IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE))
93 AddFeature(szFeatures, L"MMX", &bFirst);
94 if (IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE))
95 AddFeature(szFeatures, L"SSE", &bFirst);
96 if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
97 AddFeature(szFeatures, L"SSE2", &bFirst);
98 /*if (IsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE))
99 AddFeature(szFeatures, L"SSE3", &bFirst); */
100 if (IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE))
101 AddFeature(szFeatures, L"3DNOW", &bFirst);
102
103 SetDlgItemTextW(hDlg, IDC_FEATURES, szFeatures);
104
105 GetSystemInfo(&SystemInfo);
106
107 wsprintf(szModel, L"%x", HIBYTE(SystemInfo.wProcessorRevision));
108 wsprintf(szStepping, L"%d", LOBYTE(SystemInfo.wProcessorRevision));
109
110 SetDlgItemTextW(hDlg, IDC_MODEL, szModel);
111 SetDlgItemTextW(hDlg, IDC_STEPPING, szStepping);
112
113 CallNtPowerInformation(11, NULL, 0, &PowerInfo, sizeof(PowerInfo));
114 wsprintf(szCurrentMhz, L"%ld %s", PowerInfo.CurrentMhz, L"MHz");
115 SetDlgItemTextW(hDlg, IDC_CORESPEED, szCurrentMhz);
116
117 return TRUE;
118 }
119 }
120 return FALSE;
121 }