697 lines
21 KiB
C
697 lines
21 KiB
C
/*++
|
||
|
||
Copyright (C) 1995-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
datasrc.c
|
||
|
||
Abstract:
|
||
|
||
data source selection dialog box functions
|
||
|
||
Revision History
|
||
|
||
Bob Watson (a-robw) Feb-95 Created
|
||
|
||
--*/
|
||
#include <windows.h>
|
||
#include <assert.h>
|
||
#include <tchar.h>
|
||
#include "mbctype.h"
|
||
#include <pdh.h>
|
||
#include "pdhidef.h"
|
||
#include "pdhdlgs.h"
|
||
#include "datasrc.h"
|
||
#include "pdhmsg.h"
|
||
#include "strings.h"
|
||
|
||
//
|
||
// Constants used in this module
|
||
//
|
||
ULONG
|
||
PdhiDatasrcaulControlIdToHelpIdMap[] =
|
||
{
|
||
IDC_CURRENT_ACTIVITY, IDH_CURRENT_ACTIVITY,
|
||
IDC_DATA_FROM_LOG_FILE, IDH_DATA_FROM_LOG_FILE,
|
||
IDC_LOG_FILE_EDIT, IDH_LOG_FILE_EDIT,
|
||
0,0
|
||
};
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_RadioButton (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN WORD wCtrlId
|
||
)
|
||
{
|
||
int nShowEdit = FALSE;
|
||
int nShowBrowseBtn = FALSE;
|
||
int nShowRegBtn = FALSE;
|
||
int nShowWbemBtn = FALSE;
|
||
|
||
switch (wNotifyMsg) {
|
||
case BN_CLICKED:
|
||
switch (wCtrlId) {
|
||
case IDC_CURRENT_ACTIVITY:
|
||
nShowEdit = FALSE;
|
||
nShowBrowseBtn = FALSE;
|
||
nShowRegBtn = TRUE;
|
||
nShowWbemBtn = TRUE;
|
||
break;
|
||
|
||
case IDC_DATA_FROM_LOG_FILE:
|
||
nShowEdit = TRUE;
|
||
nShowBrowseBtn = TRUE;
|
||
nShowRegBtn = FALSE;
|
||
nShowWbemBtn = FALSE;
|
||
break;
|
||
|
||
case IDC_PERF_REG:
|
||
case IDC_WBEM_NS:
|
||
return TRUE;
|
||
|
||
}
|
||
EnableWindow (GetDlgItem (hDlg, IDC_LOG_FILE_EDIT), nShowEdit);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LOG_FILES), nShowBrowseBtn);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_PERF_REG), nShowRegBtn);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_WBEM_NS), nShowWbemBtn);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_BROWSE_LOG_FILES (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
WCHAR szEditBoxString[SMALL_BUFFER_SIZE];
|
||
DWORD cchStringLen = SMALL_BUFFER_SIZE;
|
||
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case BN_CLICKED:
|
||
// get the current filename
|
||
SendDlgItemMessageW (hDlg, IDC_LOG_FILE_EDIT, WM_GETTEXT,
|
||
(WPARAM)SMALL_BUFFER_SIZE, (LPARAM)szEditBoxString);
|
||
|
||
if (PdhiBrowseDataSource (hDlg, szEditBoxString, &cchStringLen, TRUE)) {
|
||
// then update the edit box and set focus to it.
|
||
|
||
SendDlgItemMessageW (hDlg, IDC_LOG_FILE_EDIT, WM_SETTEXT,
|
||
(WPARAM)0, (LPARAM)szEditBoxString);
|
||
}
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_OK (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
PPDHI_DATA_SOURCE_INFO pInfo;
|
||
HCURSOR hOldCursor;
|
||
DWORD dwFileNameLength;
|
||
LPWSTR szStringPtr;
|
||
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case BN_CLICKED:
|
||
pInfo = (PPDHI_DATA_SOURCE_INFO)GetWindowLongPtrW (hDlg, DWLP_USER);
|
||
if (pInfo != NULL) {
|
||
hOldCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
|
||
// get data from dialog box
|
||
if (IsDlgButtonChecked (hDlg, IDC_CURRENT_ACTIVITY) == 1) {
|
||
if (IsDlgButtonChecked (hDlg, IDC_WBEM_NS) == 1) {
|
||
// then a WBEM Name Space is selected so get the name
|
||
pInfo->dwFlags = PDHI_DATA_SOURCE_WBEM_NAMESPACE;
|
||
dwFileNameLength = lstrlenW (cszWMI);
|
||
if (dwFileNameLength < pInfo->cchBufferLength) {
|
||
szStringPtr = pInfo->szDataSourceFile;
|
||
lstrcpyW (pInfo->szDataSourceFile, cszWMI);
|
||
pInfo->cchBufferLength = dwFileNameLength;
|
||
} else {
|
||
// buffer is too small for the file name
|
||
// so return the required size but no string
|
||
*pInfo->szDataSourceFile = 0;
|
||
pInfo->cchBufferLength = dwFileNameLength;
|
||
}
|
||
} else if (IsDlgButtonChecked (hDlg, IDC_PERF_REG) == 1) {
|
||
// then current activity is selected so set flags
|
||
pInfo->dwFlags = PDHI_DATA_SOURCE_CURRENT_ACTIVITY;
|
||
*pInfo->szDataSourceFile = 0;
|
||
pInfo->cchBufferLength = 0;
|
||
} else {
|
||
assert (FALSE); // no button is pressed.
|
||
}
|
||
} else if (IsDlgButtonChecked (hDlg, IDC_DATA_FROM_LOG_FILE) == 1) {
|
||
// then a log file is selected so get the log file name
|
||
pInfo->dwFlags = PDHI_DATA_SOURCE_LOG_FILE;
|
||
dwFileNameLength = (DWORD)SendDlgItemMessageW (hDlg,
|
||
IDC_LOG_FILE_EDIT, WM_GETTEXTLENGTH, 0, 0);
|
||
if (dwFileNameLength < pInfo->cchBufferLength) {
|
||
pInfo->cchBufferLength = (DWORD)SendDlgItemMessageW (hDlg,
|
||
IDC_LOG_FILE_EDIT, WM_GETTEXT,
|
||
(WPARAM)pInfo->cchBufferLength,
|
||
(LPARAM)pInfo->szDataSourceFile);
|
||
} else {
|
||
// buffer is too small for the file name
|
||
// so return the required size but no string
|
||
*pInfo->szDataSourceFile = 0;
|
||
pInfo->cchBufferLength = dwFileNameLength;
|
||
}
|
||
}
|
||
SetCursor (hOldCursor);
|
||
EndDialog (hDlg, IDOK);
|
||
} else {
|
||
// unable to locate data block so no data can be returned.
|
||
EndDialog (hDlg, IDCANCEL);
|
||
}
|
||
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_CANCEL (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
switch (wNotifyMsg) {
|
||
case BN_CLICKED:
|
||
EndDialog (hDlg, IDCANCEL);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_HELP_BTN (
|
||
IN HWND hDlg,
|
||
IN WORD wNotifyMsg,
|
||
IN HWND hWndControl
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hDlg);
|
||
UNREFERENCED_PARAMETER (wNotifyMsg);
|
||
UNREFERENCED_PARAMETER (hWndControl);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_WM_INITDIALOG (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
// LPARAM is the pointer to the structure used for the data source info
|
||
BOOL bReturn = TRUE;
|
||
PPDHI_DATA_SOURCE_INFO pInfo;
|
||
HCURSOR hOldCursor;
|
||
int nButton;
|
||
int nShowEdit;
|
||
int nShowBrowse;
|
||
int nShowRegBtn;
|
||
int nShowWbemBtn;
|
||
HWND hwndFocus;
|
||
LPWSTR szDisplayString;
|
||
|
||
UNREFERENCED_PARAMETER (wParam);
|
||
|
||
hOldCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
|
||
|
||
// must have a pointer to the information structure in the LPARAM
|
||
if (lParam == 0) {
|
||
SetLastError (PDH_INVALID_ARGUMENT);
|
||
EndDialog (hDlg, IDCANCEL);
|
||
goto INIT_EXIT;
|
||
}
|
||
|
||
pInfo = (PPDHI_DATA_SOURCE_INFO)lParam;
|
||
SetWindowLongPtrW (hDlg, DWLP_USER, (LONG_PTR)pInfo);
|
||
|
||
// initialize the dialog box settings
|
||
|
||
SendDlgItemMessageW (hDlg, IDC_LOG_FILE_EDIT, EM_LIMITTEXT,
|
||
(WPARAM)MAX_PATH-1, 0);
|
||
|
||
if (pInfo->dwFlags & PDHI_DATA_SOURCE_CURRENT_ACTIVITY) {
|
||
// check the correct radio button
|
||
nButton = IDC_PERF_REG;
|
||
nShowEdit = FALSE;
|
||
nShowBrowse = FALSE;
|
||
nShowRegBtn = TRUE;
|
||
nShowWbemBtn = TRUE;
|
||
hwndFocus = GetDlgItem(hDlg, IDC_PERF_REG);
|
||
} else if (pInfo->dwFlags & PDHI_DATA_SOURCE_LOG_FILE) {
|
||
// check the correct radio button
|
||
nButton = IDC_DATA_FROM_LOG_FILE;
|
||
nShowEdit = TRUE;
|
||
nShowBrowse = TRUE;
|
||
nShowRegBtn = FALSE;
|
||
nShowWbemBtn = FALSE;
|
||
// load log file to edit window
|
||
SendDlgItemMessageW (hDlg, IDC_LOG_FILE_EDIT, WM_SETTEXT,
|
||
(WPARAM)0, (LPARAM)pInfo->szDataSourceFile);
|
||
|
||
hwndFocus = GetDlgItem(hDlg, IDC_LOG_FILE_EDIT);
|
||
} else if (pInfo->dwFlags & PDHI_DATA_SOURCE_WBEM_NAMESPACE) {
|
||
// check the correct radio button
|
||
nButton = IDC_WBEM_NS;
|
||
nShowEdit = FALSE;
|
||
nShowBrowse = FALSE;
|
||
nShowRegBtn = TRUE;
|
||
nShowWbemBtn = TRUE;
|
||
// if the file name has a "WBEM:" in the front, then remove it
|
||
if (DataSourceTypeW(pInfo->szDataSourceFile) == DATA_SOURCE_WBEM) {
|
||
if (wcsncmp(pInfo->szDataSourceFile,
|
||
cszWBEM, lstrlenW(cszWBEM)) == 0) {
|
||
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWBEM)];
|
||
}
|
||
else {
|
||
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWMI)];
|
||
}
|
||
} else {
|
||
szDisplayString = &pInfo->szDataSourceFile[0];
|
||
}
|
||
hwndFocus = GetDlgItem(hDlg, IDC_WBEM_NS);
|
||
} else {
|
||
// invalid selection
|
||
SetLastError (PDH_INVALID_ARGUMENT);
|
||
EndDialog (hDlg, IDCANCEL);
|
||
goto INIT_EXIT;
|
||
}
|
||
|
||
if (nShowEdit) {
|
||
// if this isn't selected, then set it so that it acts like the
|
||
// default
|
||
CheckRadioButton (hDlg, IDC_PERF_REG, IDC_WBEM_NS,
|
||
IDC_PERF_REG);
|
||
CheckRadioButton (hDlg, IDC_CURRENT_ACTIVITY, IDC_DATA_FROM_LOG_FILE,
|
||
IDC_DATA_FROM_LOG_FILE);
|
||
} else {
|
||
CheckRadioButton (hDlg, IDC_CURRENT_ACTIVITY, IDC_DATA_FROM_LOG_FILE,
|
||
IDC_CURRENT_ACTIVITY);
|
||
CheckRadioButton (hDlg, IDC_PERF_REG, IDC_WBEM_NS,
|
||
nButton);
|
||
}
|
||
|
||
// disable the edit window and browser button
|
||
EnableWindow (GetDlgItem (hDlg, IDC_LOG_FILE_EDIT), nShowEdit);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LOG_FILES), nShowBrowse);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_PERF_REG), nShowRegBtn);
|
||
EnableWindow (GetDlgItem (hDlg, IDC_WBEM_NS), nShowWbemBtn);
|
||
|
||
SetFocus (hwndFocus);
|
||
bReturn = FALSE;
|
||
|
||
INIT_EXIT:
|
||
// restore Cursor
|
||
SetCursor (hOldCursor);
|
||
|
||
return bReturn;
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_WM_COMMAND (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
WORD wNotifyMsg;
|
||
|
||
wNotifyMsg = HIWORD(wParam);
|
||
|
||
switch (LOWORD(wParam)) { // select on the control ID
|
||
case IDOK:
|
||
return DataSrcDlg_OK (hDlg, wNotifyMsg, (HWND)lParam);
|
||
|
||
case IDCANCEL:
|
||
return DataSrcDlg_CANCEL (hDlg, wNotifyMsg, (HWND)lParam);
|
||
|
||
case IDC_HELP_BTN:
|
||
return DataSrcDlg_HELP_BTN (hDlg, wNotifyMsg, (HWND)lParam);
|
||
|
||
case IDC_BROWSE_LOG_FILES:
|
||
return DataSrcDlg_BROWSE_LOG_FILES (hDlg, wNotifyMsg, (HWND)lParam);
|
||
|
||
case IDC_CURRENT_ACTIVITY:
|
||
case IDC_DATA_FROM_LOG_FILE:
|
||
case IDC_PERF_REG:
|
||
case IDC_WBEM_NS:
|
||
return DataSrcDlg_RadioButton (hDlg, wNotifyMsg, LOWORD(wParam));
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_WM_SYSCOMMAND (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
|
||
switch (wParam) {
|
||
case SC_CLOSE:
|
||
EndDialog (hDlg, IDOK);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_WM_CLOSE (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hDlg);
|
||
UNREFERENCED_PARAMETER (wParam);
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
STATIC_BOOL
|
||
DataSrcDlg_WM_DESTROY (
|
||
IN HWND hDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
UNREFERENCED_PARAMETER (hDlg);
|
||
UNREFERENCED_PARAMETER (wParam);
|
||
UNREFERENCED_PARAMETER (lParam);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
INT_PTR
|
||
CALLBACK
|
||
DataSrcDlgProc (
|
||
IN HWND hDlg,
|
||
IN UINT message,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
{
|
||
INT iCtrlID;
|
||
BOOL bReturn = FALSE;
|
||
iCtrlID = GetDlgCtrlID ( (HWND) wParam );
|
||
|
||
switch (message) {
|
||
case WM_INITDIALOG:
|
||
return DataSrcDlg_WM_INITDIALOG (hDlg, wParam, lParam);
|
||
|
||
case WM_COMMAND:
|
||
return DataSrcDlg_WM_COMMAND (hDlg, wParam, lParam);
|
||
|
||
case WM_SYSCOMMAND:
|
||
return DataSrcDlg_WM_SYSCOMMAND (hDlg, wParam, lParam);
|
||
|
||
case WM_CLOSE:
|
||
return DataSrcDlg_WM_CLOSE (hDlg, wParam, lParam);
|
||
|
||
case WM_DESTROY:
|
||
return DataSrcDlg_WM_DESTROY (hDlg, wParam, lParam);
|
||
|
||
case WM_CONTEXTMENU:
|
||
{
|
||
if ( 0 != iCtrlID ) {
|
||
TCHAR pszHelpFilePath[MAX_PATH * 2];
|
||
UINT nLen;
|
||
|
||
nLen = GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH);
|
||
lstrcpy(&pszHelpFilePath[nLen], _T("\\help\\sysmon.hlp") );
|
||
|
||
|
||
bReturn = WinHelp(
|
||
(HWND) wParam,
|
||
pszHelpFilePath,
|
||
HELP_CONTEXTMENU,
|
||
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
|
||
}
|
||
|
||
return bReturn;
|
||
}
|
||
|
||
case WM_HELP:
|
||
{
|
||
|
||
// Only display help for known context IDs.
|
||
TCHAR pszHelpFilePath[MAX_PATH * 2];
|
||
UINT nLen;
|
||
LPHELPINFO pInfo = NULL;
|
||
pInfo = (LPHELPINFO)lParam;
|
||
|
||
nLen = GetWindowsDirectory(pszHelpFilePath, 2*MAX_PATH);
|
||
if ( nLen == 0 ) {
|
||
// Report error.
|
||
}
|
||
|
||
lstrcpy(&pszHelpFilePath[nLen], _T("\\help\\sysmon.hlp") );
|
||
if (pInfo->iContextType == HELPINFO_WINDOW){
|
||
bReturn = WinHelp (
|
||
pInfo->hItemHandle,
|
||
pszHelpFilePath,
|
||
HELP_WM_HELP,
|
||
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
|
||
}
|
||
|
||
return bReturn;
|
||
}
|
||
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
PDH_FUNCTION
|
||
PdhSelectDataSourceW (
|
||
IN HWND hWndOwner,
|
||
IN DWORD dwFlags,
|
||
IN LPWSTR szDataSource,
|
||
IN LPDWORD pcchBufferLength
|
||
)
|
||
{
|
||
PDHI_DATA_SOURCE_INFO dsInfo;
|
||
WCHAR wTest;
|
||
DWORD dwTest;
|
||
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
||
int nDlgBoxStatus;
|
||
LPWSTR szLocalPath;
|
||
DWORD dwLocalLength = 0;
|
||
|
||
// TODO post W2k1: PdhiBrowseDataSource should be in try_except
|
||
|
||
if ((szDataSource == NULL) || (pcchBufferLength == NULL))
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
else {
|
||
// test buffers and access
|
||
__try {
|
||
// test reading length buffer
|
||
dwLocalLength = *pcchBufferLength;
|
||
dwTest = dwLocalLength;
|
||
|
||
// try reading & writing to the first and last chars in the buffer
|
||
wTest = szDataSource[0];
|
||
szDataSource[0] = 0;
|
||
szDataSource[0] = wTest;
|
||
|
||
dwTest--;
|
||
wTest = szDataSource[dwTest];
|
||
szDataSource[dwTest] = 0;
|
||
szDataSource[dwTest] = wTest;
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
}
|
||
}
|
||
|
||
if (pdhStatus == ERROR_SUCCESS) {
|
||
szLocalPath = G_ALLOC ((dwLocalLength * sizeof(WCHAR)));
|
||
|
||
if (szLocalPath == NULL) {
|
||
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
||
} else {
|
||
// copy the caller's buffer to the local buffer
|
||
memcpy (&szLocalPath[0], szDataSource,
|
||
(dwLocalLength * sizeof(WCHAR)));
|
||
}
|
||
|
||
if (pdhStatus == ERROR_SUCCESS) {
|
||
if (dwFlags & PDH_FLAGS_FILE_BROWSER_ONLY) {
|
||
PdhiBrowseDataSource (
|
||
hWndOwner,
|
||
(LPVOID)szDataSource,
|
||
&dwLocalLength,
|
||
TRUE);
|
||
} else {
|
||
// show the selection dialog as well
|
||
if (*szDataSource == 0) {
|
||
// then using current activity
|
||
dsInfo.dwFlags = PDHI_DATA_SOURCE_CURRENT_ACTIVITY;
|
||
} else {
|
||
if (IsWbemDataSource (szDataSource)) {
|
||
dsInfo.dwFlags = PDHI_DATA_SOURCE_WBEM_NAMESPACE;
|
||
} else {
|
||
dsInfo.dwFlags = PDHI_DATA_SOURCE_LOG_FILE;
|
||
}
|
||
}
|
||
dsInfo.szDataSourceFile = szLocalPath;
|
||
dsInfo.cchBufferLength = dwLocalLength;
|
||
|
||
// call dialog box
|
||
nDlgBoxStatus = (INT)DialogBoxParamW (
|
||
(HINSTANCE)ThisDLLHandle,
|
||
MAKEINTRESOURCEW (IDD_DATA_SOURCE),
|
||
hWndOwner,
|
||
DataSrcDlgProc,
|
||
(LPARAM)&dsInfo);
|
||
|
||
if (nDlgBoxStatus == IDOK) {
|
||
pdhStatus = ERROR_SUCCESS;
|
||
dwLocalLength = dsInfo.cchBufferLength;
|
||
__try {
|
||
memcpy (szDataSource, &szLocalPath[0],
|
||
(dwLocalLength * sizeof(WCHAR)));
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
}
|
||
} // else, leave the caller's buffer alone
|
||
}
|
||
|
||
if (pdhStatus == ERROR_SUCCESS) {
|
||
__try {
|
||
*pcchBufferLength = dwLocalLength;
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (szLocalPath != NULL) {
|
||
G_FREE (szLocalPath);
|
||
}
|
||
}
|
||
return pdhStatus;
|
||
}
|
||
|
||
PDH_FUNCTION
|
||
PdhSelectDataSourceA (
|
||
IN HWND hWndOwner,
|
||
IN DWORD dwFlags,
|
||
IN LPSTR szDataSource,
|
||
IN LPDWORD pcchBufferLength
|
||
)
|
||
{
|
||
CHAR cTest;
|
||
DWORD dwTest;
|
||
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
||
LPWSTR szWideBuffer;
|
||
DWORD dwLocalLength = 0;
|
||
|
||
// TODO post W2k1: PdhiBrowseDataSource should be in try_except
|
||
|
||
if ((szDataSource == NULL) || (pcchBufferLength == NULL))
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
else {
|
||
// test buffers and access
|
||
__try {
|
||
// test reading length buffer
|
||
dwLocalLength = *pcchBufferLength;
|
||
dwTest = dwLocalLength;
|
||
|
||
// try reading & writing to the first and last chars in the buffer
|
||
cTest = szDataSource[0];
|
||
szDataSource[0] = 0;
|
||
szDataSource[0] = cTest;
|
||
|
||
dwTest--;
|
||
cTest = szDataSource[dwTest];
|
||
szDataSource[dwTest] = 0;
|
||
szDataSource[dwTest] = cTest;
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
}
|
||
}
|
||
|
||
if (pdhStatus == ERROR_SUCCESS) {
|
||
if (dwFlags & PDH_FLAGS_FILE_BROWSER_ONLY) {
|
||
PdhiBrowseDataSource (
|
||
hWndOwner,
|
||
(LPVOID)szDataSource,
|
||
& dwLocalLength,
|
||
FALSE);
|
||
} else {
|
||
// allocate a temporary bufer and convert the ANSI string to a wide
|
||
szWideBuffer = G_ALLOC ((dwLocalLength * sizeof(WCHAR)));
|
||
if (szWideBuffer != NULL) {
|
||
MultiByteToWideChar(_getmbcp(),
|
||
0,
|
||
szDataSource,
|
||
lstrlenA(szDataSource),
|
||
(LPWSTR) szWideBuffer,
|
||
dwLocalLength);
|
||
pdhStatus = PdhSelectDataSourceW (
|
||
hWndOwner, dwFlags, szWideBuffer, &dwLocalLength);
|
||
if (pdhStatus == ERROR_SUCCESS) {
|
||
// if a null string was returned, then set the argument
|
||
// to null since the conversion routine will not convert
|
||
// a null wide string to a null ansi string.
|
||
if (*szWideBuffer == 0) {
|
||
*szDataSource = 0;
|
||
} else {
|
||
pdhStatus = PdhiConvertUnicodeToAnsi(_getmbcp(),
|
||
szWideBuffer, szDataSource, & dwLocalLength);
|
||
}
|
||
}
|
||
G_FREE (szWideBuffer);
|
||
} else {
|
||
// unable to allocate temporary buffer
|
||
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
||
}
|
||
}
|
||
|
||
if (pdhStatus == ERROR_SUCCESS || pdhStatus == PDH_MORE_DATA) {
|
||
__try {
|
||
*pcchBufferLength = dwLocalLength;
|
||
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
||
pdhStatus = PDH_INVALID_ARGUMENT;
|
||
}
|
||
}
|
||
}
|
||
return pdhStatus;
|
||
}
|