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.
715 lines
22 KiB
715 lines
22 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 "mbctype.h"
|
|
#include "strsafe.h"
|
|
#include <pdh.h>
|
|
#include "pdhidef.h"
|
|
#include "pdhdlgs.h"
|
|
#include "pdhmsg.h"
|
|
#include "strings.h"
|
|
#include "browsdlg.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(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
WORD wCtrlId
|
|
)
|
|
{
|
|
int nShowEdit = FALSE;
|
|
int nShowBrowseBtn = FALSE;
|
|
int nShowRegBtn = FALSE;
|
|
int nShowWbemBtn = FALSE;
|
|
BOOL bReturn = 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:
|
|
bReturn = TRUE;
|
|
break;
|
|
}
|
|
if (! bReturn) {
|
|
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);
|
|
bReturn = TRUE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_BROWSE_LOG_FILES(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
{
|
|
LPWSTR szEditBoxString = NULL;
|
|
DWORD cchStringLen = SMALL_BUFFER_SIZE;
|
|
|
|
szEditBoxString = G_ALLOC(cchStringLen * sizeof(WCHAR));
|
|
if (szEditBoxString != NULL) {
|
|
// get the current filename
|
|
SendDlgItemMessageW(hDlg,
|
|
IDC_LOG_FILE_EDIT,
|
|
WM_GETTEXT,
|
|
(WPARAM) cchStringLen,
|
|
(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);
|
|
}
|
|
}
|
|
}
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_OK(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
PPDHI_DATA_SOURCE_INFO pInfo;
|
|
HCURSOR hOldCursor;
|
|
DWORD dwFileNameLength;
|
|
BOOL bReturn = FALSE;
|
|
|
|
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) {
|
|
StringCchCopyW(pInfo->szDataSourceFile, pInfo->cchBufferLength, cszWMI);
|
|
pInfo->cchBufferLength = dwFileNameLength;
|
|
}
|
|
else {
|
|
// buffer is too small for the file name
|
|
// so return the required size but no string
|
|
* pInfo->szDataSourceFile = L'\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 = L'\0';
|
|
pInfo->cchBufferLength = 0;
|
|
}
|
|
}
|
|
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 = L'\0';
|
|
pInfo->cchBufferLength = dwFileNameLength;
|
|
}
|
|
}
|
|
SetCursor(hOldCursor);
|
|
EndDialog(hDlg, IDOK);
|
|
}
|
|
else {
|
|
// unable to locate data block so no data can be returned.
|
|
EndDialog(hDlg, IDCANCEL);
|
|
}
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_CANCEL(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
|
|
switch (wNotifyMsg) {
|
|
case BN_CLICKED:
|
|
EndDialog(hDlg, IDCANCEL);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_HELP_BTN(
|
|
HWND hDlg,
|
|
WORD wNotifyMsg,
|
|
HWND hWndControl
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
UNREFERENCED_PARAMETER(wNotifyMsg);
|
|
UNREFERENCED_PARAMETER(hWndControl);
|
|
return FALSE;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_WM_INITDIALOG(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
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 (pInfo->szDataSourceFile[1] == L'B' || pInfo->szDataSourceFile[1] == L'b') {
|
|
// szDataSource begins with "WBEM:"
|
|
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWBEM)];
|
|
}
|
|
else {
|
|
// szDataSource begins with "WMI:"
|
|
szDisplayString = & pInfo->szDataSourceFile[lstrlenW(cszWMI)];
|
|
}
|
|
}
|
|
else {
|
|
szDisplayString = pInfo->szDataSourceFile;
|
|
}
|
|
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(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
WORD wNotifyMsg = HIWORD(wParam);
|
|
|
|
switch (LOWORD(wParam)) { // select on the control ID
|
|
case IDOK:
|
|
bReturn = DataSrcDlg_OK (hDlg, wNotifyMsg, (HWND)lParam);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
bReturn = DataSrcDlg_CANCEL (hDlg, wNotifyMsg, (HWND)lParam);
|
|
break;
|
|
|
|
case IDC_HELP_BTN:
|
|
bReturn = DataSrcDlg_HELP_BTN (hDlg, wNotifyMsg, (HWND)lParam);
|
|
break;
|
|
|
|
case IDC_BROWSE_LOG_FILES:
|
|
bReturn = DataSrcDlg_BROWSE_LOG_FILES (hDlg, wNotifyMsg, (HWND)lParam);
|
|
break;
|
|
|
|
case IDC_CURRENT_ACTIVITY:
|
|
case IDC_DATA_FROM_LOG_FILE:
|
|
case IDC_PERF_REG:
|
|
case IDC_WBEM_NS:
|
|
bReturn = DataSrcDlg_RadioButton (hDlg, wNotifyMsg, LOWORD(wParam));
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_WM_SYSCOMMAND(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
|
|
switch (wParam) {
|
|
case SC_CLOSE:
|
|
EndDialog(hDlg, IDOK);
|
|
bReturn = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_WM_CLOSE(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
return TRUE;
|
|
}
|
|
|
|
STATIC_BOOL
|
|
DataSrcDlg_WM_DESTROY(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(hDlg);
|
|
UNREFERENCED_PARAMETER(wParam);
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DataSrcDlgProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bReturn = FALSE;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
bReturn = DataSrcDlg_WM_INITDIALOG(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
bReturn = DataSrcDlg_WM_COMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
bReturn = DataSrcDlg_WM_SYSCOMMAND(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
bReturn = DataSrcDlg_WM_CLOSE(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
bReturn = DataSrcDlg_WM_DESTROY(hDlg, wParam, lParam);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
INT iCtrlID = GetDlgCtrlID((HWND) wParam);
|
|
if (0 != iCtrlID) {
|
|
LPWSTR pszHelpFilePath = NULL;
|
|
DWORD dwLen = 2 * (MAX_PATH + 1);
|
|
|
|
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
|
|
if (pszHelpFilePath != NULL) {
|
|
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
|
|
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
|
|
bReturn = WinHelpW((HWND) wParam,
|
|
pszHelpFilePath,
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
|
|
}
|
|
G_FREE(pszHelpFilePath);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
LPWSTR pszHelpFilePath = NULL;
|
|
DWORD dwLen = 2 * (MAX_PATH + 1);
|
|
LPHELPINFO pInfo = (LPHELPINFO) lParam;
|
|
|
|
if (pInfo->iContextType == HELPINFO_WINDOW) {
|
|
pszHelpFilePath = G_ALLOC(dwLen * sizeof(WCHAR));
|
|
if (pszHelpFilePath != NULL) {
|
|
if (GetWindowsDirectoryW(pszHelpFilePath, dwLen) > 0) {
|
|
StringCchCatW(pszHelpFilePath, dwLen, L"\\help\\sysmon.hlp");
|
|
bReturn = WinHelpW((HWND) wParam,
|
|
pszHelpFilePath,
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR) PdhiDatasrcaulControlIdToHelpIdMap);
|
|
}
|
|
G_FREE(pszHelpFilePath);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
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] = L'\0';
|
|
szDataSource[0] = wTest;
|
|
|
|
dwTest --;
|
|
wTest = szDataSource[dwTest];
|
|
szDataSource[dwTest] = L'\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
|
|
StringCchCopyW(szLocalPath, dwLocalLength, szDataSource);
|
|
}
|
|
|
|
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 {
|
|
StringCchCopyW(szDataSource, dwLocalLength, szLocalPath);
|
|
}
|
|
__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;
|
|
}
|
|
}
|
|
}
|
|
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 = PdhiMultiByteToWideChar(_getmbcp(), szDataSource);
|
|
if (szWideBuffer != NULL) {
|
|
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 == L'\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;
|
|
}
|