📄 setup.c
字号:
//
// (w)ritten by Chuan-Liang Teng 2006, mailto:clteng@ms6.hinet.net
//
#include "setup.h"
#include "resource.h"
//
SP_CLASSIMAGELIST_DATA _spImageData = {0};
//
extern HINSTANCE _hInst;
extern HWND _hDlg;
//
DEVICE_LIST *_pHead = 0L;
DEVICE_ORDER *_pOrderHead = 0L;
//
char InitialDeviceOrder()
{
_pOrderHead = AllocNewDeviceOrderNode();
return (_pOrderHead) ? 1 : 0;
};
//
DEVICE_ORDER* AllocNewDeviceOrderNode()
{
DEVICE_ORDER* pNew = (DEVICE_ORDER*)LocalAlloc(LPTR, sizeof(DEVICE_ORDER));
//
if (!pNew)
{
ShowErrorMsg(_hDlg, GetLastError(), "LocalAlloc");
return 0;
};
RtlZeroMemory(pNew->szDevName, sizeof(char)*LINE_LEN);
pNew->pNext = 0L;
return pNew;
};
//
char AddNewDeviceOrderNode(const char* szDevName)
{
DEVICE_ORDER* pAdd = AllocNewDeviceOrderNode();
//
if (!pAdd)
return 0;
memcpy(pAdd->szDevName, szDevName, strlen(szDevName));
pAdd->pNext = _pOrderHead->pNext;
_pOrderHead->pNext = pAdd;
return 1;
};
//
short FindDeviceOrder(const char* szName)
{
DEVICE_ORDER *pList = _pOrderHead->pNext;
short wOrder = 0;
//
while (pList)
{
if (!strcmp(pList->szDevName, szName))
wOrder++;
pList = pList->pNext;
};
return wOrder;
};
//
void FreeAllDeviceOrderNode()
{
DEVICE_ORDER *pDel = _pOrderHead->pNext;
DEVICE_ORDER *pTmp = 0L;
//
while (pDel->pNext)
{
pTmp = pDel;
pDel = pDel->pNext;
LocalFree(pTmp);
};
LocalFree(_pOrderHead);
_pOrderHead = 0L;
};
//
char InitialDeviceList()
{
_pHead = AllocNewDeviceNode();
return (_pHead) ? 1 : 0;
};
//
DEVICE_LIST* AllocNewDeviceNode()
{
DEVICE_LIST* pNew = (DEVICE_LIST*)LocalAlloc(LPTR, sizeof(DEVICE_LIST));
//
if (!pNew)
{
ShowErrorMsg(_hDlg, GetLastError(), "LocalAlloc");
return 0;
};
RtlZeroMemory(&pNew->guid, sizeof(GUID));
RtlZeroMemory(pNew->szInstallID, sizeof(char)*LINE_LEN);
RtlZeroMemory(pNew->szName, sizeof(char)*MAX_PATH);
RtlZeroMemory(pNew->szPath, sizeof(char)*MAX_PATH);
pNew->wOrder = -1;
pNew->wIndex = -1;
pNew->pNext = 0L;
return pNew;
};
//
char AddNewDeviceNode(const GUID guid,
const char* szName,
const char* szInstallID,
const char* szPath,
const int wIndex,
const short wOrder)
{
DEVICE_LIST* pAdd = AllocNewDeviceNode();
//
if (!pAdd)
return 0;
memcpy(&pAdd->guid, &guid, sizeof(GUID));
memcpy(pAdd->szInstallID, szInstallID, strlen(szInstallID));
memcpy(pAdd->szName, szName, strlen(szName));
memcpy(pAdd->szPath, szPath, strlen(szPath));
pAdd->wIndex = wIndex;
pAdd->wOrder = wOrder;
pAdd->pNext = _pHead->pNext;
_pHead->pNext = pAdd;
return 1;
};
//
char FindDeviceName(const char* szName, const UINT nIDList1,
const UINT nIDList2)
{
DEVICE_LIST *pList = _pHead->pNext;
//
while (pList)
{
if (!strcmp(pList->szName, szName))
{
GetOtherInfo(pList->guid, pList->wOrder, nIDList1, nIDList2);
GetDeviceDetailInfo(pList);
return 1;
};
pList = pList->pNext;
};
return 0;
};
//
void FreeAllocDeviceNode()
{
DEVICE_LIST *pDel = _pHead->pNext;
DEVICE_LIST *pTmp = 0L;
//
while (pDel->pNext)
{
pTmp = pDel;
pDel = pDel->pNext;
LocalFree(pTmp);
};
LocalFree(_pHead);
_pHead = 0L;
};
//
void GetDeviceDetailInfo(DEVICE_LIST* pList)
{
char szBuf[MAX_PATH] = {0};
HWND hList = GetDlgItem(_hDlg, IDC_LIST1);
//
ConvertGUIDToString(pList->guid, szBuf);
ListViewInsertItemText(hList, 0, 1, szBuf);
ListViewInsertItemText(hList, 2, 1, pList->szInstallID);
sprintf(szBuf, "%d", pList->wIndex);
ListViewInsertItemText(hList, 10, 1, szBuf);
ListViewInsertItemText(hList, 11, 1, pList->szPath);
};
//
void InitialImageData()
{
HIMAGELIST hImageListView = 0L;
//
SetupDiDestroyClassImageList(&_spImageData);
RtlZeroMemory(&_spImageData, sizeof(SP_CLASSIMAGELIST_DATA));
_spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
SetupDiGetClassImageList(&_spImageData);
};
//
void DisplayDriverDetailInfo(HTREEITEM hTreeChild, const UINT nID,
const char *szBuf, const int iImageIdx, const int iSelectImage)
{
TVINSERTSTRUCT tvStruct = {0};
HWND hTree = GetDlgItem(_hDlg, nID);
//
tvStruct.hParent = hTreeChild;
tvStruct.hInsertAfter = TVI_LAST;
tvStruct.item.mask = TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_HANDLE;
tvStruct.item.mask |= TVIF_PARAM;
tvStruct.item.lParam = 1;
tvStruct.item.pszText = (char*)szBuf;
tvStruct.item.iImage = iImageIdx;
tvStruct.item.iSelectedImage = iImageIdx;
SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvStruct);
};
//
void GetDeviceInstanceID(HDEVINFO hDevInfo,
SP_DEVINFO_DATA* pspDevInfoData,
char *szInstanceID)
{
if (!SetupDiGetDeviceInstanceId(hDevInfo,
pspDevInfoData,
szInstanceID,
LINE_LEN,
0))
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiBuildDriverInfoList");
};
//
char EnumWDMDriver(const UINT nIdTree, const UINT nIdBmp)
{
HDEVINFO hDevInfo = 0L;
SP_DEVINFO_DATA spDevInfoData = {0};
short wIndex = 0;
HTREEITEM hTreeChild = 0L;
//
hTreeChild = MakeDeviceRootTree(_spImageData, nIdTree, nIdBmp);
if (!hTreeChild)
return 0;
//
hDevInfo = SetupDiGetClassDevs(0L, 0L, _hDlg, DIGCF_PRESENT |
DIGCF_ALLCLASSES | DIGCF_PROFILE);
if (hDevInfo == (void*)-1)
{
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiGetClassDevs");
return 0;
};
//
wIndex = 0;
spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SendMessage(GetDlgItem(_hDlg, nIdTree), TVM_SETIMAGELIST,
TVSIL_NORMAL, (LPARAM)_spImageData.ImageList);
//
while (1)
{
if (SetupDiEnumDeviceInfo(hDevInfo,
wIndex,
&spDevInfoData))
{
char szBuf[MAX_PATH] = {0};
short wImageIdx = 0;
short wItem = 0;
//
if (!SetupDiGetDeviceRegistryProperty(hDevInfo,
&spDevInfoData,
SPDRP_CLASS, //SPDRP_DEVICEDESC,
0L,
(PBYTE)szBuf,
2048,
0))
{
wIndex++;
continue;
};
//
if (SetupDiGetClassImageIndex(&_spImageData,
&spDevInfoData.ClassGuid,
(int*)&wImageIdx))
{
TVINSERTSTRUCT tvStruct = {0};
HWND hTree = GetDlgItem(_hDlg, nIdTree);
char szName[64] = {0};
char szID[LINE_LEN] = {0};
char szPath[MAX_PATH] = {0};
HTREEITEM hItem;
DWORD dwRequireSize;
short wOrder;
//
if (!SetupDiGetClassDescription(&spDevInfoData.ClassGuid,
szBuf,
MAX_PATH,
&dwRequireSize))
{
wIndex++;
continue;
};
wOrder = FindDeviceOrder(szBuf);
if (!AddNewDeviceOrderNode(szBuf))
{
wIndex++;
continue;
};
hItem = TreeViewFindChild(hTree, hTreeChild, szBuf);
if (!hItem)
{
tvStruct.hParent = hTreeChild;
tvStruct.hInsertAfter = TVI_LAST;
tvStruct.item.mask = TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE;
tvStruct.item.mask |= TVIF_PARAM;
tvStruct.item.lParam = 1;
tvStruct.item.pszText = szBuf;
tvStruct.item.iImage = wImageIdx;
tvStruct.item.iSelectedImage = wImageIdx;
hItem = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvStruct);
wOrder = 0;
};
GetDeviceInstanceID(hDevInfo, &spDevInfoData, szID);
GetDeviceInterfaceInfo(hDevInfo, spDevInfoData, szPath);
//
if (SetupDiGetDeviceRegistryProperty(hDevInfo,
&spDevInfoData,
SPDRP_FRIENDLYNAME,
0L,
(PBYTE)szName,
63,
0))
{
DisplayDriverDetailInfo(hItem, nIdTree, szName, wImageIdx, wImageIdx);
AddNewDeviceNode(spDevInfoData.ClassGuid, szName, szID, szPath, wIndex, wOrder);
}
else if (SetupDiGetDeviceRegistryProperty(hDevInfo,
&spDevInfoData,
SPDRP_DEVICEDESC,
0L,
(PBYTE)szName,
63,
0))
{
DisplayDriverDetailInfo(hItem, nIdTree, szName, wImageIdx, wImageIdx);
AddNewDeviceNode(spDevInfoData.ClassGuid, szName, szID, szPath, wIndex, wOrder);
// if (!GetFirmwareEnvironmentVariable(szName, (LPCSTR)&spDevInfoData.ClassGuid, szBuf, 127))
// ShowErrorMsg(_hDlg, GetLastError(), "GetFirmwareEnvironmentVariable");
};
};
// SetupDiDestroyDriverInfoList(hDevInfo, &spDevInfoData, SPDIT_COMPATDRIVER);
}
else
break;
wIndex++;
};
SendMessage(GetDlgItem(_hDlg, nIdTree), TVM_EXPAND,
TVE_EXPAND, (LPARAM)hTreeChild);
SendMessage(GetDlgItem(_hDlg, nIdTree), TVM_SORTCHILDREN,
0, (LPARAM)hTreeChild);
TreeView_SetItemState(GetDlgItem(_hDlg, nIdTree), hTreeChild, TVIS_SELECTED, TVIS_SELECTED);
// SendMessage(GetDlgItem(_hDlg, nIdTree), TVM_SELECTITEM,
// TVGN_FIRSTVISIBLE, (LPARAM)hTreeChild);
SetupDiDestroyDeviceInfoList(hDevInfo);
return 1;
};
//
void GetMemoryResource(MEM_DES* pMemDes, const ULONG ulSize, const UINT nID)
{
char szBuf[128] = {0};
HWND hListView = GetDlgItem(_hDlg, nID);
short wLoop = 0;
short wCnt = ListViewGetItemCount(hListView);
//
sprintf(szBuf, "%08X - ", pMemDes->MD_Alloc_Base);
sprintf(szBuf+strlen(szBuf), "%08X", pMemDes->MD_Alloc_End);
if (GetACP() == 950)
ListViewInsertItemText(hListView, wCnt, 0, "癘拘砰絛瞅");
else
ListViewInsertItemText(hListView, wCnt, 0, "Memory Range");
ListViewInsertItemText(hListView, wCnt, 1, szBuf);
//
if (pMemDes->MD_Count)
{
for (wLoop = 0; wLoop < (short)(ulSize -
(LONG)(sizeof(MEM_DES) / pMemDes->MD_Type)); wLoop++)
{
MEM_RANGE *pMemRange = (MEM_RANGE*)(pMemDes + 1);// + pMemDes->MD_Type);
if (pMemRange->MR_Min != 0 && pMemRange->MR_Max != 0 &&
(pMemRange->MR_Min < pMemRange->MR_Max))
{
sprintf(szBuf, "%08X - ", pMemRange->MR_Min);
sprintf(szBuf+strlen(szBuf), "%08X", pMemRange->MR_Max);
if (GetACP() == 950)
ListViewInsertItemText(hListView, wCnt+wLoop+1, 0, "癘拘砰絛瞅");
else
ListViewInsertItemText(hListView, wCnt+wLoop+1, 0, "Memory Range");
ListViewInsertItemText(hListView, wCnt+wLoop+1, 1, szBuf);
};
};
};
};
//
void GetIOResource(IO_DES *pIODes, const ULONG ulSize, const UINT nID)
{
char szBuf[128] = {0};
HWND hListView = GetDlgItem(_hDlg, nID);
short wLoop = 0;
short wCnt = ListViewGetItemCount(hListView);
//
sprintf(szBuf, "%04X - ", pIODes->IOD_Alloc_Base);
sprintf(szBuf+strlen(szBuf), "%04X", pIODes->IOD_Alloc_End);
//
if (GetACP() == 950)
ListViewInsertItemText(hListView, wCnt, 0, "块
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -