|
|
//===========================================================================
// dmttest.cpp
//
// Device test functionality
//
// Functions:
// dmttestRunIntegrated
// dmttestRunMapperCPL
//
// History:
// 08/27/1999 - davidkl - created
//===========================================================================
#include "dimaptst.h"
#include "dmtinput.h"
#include "dmtwrite.h"
#include "dmtfail.h"
#include "dmttest.h"
#include "d3d.h"
#include "assert.h"
#include <tchar.h>
#include <stdio.h>
#include <commdlg.h>
#define DIPROP_MAPFILE MAKEDIPROP(0xFFFD)
//---------------------------------------------------------------------------
// file global variables
HANDLE ghthDeviceTest = NULL; DIDEVICEOBJECTDATA *gpdidod = NULL; HICON ghiButtonState[2]; HICON ghiPovState[9];
UINT_PTR g_NumSubGenres = 0;
//---------------------------------------------------------------------------
//===========================================================================
// dmttestRunIntegrated
//
// Runs integrated device test, prompts for test results
//
// Parameters:
//
// Returns: HRESULT
//
// History:
// 08/27/1999 - davidkl - created
// 11/02/1999 - davidkl - now does all preparation and starts input timer
// 11/10/1999 - davidkl - now allocates and populates pdmtai->pan
//===========================================================================
HRESULT dmttestRunIntegrated(HWND hwnd) { HRESULT hRes = S_OK;
//JJ 64Bit Compat
INT_PTR nIdx = -1; UINT u = 0; DWORD dw = 0; DMTDEVICE_NODE *pDevice = NULL; DMTSUBGENRE_NODE *pSubGenre = NULL; DMTMAPPING_NODE *pMapping = NULL; DMTACTION_NODE *pAction = NULL; DMT_APPINFO *pdmtai = NULL; ACTIONNAME *pan = NULL; DIACTIONA *pdia = NULL;
// get the app info structure
//JJ 64Bit Compat
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if(!pdmtai) { return E_UNEXPECTED; }
__try { // get the currently selected device
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST), CB_GETCURSEL, 0, 0L); if(-1 == nIdx) { // this is bad
hRes = E_UNEXPECTED; __leave; } pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST), CB_GETITEMDATA, nIdx, 0L); if(!pDevice) { // this is bad
hRes = E_UNEXPECTED; __leave; }
// get the currently selected genre
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES), CB_GETCURSEL, 0, 0L); if(-1 == nIdx) { // this is bad
hRes = E_UNEXPECTED; __leave; } pSubGenre = (DMTSUBGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES), CB_GETITEMDATA, nIdx, 0L); if(!pSubGenre) { // this is bad
hRes = E_UNEXPECTED; __leave; }
// match the device with the mapping node
pMapping = pSubGenre->pMappingList; while(pMapping) { // is this our device's mapping info?
if(IsEqualGUID(pDevice->guidInstance, pMapping->guidInstance)) { break; }
// next mapping node
pMapping = pMapping->pNext; } if(!pMapping) { // no match found
hRes = E_UNEXPECTED; __leave; }
// allocate the app info's actionname list
if(pdmtai->pan) { // for some reason,
// we are attempting to clobber existing data!
// ISSUE-2001/03/29-timgill Need to raise an error code here
DebugBreak(); } pdmtai->pan = (ACTIONNAME*)LocalAlloc(LMEM_FIXED, sizeof(ACTIONNAME) * pMapping->uActions); if(!(pdmtai->pan)) { hRes = E_UNEXPECTED; __leave; } ZeroMemory((void*)(pdmtai->pan), sizeof(ACTIONNAME) * pMapping->uActions); pdmtai->dwActions = (DWORD)(pMapping->uActions); pan = pdmtai->pan;
// allocate data buffer
gpdidod = (DIDEVICEOBJECTDATA*)LocalAlloc(LMEM_FIXED, DMTINPUT_BUFFERSIZE * sizeof(DIDEVICEOBJECTDATA)); if(!gpdidod) { // nothing we can do if we are out of memory
DPF(0, "dmttestGetInput - unable to allocate data buffer (%d)", GetLastError()); hRes = E_OUTOFMEMORY; __leave; }
// setup the device
hRes = dmtinputPrepDevice(hwnd, pSubGenre->dwGenreId, pDevice, pMapping->uActions, pMapping->pdia); if(FAILED(hRes)) { __leave; } // populate the actionname list
//
// match pdia->dwSemantic with pAction->dwActionId
// if found, copy pAction->szName to pdia->lptszActionName
pdia = pMapping->pdia; for(u = 0; u < pMapping->uActions; u++) { (pan+u)->dw = (DWORD)/*JJ 64Bit*/(pdia+u)->uAppData; lstrcpyA((pan+u)->sz, (pdia+u)->lptszActionName); }
// start the input timer
DPF(4, "dmttestRunIntegrated - Starting input timer..."); // ISSUE-2001/03/29-timgill Should check return value here
SetTimer(hwnd, ID_POLL_TIMER, DMT_POLL_TIMEOUT, NULL); // en/disable appropriate ui elements
EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_GENRES_LABEL), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_GENRES), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ENUM_DEVICES), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), FALSE); // EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_LAUNCH_CPL_EDIT_MODE), FALSE); // EnableWindow(GetDlgItem(hwnd, IDC_SAVE_STD), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_HID), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_SAVE_BOTH), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_START_WITH_DEFAULTS), FALSE); } __finally { // if something failed
if(FAILED(hRes)) { if(LocalFree((HLOCAL)(pdmtai->pan))) { // memory leak
// ISSUE-2001/03/29-timgill Needs error case handling
} } }
// done
return S_OK;
} //*** end dmttestRunIntegrated()
BOOL CALLBACK EnumDeviceCallback(const DIDEVICEINSTANCE *lpdidi, LPDIRECTINPUTDEVICE8 lpDID, DWORD dwFlags, DWORD dwDeviceRemaining, LPVOID hwnd) { DIPROPSTRING dips; HRESULT hr;
ZeroMemory(&dips, sizeof(dips)); dips.diph.dwSize = sizeof(dips); dips.diph.dwHeaderSize = sizeof(DIPROPHEADER); dips.diph.dwObj = 0; dips.diph.dwHow = DIPH_DEVICE; hr = lpDID->GetProperty(DIPROP_MAPFILE, &dips.diph); if (hr == DIERR_OBJECTNOTFOUND) { // Map file not specified. Let the use specify it.
TCHAR tszMsg[MAX_PATH]; _stprintf(tszMsg, _T("INI path not specified for %s. You need to specify it now."), lpdidi->tszInstanceName); MessageBox(NULL, tszMsg, _T("Error"), MB_OK); // Obstain a file name
TCHAR tszFilePath[MAX_PATH] = _T(""); TCHAR tszFileName[MAX_PATH]; OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = (HWND)hwnd; ofn.lpstrFilter = _T("INI Files (*.ini)\0*.ini\0All Files (*.*)\0*.*\0"); ofn.lpstrFile = tszFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrTitle = _T("INI File Path"); ofn.Flags = OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); // Obtain the registry key
LPDIRECTINPUT8 lpDI = NULL; LPDIRECTINPUTJOYCONFIG8 lpDIJC = NULL; DIJOYCONFIG jc; DIPROPDWORD diPropDword; HKEY hkType;
DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&lpDI, NULL); if (lpDI) { lpDI->QueryInterface(IID_IDirectInputJoyConfig8, (LPVOID*)&lpDIJC); lpDI->Release(); } if (lpDIJC) { diPropDword.diph.dwSize = sizeof( diPropDword ); diPropDword.diph.dwHeaderSize = sizeof( diPropDword.diph ); diPropDword.diph.dwObj = 0; diPropDword.diph.dwHow = DIPH_DEVICE; lpDID->GetProperty( DIPROP_JOYSTICKID, &diPropDword.diph ); jc.dwSize = sizeof( jc ); lpDIJC->GetConfig( diPropDword.dwData, &jc, DIJC_REGHWCONFIGTYPE ); lpDIJC->SetCooperativeLevel((HWND)hwnd, DISCL_EXCLUSIVE|DISCL_BACKGROUND); lpDIJC->Acquire();
dmtOpenTypeKey(jc.wszType, KEY_ALL_ACCESS, &hkType);
// Write the INI file name
RegSetValueEx(hkType, _T("OEMMapFile"), 0, REG_SZ, (LPBYTE)ofn.lpstrFile, (lstrlen(ofn.lpstrFile)+1) * sizeof(TCHAR));
RegCloseKey(hkType); lpDIJC->Unacquire(); lpDIJC->Release(); } }
return DIENUM_CONTINUE; }
//===========================================================================
// ModifyDiactfrmDllPath
//
// Modifies the path of the diactfrm.dll COM server in the registry
// to same as the exe path.
//
// Parameters:
//
// Returns: TRUE if path is modified. FALSE if an error occurred.
//
// History:
// 08/02/2001 - jacklin - created
//===========================================================================
static BOOL ModifyDiactfrmDllPath() { const TCHAR tszFrmwrkPath[] = _T("SOFTWARE\\Classes\\CLSID\\{18AB439E-FCF4-40D4-90DA-F79BAA3B0655}\\InProcServer32"); const TCHAR tszPagePath[] = _T("SOFTWARE\\Classes\\CLSID\\{9F34AF20-6095-11D3-8FB2-00C04F8EC627}\\InProcServer32"); HKEY hKey; LONG lResult;
// Construct the full path of the DLL using current exe path.
TCHAR tszNewPath[MAX_PATH]; if (!GetModuleFileName(NULL, tszNewPath, MAX_PATH)) { return FALSE; } TCHAR *pcLastSlash; pcLastSlash = _tcsrchr(tszNewPath, _T('\\')); // Replace the exe name with diactfrm.dll
lstrcpy(pcLastSlash + 1, _T("diactfrm.dll"));
// Check that the DLL exists
HANDLE hDllFile = CreateFile(tszNewPath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDllFile == INVALID_HANDLE_VALUE) return FALSE; CloseHandle(hDllFile);
//// Modify the path for framework object
// Open the key for write access
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszFrmwrkPath, 0, KEY_WRITE, &hKey); if (lResult != ERROR_SUCCESS) { // Cannot open the key. Most likely some bad error happened.
// We will do nothing in this case.
return FALSE; } // Write the new path to the default value
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath)); RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) { // Error occurred while writing the value.
return FALSE; }
//// Modify the path for framework page object
// Open the key for write access
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszPagePath, 0, KEY_WRITE, &hKey); if (lResult != ERROR_SUCCESS) { // Cannot open the key. Most likely some bad error happened.
// We will do nothing in this case.
return FALSE; } // Write the new path to the default value
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath)); RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) { // Error occurred while writing the value.
return FALSE; }
return TRUE; }
//===========================================================================
// RestoreDiactfrmDllPath
//
// Restores the path of the diactfrm.dll COM server in the registry
// to the system directory, which should be the default.
//
// Parameters:
//
// Returns: TRUE if path is modified. FALSE if an error occurred.
//
// History:
// 08/02/2001 - jacklin - created
//===========================================================================
static BOOL RestoreDiactfrmDllPath() { const TCHAR tszFrmwrkPath[] = _T("SOFTWARE\\Classes\\CLSID\\{18AB439E-FCF4-40D4-90DA-F79BAA3B0655}\\InProcServer32"); const TCHAR tszPagePath[] = _T("SOFTWARE\\Classes\\CLSID\\{9F34AF20-6095-11D3-8FB2-00C04F8EC627}\\InProcServer32"); HKEY hKey; LONG lResult;
// Construct the full path of the DLL using current exe path.
TCHAR tszNewPath[MAX_PATH]; if (!GetSystemDirectory(tszNewPath, MAX_PATH)) { return FALSE; } lstrcat(tszNewPath, _T("\\diactfrm.dll"));
//// Modify the path for framework object
// Open the key for write access
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszFrmwrkPath, 0, KEY_WRITE, &hKey); if (lResult != ERROR_SUCCESS) { // Cannot open the key. Most likely some bad error happened.
// We will do nothing in this case.
return FALSE; } // Write the new path to the default value
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath)); RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) { // Error occurred while writing the value.
return FALSE; }
//// Modify the path for framework page object
// Open the key for write access
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszPagePath, 0, KEY_WRITE, &hKey); if (lResult != ERROR_SUCCESS) { // Cannot open the key. Most likely some bad error happened.
// We will do nothing in this case.
return FALSE; } // Write the new path to the default value
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath)); RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) { // Error occurred while writing the value.
return FALSE; }
return TRUE; }
//===========================================================================
// dmttestRunMapperCPL
//
// Launches DirectInput Mapper CPL, prompts for test results
//
// Parameters:
//
// Returns: HRESULT
//
// History:
// 08/27/1999 - davidkl - created
// 11/04/1999 - davidkl - added support for launching in IHV Edit Mode
//===========================================================================
HRESULT dmttestRunMapperCPL(HWND hwnd, BOOL fEditMode) { HRESULT hRes = S_OK; // int n = -1;
//JJ 64Bit Compat
INT_PTR n = -1; UINT u = 0; BOOL fUserMadeChanges = FALSE; DMTDEVICE_NODE *pDevice = NULL; DMTSUBGENRE_NODE *pSubGenre = NULL; DMTMAPPING_NODE *pMapping = NULL; IDirectInput8A *pdi = NULL; char szBuf[MAX_PATH]; //DIACTIONFORMATA diaf;
//JJ Fix
DMTGENRE_NODE *pGenre = NULL; DIACTIONFORMATA* pDiaf = NULL; DMT_APPINFO *pdmtai = NULL; ULONG i = 0; //JJ TEST
DICONFIGUREDEVICESPARAMSA dicdp;
GUID guidActionMap; DWORD dwMapUIMode = 0;
/////////////////THIS IS WHERE THE FIX FOR USING AN ACTION ARRAY STARTS////////////
//initialize appropriate mapper UI GUID and display mode
//RY fix for bug #35577
if(fEditMode) { guidActionMap = GUID_DIConfigAppEditLayout; dwMapUIMode = DICD_EDIT; } else { guidActionMap = GUID_DIMapTst; dwMapUIMode = DICD_DEFAULT; }
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if(!pdmtai) { // big problem
// this should NEVER happen
// ISSUE-2001/03/29-timgill Needs error case handling
}
__try { // pDevice = pdmtai->pDeviceList;
// get the currently selected device
n = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST), CB_GETCURSEL, 0, 0L); pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST), CB_GETITEMDATA, n, 0L);
//JJ Fix 34157
if(CB_ERR == (INT_PTR)pDevice) { MessageBox(hwnd, TEXT("Please install a gaming device"), TEXT("NO DEVICES"), 0); hRes = E_UNEXPECTED; __leave; }
if(fEditMode) { hRes = dmtwriteWriteFileHeader(hwnd, pDevice); if(FAILED(hRes)) { __leave; }
if (S_FALSE == hRes) { hRes = S_OK; __leave; } }
//JJ FIX
// create a directinput object
hRes = dmtinputCreateDirectInput(ghinst, &pdi); if(FAILED(hRes)) { hRes = DMT_E_INPUT_CREATE_FAILED; __leave; }
pGenre = pdmtai->pGenreList; //Allocate out the array...
pDiaf = (DIACTIONFORMATA*)malloc(sizeof(DIACTIONFORMATA) * g_NumSubGenres);
ZeroMemory((void*)pDiaf, sizeof(DIACTIONFORMATA) * g_NumSubGenres);
while(pGenre) { pSubGenre = pGenre->pSubGenreList; while(pSubGenre) {
// find the mapping node for the selected device
pMapping = pSubGenre->pMappingList;
pMapping = pSubGenre->pMappingList; while(pMapping) { if(IsEqualGUID(pDevice->guidInstance, pMapping->guidInstance)) { break; }
// next mapping
pMapping = pMapping->pNext; } if(!pMapping) { // this should never happen
hRes = DMT_E_NO_MATCHING_MAPPING; DebugBreak(); __leave; }
// prepare the DIACTIONFORMAT structure
pDiaf[i].dwSize = sizeof(DIACTIONFORMAT); pDiaf[i].dwActionSize = sizeof(DIACTIONA); pDiaf[i].dwNumActions = (DWORD)(pMapping->uActions); pDiaf[i].rgoAction = pMapping->pdia; pDiaf[i].dwDataSize = 4 * pDiaf[i].dwNumActions; pDiaf[i].dwGenre = pSubGenre->dwGenreId; pDiaf[i].dwBufferSize = DMTINPUT_BUFFERSIZE; //Set up the proper names
wsprintfA(szBuf, "%s: %s", pSubGenre->szName, pSubGenre->szDescription); pDiaf[i].guidActionMap = guidActionMap; lstrcpyA(pDiaf[i].tszActionMap, szBuf);
//Increment the counter
i++;
//Next Subgenre
pSubGenre = pSubGenre->pNext;
} //Next Genre
pGenre = pGenre->pNext; }
assert(i == g_NumSubGenres);
// Enumerate the devices and check if INI path is set
pdi->EnumDevicesBySemantics(NULL, pDiaf, ::EnumDeviceCallback, (LPVOID)hwnd, DIEDBSFL_ATTACHEDONLY);
// prepare the configure devices params
ZeroMemory((void*)&dicdp, sizeof(DICONFIGUREDEVICESPARAMSA)); dicdp.dwSize = sizeof(DICONFIGUREDEVICESPARAMSA); dicdp.dwcUsers = 0; dicdp.lptszUserNames = NULL; //dicdp.dwcFormats = 1;
dicdp.dwcFormats = i;//g_NumSubGenres;
dicdp.lprgFormats = pDiaf;//&diaf;
dicdp.hwnd = hwnd; dicdp.lpUnkDDSTarget = NULL; // colors
dicdp.dics.dwSize = sizeof(DICOLORSET); /* dicdp.dics.cTextFore = D3DRGB(0,0,255);
dicdp.dics.cTextHighlight = D3DRGB(0,255,255); dicdp.dics.cCalloutLine = D3DRGB(255,255,255); dicdp.dics.cCalloutHighlight= D3DRGB(255,255,0); dicdp.dics.cBorder = D3DRGB(0,128,255); dicdp.dics.cControlFill = D3DRGB(128,128,255); dicdp.dics.cHighlightFill = D3DRGB(255,0,0); dicdp.dics.cAreaFill = D3DRGB(192,192,192); */
// display mapper cpl
///////////////////////////////END FIX///////////////////////////////////////
//JJ Fix34958
EnableWindow(hwnd, FALSE);
// 8/2/2001 (jacklin): Modify the path of diactfrm.dll COM server to
// use the DDK version of the DLL.
BOOL bModified = ModifyDiactfrmDllPath();
hRes = pdi->ConfigureDevices(NULL, &dicdp, dwMapUIMode, // flags
NULL); // user data for callback fn
// 8/2/2001 (jacklin): Restore the path of diactfrm.dll COM server
if (bModified) RestoreDiactfrmDllPath();
EnableWindow(hwnd, TRUE);
if(FAILED(hRes)) { DPF(0, "ConfigureDevices failed (%s == %08Xh)", dmtxlatHRESULT(hRes), hRes); __leave; }
} __finally { // general cleanup
SAFE_RELEASE(pdi); if(pDiaf) { free(pDiaf); pDiaf = NULL; } }
// done
return hRes;
} //*** end dmttestRunMapperCPL()
//===========================================================================
// dmttestStopIntegrated
//
// Stops integrated device test
//
// Parameters:
// HWND hwnd - handle of app window
//
// Returns: BOOL
// TRUE - Passed
// FALSE - Failed
//
// History:
// 09/22/1999 - davidkl - created
// 11/02/1999 - davidkl - stops timer and performs cleanup
// 11/09/1999 - davidkl - added freeing of actionname allocation
//===========================================================================
BOOL dmttestStopIntegrated(HWND hwnd) { int n = 0; DWORD dw = WAIT_ABANDONED; BOOL fPassed = TRUE; DMT_APPINFO *pdmtai = NULL;
// get the app info structure
//JJ 64Bit Compat
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA); if(!pdmtai) { // ISSUE-2001/03/29-timgill Needs error case handling
}
// stop the input timer
// ISSUE-2001/03/29-timgill Should check timer was set and return value
KillTimer(hwnd, ID_POLL_TIMER);
// free the buffer
if(gpdidod) { if(LocalFree((HLOCAL)gpdidod)) { // memory leak
// ISSUE-2001/03/29-timgill Needs error case handling
} }
// free the pdmtai actionname list
if(pdmtai->pan) { if(LocalFree((HLOCAL)(pdmtai->pan))) { // memory leak
// ISSUE-2001/03/29-timgill Needs error case handling
} pdmtai->pan = NULL; }
// prompt for test results
n = MessageBoxA(hwnd, "Were the correct semantics displayed\r\n" "for each device control?", "Test Results", MB_YESNO); if(IDNO == n) { // display dialog prompting for details
// ISSUE-2001/03/29-timgill Should test type (cpl/integrated)
DialogBoxParamA(ghinst, MAKEINTRESOURCEA(IDD_FAILURE_DETAILS), hwnd, dmtfailDlgProc, (LPARAM)NULL); }
// en/disable appropriate ui elements
EnableWindow(GetDlgItem(hwnd, IDOK), TRUE); EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_GENRES_LABEL), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_GENRES), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_ENUM_DEVICES), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), TRUE); // EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_LAUNCH_CPL_EDIT_MODE), TRUE); // EnableWindow(GetDlgItem(hwnd, IDC_SAVE_STD), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_HID), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_SAVE_BOTH), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_START_WITH_DEFAULTS), TRUE);
// done
return fPassed;
} //*** end dmttestStopIntegrated()
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
|