windows-nt/Source/XPSP1/NT/sdktools/pdh/pdhui/datasrc.c
2020-09-26 16:20:57 +08:00

697 lines
21 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}