mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
696 lines
21 KiB
696 lines
21 KiB
/*++
|
|
|
|
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;
|
|
}
|