|
|
/**------------------------------------------------------------------
devinst.c ------------------------------------------------------------------**/
//
// Includes
//
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <wtypes.h>
#include <cfgmgr32.h>
#include <malloc.h>
#include "cmtest.h"
//
// Private Prototypes
//
FillRelationsListBox( HWND hDlg, ULONG RelationType );
BOOL FillEnumeratorListBox( HWND hDlg );
BOOL FillDeviceListBox( HWND hDlg ); BOOL FillInstanceListBox( HWND hDlg );
BOOL FillDeviceInstanceListBox( HWND hDlg );
BOOL GetSelectedEnumerator( HWND hDlg, LPTSTR szDevice );
BOOL GetSelectedDevice( HWND hDlg, LPTSTR szDevice );
BOOL GetSelectedDevNode( HWND hDlg, PDEVNODE pdnDevNode );
VOID CallPnPIsaDetect( HWND hDlg, LPTSTR pszDevice );
//
// Globals
//
extern HINSTANCE hInst; extern TCHAR szDebug[MAX_PATH]; extern TCHAR szAppName[MAX_PATH]; extern HMACHINE hMachine;
/**----------------------------------------------------------------------**/ LRESULT CALLBACK DeviceListDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDevice[MAX_DEVICE_ID_LEN+1]; DEVNODE dnDevNode; ULONG ulStatus, ulProblem;
switch (message) { case WM_SHOWWINDOW: FillEnumeratorListBox(hDlg); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_LB_ENUMERATORS: if (HIWORD(wParam) == LBN_SELCHANGE) { FillDeviceListBox(hDlg); } break;
case ID_LB_DEVICES: if (HIWORD(wParam) == LBN_SELCHANGE) { FillInstanceListBox(hDlg); } break;
} break; } return (FALSE);
} // DeviceListDlgProc
/**----------------------------------------------------------------------**/ LRESULT CALLBACK ServiceListDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szService[MAX_PATH]; LPTSTR pBuffer, p; ULONG ulSize;
switch (message) {
case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_BT_SERVICE: GetDlgItemText(hDlg, ID_ED_SERVICE, szService, MAX_PATH);
//
// get device list size for this service
//
Status = CM_Get_Device_ID_List_Size_Ex(&ulSize, szService, CM_GETIDLIST_FILTER_SERVICE, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List_Size failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
pBuffer = (PTSTR)LocalAlloc(LPTR, ulSize * sizeof(TCHAR)); if (pBuffer == NULL) { MessageBeep(0); return FALSE; }
//
// to verify the null terminators are correct, fill with 1's
//
memset(pBuffer, 1, ulSize * sizeof(TCHAR));
//
// get device list for this service
//
Status = CM_Get_Device_ID_List_Ex(szService, pBuffer, ulSize, CM_GETIDLIST_FILTER_SERVICE, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_SERVICE, LB_RESETCONTENT, 0, 0);
p = (LPTSTR)pBuffer; while (*p != '\0') {
SendDlgItemMessage( hDlg, ID_LB_SERVICE, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p);
while (*p != '\0') { p++; // skip to next substring
} p++; // skip over null terminator
}
SendDlgItemMessage(hDlg, ID_LB_SERVICE, LB_SETSEL, TRUE, 0); LocalFree(pBuffer); break; }
break; } return (FALSE);
} // ServiceListDlgProc
/**----------------------------------------------------------------------**/ LRESULT CALLBACK RelationsListDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDevice[MAX_DEVICE_ID_LEN]; LPTSTR pBuffer, p; ULONG Size; LONG Index;
switch (message) {
case WM_INITDIALOG: //
// Fill list box with all known device instances so user can just
// point at the device instance they want to query relations for.
//
SendDlgItemMessage(hDlg, ID_LB_TARGETS, LB_RESETCONTENT, 0, 0);
Status = CM_Get_Device_ID_List_Size_Ex(&Size, NULL, CM_GETIDLIST_FILTER_NONE, hMachine); if (Status != CR_SUCCESS) { return FALSE; } pBuffer = (PTSTR)malloc(Size * sizeof(TCHAR)); if (pBuffer == NULL) { return FALSE; } Status = CM_Get_Device_ID_List_Ex(NULL, pBuffer, Size, CM_GETIDLIST_FILTER_NONE, hMachine); if (Status != CR_SUCCESS) { return FALSE; } for (p = pBuffer; *p; p += lstrlen(p) + 1) { SendDlgItemMessage(hDlg, ID_LB_TARGETS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p); } SendDlgItemMessage(hDlg, ID_LB_TARGETS, LB_SETSEL, TRUE, 0); free(pBuffer); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) {
case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_BT_BUS: FillRelationsListBox(hDlg, CM_GETIDLIST_FILTER_BUSRELATIONS); break;
case ID_BT_POWER: FillRelationsListBox(hDlg, CM_GETIDLIST_FILTER_POWERRELATIONS); break;
case ID_BT_REMOVAL: FillRelationsListBox(hDlg, CM_GETIDLIST_FILTER_REMOVALRELATIONS); break;
case ID_BT_EJECTION: FillRelationsListBox(hDlg, CM_GETIDLIST_FILTER_EJECTRELATIONS); break; } break; } return (FALSE);
} // RelationsListDlgProc
FillRelationsListBox( HWND hDlg, ULONG RelationType ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDevice[MAX_DEVICE_ID_LEN]; LPTSTR pBuffer, p; ULONG Size; LONG Index; SendDlgItemMessage(hDlg, ID_LB_RELATIONS, LB_RESETCONTENT, 0, 0); //
// Which device instance was selected
//
Index = SendDlgItemMessage(hDlg, ID_LB_TARGETS, LB_GETCURSEL, 0, 0); if (Index == LB_ERR || Index == 0) { return FALSE; } SendDlgItemMessage(hDlg, ID_LB_TARGETS, LB_GETTEXT, (WPARAM)Index, (LPARAM)(LPCTSTR)szDevice); //
// How big a buffer to hold the relations list?
//
Status = CM_Get_Device_ID_List_Size_Ex(&Size, szDevice, RelationType, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List_Size failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
pBuffer = (PTSTR)malloc(Size * sizeof(TCHAR)); if (pBuffer == NULL) { return FALSE; }
//
// to verify the null terminators are correct, fill with 1's
//
memset(pBuffer, 1, Size * sizeof(TCHAR));
//
// Retrieve and display the relations list
//
Status = CM_Get_Device_ID_List_Ex(szDevice, pBuffer, Size, RelationType, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
for (p = pBuffer; *p; p += lstrlen(p) + 1) { SendDlgItemMessage(hDlg, ID_LB_RELATIONS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p); }
free(pBuffer); return TRUE;
} // FillRelationsListBox
/**----------------------------------------------------------------------**/ LRESULT CALLBACK DeviceDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDevice[MAX_DEVICE_ID_LEN+1]; DEVNODE dnDevNode; ULONG ulStatus, ulProblem; ULONG err;
switch (message) { case WM_SHOWWINDOW: FillDeviceInstanceListBox(hDlg); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_BT_SOFTWAREKEY: DialogBox(hInst, MAKEINTRESOURCE(SOFTWAREKEY_DIALOG), hDlg, (DLGPROC)SoftwareKeyDlgProc); break;
case ID_BT_ENABLE: if (!GetSelectedDevNode(hDlg, &dnDevNode)) { MessageBeep(0); break; }
Status = CM_Enable_DevNode_Ex(dnDevNode, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Enable_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); break; } break;
case ID_BT_DISABLE: if (!GetSelectedDevNode(hDlg, &dnDevNode)) { MessageBeep(0); break; }
Status = CM_Disable_DevNode_Ex(dnDevNode, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Disable_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); break; } break;
case ID_BT_CREATE: GetSelectedDevice(hDlg, szDevice); DialogBoxParam(hInst, MAKEINTRESOURCE(CREATE_DIALOG), hDlg, (DLGPROC)CreateDlgProc, (LPARAM)(LPCTSTR)szDevice); break;
case ID_BT_GETSTATUS: if (!GetSelectedDevNode(hDlg, &dnDevNode)) { MessageBeep(0); break; }
Status = CM_Get_DevNode_Status_Ex(&ulStatus, &ulProblem, dnDevNode, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_DevNode_Status failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); break; }
wsprintf(szDebug, TEXT("%08xh"), ulStatus); SetDlgItemText(hDlg, ID_ST_STATUS, szDebug); wsprintf(szDebug, TEXT("%08xh"), ulProblem); SetDlgItemText(hDlg, ID_ST_PROBLEM, szDebug); break;
case ID_BT_SETPROBLEM: if (!GetSelectedDevNode(hDlg, &dnDevNode)) { MessageBeep(0); break; }
ulProblem = GetDlgItemInt(hDlg, ID_ST_PROBLEM, &err, FALSE); Status = CM_Set_DevNode_Problem_Ex(dnDevNode, ulProblem, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_DevNode_Status failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); } break; case ID_BT_QUERY_REMOVE: GetSelectedDevNode(hDlg, &dnDevNode); Status = CM_Query_Remove_SubTree(dnDevNode, CM_QUERY_REMOVE_UI_OK); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Query_Remove_SubTree failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); break; } break;
case ID_BT_REMOVE: GetSelectedDevNode(hDlg, &dnDevNode); Status = CM_Remove_SubTree(dnDevNode, CM_REMOVE_UI_OK); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Query_Remove_SubTree failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); break; } break;
case ID_BT_RESOURCEPICKER: GetSelectedDevice(hDlg, szDevice); CallPnPIsaDetect(hDlg, szDevice); break; } break; } return (FALSE);
} // DeviceDlgProc
/**----------------------------------------------------------------------**/ LRESULT CALLBACK DevKeyDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDeviceID[MAX_DEVICE_ID_LEN]; DEVNODE dnDevNode; ULONG ulFlags, ulProfile, ulValue; HKEY hKey = NULL;
switch (message) { case WM_INITDIALOG: CheckDlgButton(hDlg, ID_RD_HW, 1); CheckDlgButton(hDlg, ID_RD_USER, 1); SetDlgItemInt(hDlg, ID_ED_PROFILE, 0xFFFFFFFF, FALSE); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) {
case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_BT_OPENDEVKEY: GetDlgItemText(hDlg, ID_ED_DEVICEID, szDeviceID, MAX_DEVICE_ID_LEN);
Status = CM_Locate_DevNode_Ex(&dnDevNode, szDeviceID, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Locate_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
ulFlags = 0;
if (IsDlgButtonChecked(hDlg, ID_RD_HW)) { ulFlags |= CM_REGISTRY_HARDWARE; } else { ulFlags |= CM_REGISTRY_SOFTWARE; }
if (IsDlgButtonChecked(hDlg, ID_RD_USER)) { ulFlags |= CM_REGISTRY_USER; } else if (IsDlgButtonChecked(hDlg, ID_RD_CONFIG)) { ulFlags |= CM_REGISTRY_CONFIG; ulProfile = (ULONG)GetDlgItemInt(hDlg, ID_ED_PROFILE, NULL, TRUE); }
Status = CM_Open_DevNode_Key_Ex( dnDevNode, KEY_READ | KEY_WRITE, ulProfile, RegDisposition_OpenAlways, &hKey, ulFlags, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Open_DevNode_Key failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
ulValue = 13; RegSetValueEx(hKey, TEXT("CustomValue"), 0, REG_DWORD, (LPBYTE)&ulValue, 4); RegCloseKey(hKey); break;
case ID_BT_DELDEVKEY: GetDlgItemText(hDlg, ID_ED_DEVICEID, szDeviceID, MAX_DEVICE_ID_LEN);
Status = CM_Locate_DevNode_Ex(&dnDevNode, szDeviceID, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Locate_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
ulFlags = 0;
if (IsDlgButtonChecked(hDlg, ID_RD_HW)) { ulFlags |= CM_REGISTRY_HARDWARE; } else { ulFlags |= CM_REGISTRY_SOFTWARE; }
if (IsDlgButtonChecked(hDlg, ID_RD_USER)) { ulFlags |= CM_REGISTRY_USER; } else if (IsDlgButtonChecked(hDlg, ID_RD_CONFIG)) { ulFlags |= CM_REGISTRY_CONFIG; ulProfile = (ULONG)GetDlgItemInt(hDlg, ID_ED_PROFILE, NULL, TRUE); }
Status = CM_Delete_DevNode_Key_Ex( dnDevNode, ulProfile, ulFlags, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Delete_DevNode_Key failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; } } break; } return (FALSE);
} // DevKeyDlgProc
/**----------------------------------------------------------------------**/ BOOL FillEnumeratorListBox( HWND hDlg ) { CONFIGRET Status; ULONG ulIndex, Size; TCHAR szEnumerator[MAX_PATH];
SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_RESETCONTENT, 0, 0);
SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)TEXT("(All)"));
ulIndex = 0; Status = CR_SUCCESS;
while (Status == CR_SUCCESS) {
Size = MAX_PATH; Status = CM_Enumerate_Enumerators_Ex( ulIndex, szEnumerator, &Size, 0, hMachine);
if (Status == CR_NO_SUCH_VALUE) { // no more enumerators, break out of the loop
break; }
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Enumerate_Enumerators failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)szEnumerator);
ulIndex++; }
SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_SETSEL, TRUE, 0);
return TRUE;
} // FillEnumeratorListBox
/**----------------------------------------------------------------------**/ BOOL FillDeviceListBox( HWND hDlg ) { CONFIGRET Status; ULONG Size, i; TCHAR szEnumerator[MAX_PATH]; TCHAR szDevice[MAX_DEVICE_ID_LEN]; PTSTR pBuffer, p;
if (!GetSelectedEnumerator(hDlg, szEnumerator)) { MessageBeep(0); return FALSE; }
if (*szEnumerator == '\0') { Status = CM_Get_Device_ID_List_Size_Ex(&Size, NULL, CM_GETIDLIST_FILTER_NONE, hMachine); } else { Status = CM_Get_Device_ID_List_Size_Ex(&Size, szEnumerator, CM_GETIDLIST_FILTER_ENUMERATOR, hMachine); }
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List_Size failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
i = Size * sizeof(TCHAR);
pBuffer = (PTSTR)malloc(i); if (pBuffer == NULL) { MessageBeep(0); return FALSE; }
if (*szEnumerator == '\0') { Status = CM_Get_Device_ID_List_Ex(NULL, pBuffer, Size, CM_GETIDLIST_FILTER_NONE, hMachine); } else { Status = CM_Get_Device_ID_List_Ex(szEnumerator, pBuffer, Size, CM_GETIDLIST_FILTER_ENUMERATOR, hMachine); }
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_DEVICES, LB_RESETCONTENT, 0, 0);
for (p = pBuffer; *p; p += lstrlen(p) + 1) {
SendDlgItemMessage( hDlg, ID_LB_DEVICES, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p); }
SendDlgItemMessage( hDlg, ID_LB_DEVICES, LB_SETSEL, TRUE, 0);
free(pBuffer);
return TRUE;
} // FillDeviceListBox
/**----------------------------------------------------------------------**/ BOOL FillInstanceListBox( HWND hDlg ) { CONFIGRET Status; ULONG Size; TCHAR szDevice[MAX_DEVICE_ID_LEN]; PTSTR pBuffer, p; LONG Index;
Index = SendDlgItemMessage( hDlg, ID_LB_DEVICES, LB_GETCURSEL, 0, 0); if (Index == LB_ERR) { MessageBeep(0); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_DEVICES, LB_GETTEXT, (WPARAM)Index, (LPARAM)(LPCTSTR)szDevice);
// truncate the instance part
p = szDevice; while (*p != '\\') p++; p++; while (*p != '\\') p++; *p = '\0';
Status = CM_Get_Device_ID_List_Size_Ex(&Size, szDevice, CM_GETIDLIST_FILTER_ENUMERATOR, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List_Size failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
pBuffer = (PTSTR)LocalAlloc(LPTR, Size * sizeof(TCHAR)); if (pBuffer == NULL) { MessageBeep(0); return FALSE; }
Status = CM_Get_Device_ID_List_Ex(szDevice, pBuffer, Size, CM_GETIDLIST_FILTER_ENUMERATOR, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_INSTANCES, LB_RESETCONTENT, 0, 0);
p = (LPTSTR)pBuffer; while (*p != '\0') {
SendDlgItemMessage( hDlg, ID_LB_INSTANCES, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p);
while (*p != '\0') { p++; // skip to next substring
} p++; // skip over null terminator
}
SendDlgItemMessage( hDlg, ID_LB_INSTANCES, LB_SETSEL, TRUE, 0);
LocalFree(pBuffer);
return TRUE;
} // FillInstanceListBox
/**----------------------------------------------------------------------**/ BOOL FillDeviceInstanceListBox( HWND hDlg ) { CONFIGRET Status; ULONG Size; TCHAR szDevice[MAX_DEVICE_ID_LEN]; PTSTR pBuffer, p;
//
// get device list size for all enumerators
//
Status = CM_Get_Device_ID_List_Size_Ex(&Size, NULL, CM_GETIDLIST_FILTER_NONE, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List_Size failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
pBuffer = (PTSTR)LocalAlloc(LPTR, Size * sizeof(TCHAR)); if (pBuffer == NULL) { MessageBeep(0); return FALSE; }
//
// to verify the null terminators are correct, fill with 1's
//
memset(pBuffer, 1, Size * sizeof(TCHAR));
//
// get device list for all enumerators
//
Status = CM_Get_Device_ID_List_Ex(NULL, pBuffer, Size, CM_GETIDLIST_FILTER_NONE, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Get_Device_ID_List failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_DEVICEIDS, LB_RESETCONTENT, 0, 0);
p = (LPTSTR)pBuffer; while (*p != '\0') {
SendDlgItemMessage( hDlg, ID_LB_DEVICEIDS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)p);
while (*p != '\0') { p++; // skip to next substring
} p++; // skip over null terminator
}
SendDlgItemMessage(hDlg, ID_LB_DEVICEIDS, LB_SETSEL, TRUE, 0); LocalFree(pBuffer); return TRUE;
} // FillDeviceInstanceListBox
/**----------------------------------------------------------------------**/ BOOL GetSelectedEnumerator( HWND hDlg, LPTSTR szEnumerator ) { LONG Index;
Index = SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_GETCURSEL, 0, 0); if (Index == LB_ERR) { MessageBeep(0); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_ENUMERATORS, LB_GETTEXT, (WPARAM)Index, (LPARAM)(LPCTSTR)szEnumerator);
if (lstrcmpi(szEnumerator, TEXT("(All)")) == 0) { *szEnumerator = '\0'; // if All selected, then no Enumerator specified
} return TRUE;
} // GetSeletectedEnumerator
/**----------------------------------------------------------------------**/ BOOL GetSelectedDevice( HWND hDlg, LPTSTR szDevice ) { LONG Index;
Index = SendDlgItemMessage( hDlg, ID_LB_DEVICEIDS, LB_GETCURSEL, 0, 0); if (Index == LB_ERR || Index == 0) { MessageBeep(0); return FALSE; }
SendDlgItemMessage( hDlg, ID_LB_DEVICEIDS, LB_GETTEXT, (WPARAM)Index, (LPARAM)(LPCTSTR)szDevice);
return TRUE;
} // GetSeletectedDevice
/**----------------------------------------------------------------------**/ BOOL GetSelectedDevNode( HWND hDlg, PDEVNODE pdnDevNode ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDevice[MAX_DEVICE_ID_LEN];
if (!GetSelectedDevice(hDlg, szDevice)) { return FALSE; }
Status = CM_Locate_DevNode_Ex(pdnDevNode, szDevice, 0, hMachine);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Locate_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
return TRUE;
} // GetSelectedDevNode
/**----------------------------------------------------------------------**/ LRESULT CALLBACK SoftwareKeyDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS;
switch (message) { case WM_INITDIALOG: return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE;
default: break; } } return (FALSE);
} // SoftwareKeyDlgProc
/**----------------------------------------------------------------------**/ LRESULT CALLBACK CreateDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDeviceID[MAX_DEVICE_ID_LEN]; TCHAR szParentID[MAX_DEVICE_ID_LEN]; DEVNODE dnDevNode, dnParentDevNode; ULONG ulFlags;
switch (message) {
case WM_INITDIALOG: SetDlgItemText(hDlg, ID_ST_PARENT, (LPCTSTR)lParam); CheckDlgButton(hDlg, ID_RD_NORMAL, 1); return TRUE;
case WM_COMMAND: switch(LOWORD(wParam)) {
case IDOK: EndDialog(hDlg, TRUE); return TRUE;
case ID_BT_CREATE: SetDlgItemText(hDlg, ID_ST_STATUS, TEXT("")); GetDlgItemText(hDlg, ID_ED_DEVICEID, szDeviceID, MAX_DEVICE_ID_LEN); GetDlgItemText(hDlg, ID_ST_PARENT, szParentID, MAX_DEVICE_ID_LEN);
ulFlags = CM_CREATE_DEVNODE_NORMAL;
if (IsDlgButtonChecked(hDlg, ID_CHK_GENERATEID)) { ulFlags |= CM_CREATE_DEVNODE_GENERATE_ID; }
if (IsDlgButtonChecked(hDlg, ID_CHK_PHANTOM)) { ulFlags |= CM_CREATE_DEVNODE_PHANTOM; }
Status = CM_Locate_DevNode( &dnParentDevNode, szParentID, 0);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Locate_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
Status = CM_Create_DevNode( &dnDevNode, szDeviceID, dnParentDevNode, ulFlags);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Create_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
memset(szDeviceID, 0, MAX_DEVICE_ID_LEN * sizeof(TCHAR));
Status = CM_Get_Device_ID( dnDevNode, szDeviceID, MAX_DEVICE_ID_LEN, 0);
if (Status != CR_SUCCESS) { wsprintf(szDebug, TEXT("CM_Create_DevNode failed (%xh)"), Status); MessageBox(hDlg, szDebug, szAppName, MB_OK); return FALSE; }
wsprintf(szDebug, TEXT("%s created"), szDeviceID); SetDlgItemText(hDlg, ID_ST_STATUS, szDebug); break; } break; } return (FALSE);
} // CreateDlgProc
|