windows-nt/Source/XPSP1/NT/shell/osshell/snapins/devmgr/snapin/api.h
2020-09-26 16:20:57 +08:00

543 lines
13 KiB
C++

#ifndef __API_H__
#define __API_H__
/*++
Copyright (C) 1997-1999 Microsoft Corporation
Module Name:
api.h
Abstract:
header file for api.cpp
Note that no other file can #include "api.h" because the file contains
definitions, not just declarations.
Author:
William Hsieh (williamh) created
Revision History:
--*/
// Exported APIs
// This function launches Device Manager as a separate process.
// This function is provided for any application who wants to
// launch Device Manager but do not want to know the detail about
// MMC.
//
// INPUT: HWND hwndParent -- the Window Handle of the caller.
// HINSTANCE hInstance -- The caller's module instance handle
// LPCTSTR lpMachineName -- optional machine name. NULL for local machine.
// int nCmdShow -- controlling how the Device Manager window
// to be shown. Refer to Windows API
// reference manual for detail.
// OUTPUT: TRUE if the process is created successfully.
// FALSE if the process is not created. Use GetLastError()
// API to retreive error code.
BOOL
DeviceManager_ExecuteA(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCSTR lpMachineName,
int nCmdShow
);
STDAPI_(BOOL)
DeviceManager_ExecuteW(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCWSTR lpMachineName,
int nCmdShow
);
BOOL
DeviceManager_Execute(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCTSTR lpMachineName,
int nCmdShow
);
// This API parses the given command line, creates a property sheet
// for the device ID specified in the command line and
// displays the property sheet.
//
// The command line syntax is:
// /deviceid <DeviceID> [/machinename <Machine Name>] [/showdevicetree]
//
// <DeviceID> specifiec the target device
// <MachineName> specifies the optional computer name.
// ShowDeviceTree, if specifies indicates that device tree should be displayed.
//
STDAPI_(void)
DeviceProperties_RunDLLA(
HWND hwndStub,
HINSTANCE hAppInstance,
LPSTR lpCmdLine,
int nCmdShow
);
STDAPI_(void)
DeviceProperties_RunDLLW(
HWND hwndStub,
HINSTANCE hAppInstance,
LPWSTR lpCmdLine,
int nCmdShow
);
// This function creates and display a property sheet for the given device
// if a valid device id is given. It can also display the device tree
// in the same time(with or without property sheet display).
//
// INPUT: HWND hwndParent -- the Window Handle of the caller.
// LPCTSTR MachineName -- optional machine name. If not specified
// local machine is used.
// LPCTSTR DeviceId -- the device ID. Must be provided if
// ShowDeviceTree is FALSE, otherwise,
// this function returns 0 and the last
// error is ERROR_INVALID_PARAMETER
// DWORD Flags --
// BOOL ShowDeviceTree -- TRUE if to shwo device tree
// OUTPUT:
// 0 if error, call GetLastError API to retrieve the error code.
// 1 if succeeded.
// This function will not return to the caller until the property
// sheet(or the device tree, if requested) dismissed.
STDAPI_(int)
DevicePropertiesExA(
HWND hwndParent,
LPCSTR MachineName,
LPCSTR DeviceID,
DWORD Flags,
BOOL ShowDeviceTree
);
STDAPI_(int)
DevicePropertiesExW(
HWND hwndParent,
LPCWSTR MachineName,
LPCWSTR DeviceID,
DWORD Flags,
BOOL ShowDeviceTree
);
STDAPI_(int)
DevicePropertiesA(
HWND hwndParent,
LPCSTR MachineName,
LPCSTR DeviceID,
BOOL ShowDeviceTree
);
STDAPI_(int)
DevicePropertiesW(
HWND hwndParent,
LPCWSTR MachineName,
LPCWSTR DeviceID,
BOOL ShowDeviceTree
);
//
// DevicePropertiesEx Flags
//
#define DEVPROP_SHOW_RESOURCE_TAB 0x00000001
#define DEVPROP_LAUNCH_TROUBLESHOOTER 0x00000002
#define DEVPROP_BITS 0x00000003
// This function returns the appropriate problem text based on the given
// device and problem number.
//
// INPUT: HMACHINE hMachine -- Machine handle, NULL for local machine
// DEVNODE DevNode -- The device. This paramter is required.
// ULONG ProblemNumber -- The CM problem number
// LPTSTR Buffer -- Buffer to receive the text.
// UINT BufferSize -- Buffer size in chars
// OUTPUT:
// 0 if the function failed. Call GetLastError API to retreive the
// error code.
// <> 0 The required buffer size in chars to receive the text.
// not including the NULL termianted char.
// The caller should check this value to decide it has provided
// enough buffer. ERROR_INSUFFICIENT_BUFFER is not set
// in this function
STDAPI_(UINT)
DeviceProblemTextA(
HMACHINE hMachine,
DEVNODE DevNode,
ULONG ProblemNumber,
LPSTR Buffer,
UINT BufferSize
);
STDAPI_(UINT)
DeviceProblemTextW(
HMACHINE hMachine,
DEVNODE DevNode,
ULONG ProblemNumber,
LPWSTR Buffer,
UINT BufferSize
);
// This function prints the machine's hardware report
//
// INPUT: LPCTSTR MachineName -- The machine name. NULL for local machine
// LPCTSTR FileName -- The file name to which the report
// will be written to. If the file already
// exist, this function return FALSE.
// The caller should delete the file and
// call the function again.
// int ReportType -- 0 -- print system summary
// 1 -- print selected classes
// 2 -- print all
// DWORD ClassGuids -- number of class guid are in ClassGuidList
// Only required if ReportType is 1
// LPGUID ClassGuidList -- class guid list. Only required if
// ReportType is 1.
// OUTPUT:
// TRUE if the function succeeded.
// FLASE if the function failed. GetLastError() returns the error code
//
//
//
// error code.
// <> 0 The required buffer size in chars to receive the text.
// not including the NULL termianted char.
// The caller should check this value to decide it has provided
// enough buffer. ERROR_INSUFFICIENT_BUFFER is not set
// in this function
STDAPI_(BOOL)
DeviceManagerPrintA(
LPCSTR MachineName,
LPCSTR FileName,
int ReportType,
DWORD ClassGuids,
LPGUID ClassGuidList
);
STDAPI_(BOOL)
DeviceManagerPrintW(
LPCWSTR MachineName,
LPCWSTR FileName,
int ReportType,
DWORD ClassGuids,
LPGUID ClassGuidList
);
BOOL
DeviceManagerDoPrint(
LPCTSTR MachineName,
LPCTSTR FileName,
int ReportType,
DWORD ClassGuids,
LPGUID ClassGuidList
);
//////////////////////////////////////////////////////////////////////////
////////
////////
///////
const TCHAR* MMC_FILE = TEXT("mmc.exe");
const TCHAR* DEVMGR_MSC_FILE = TEXT("devmgmt.msc");
const TCHAR* MMC_COMMAND_LINE = TEXT(" /s ");
const TCHAR* DEVMGR_MACHINENAME_OPTION = TEXT(" /dmmachinename %s");
const TCHAR* DEVMGR_DEVICEID_OPTION = TEXT(" /dmdeviceid %s");
const TCHAR* DEVMGR_COMMAND_OPTION = TEXT(" /dmcommand %s");
const TCHAR* DEVMGR_CMD_PROPERTY = TEXT("property");
const TCHAR* RUNDLL_MACHINENAME = TEXT("machinename");
const TCHAR* RUNDLL_DEVICEID = TEXT("deviceid");
const TCHAR* RUNDLL_SHOWDEVICETREE = TEXT("showdevicetree");
const TCHAR* RUNDLL_FLAGS = TEXT("flags");
void
ReportCmdLineError(
HWND hwndParent,
int ErrorStringID,
LPCTSTR Caption = NULL
);
BOOL AddPageCallback(
HPROPSHEETPAGE hPage,
LPARAM lParam
);
int
PropertyRunDeviceTree(
HWND hwndParent,
LPCTSTR MachineName,
LPCTSTR DeviceID
);
int
DevicePropertiesEx(
HWND hwndParent,
LPCTSTR MachineName,
LPCTSTR DeviceID,
DWORD Flags,
BOOL ShowDeviceTree
);
void
DeviceProperties_RunDLL(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCTSTR lpCmdLine,
int nCmdShow
);
int
DeviceAdvancedPropertiesA(
HWND hwndParent,
LPCSTR MachineName,
LPCSTR DeviceId
);
STDAPI_(int)
DeviceAdvancedPropertiesW(
HWND hwndParent,
LPCWSTR MachineName,
LPCWSTR DeviceId
);
int
DeviceAdvancedProperties(
HWND hwndParent,
LPCTSTR MachineName,
LPCTSTR DeviceId
);
void
DeviceProblenWizard_RunDLLA(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCTSTR lpCmdLine,
int nCmdShow
);
void
DeviceProblenWizard_RunDLLW(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCTSTR lpCmdLine,
int nCmdShow
);
void
DeviceProblenWizard_RunDLL(
HWND hwndStub,
HINSTANCE hAppInstance,
LPCTSTR lpCmdLine,
int nCmdShow
);
// This function brings up the troubleshooter for the specified
// DeviceId.
//
// INPUT: HWND hwndParent -- the Window Handle of the caller.
// LPCTSTR MachineName -- optional machine name. If not specified
// local machine is used.
// LPCTSTR DeviceId -- the device ID. Must be provided.
// OUTPUT:
// 0 if error, call GetLastError API to retrieve the error code.
// 1 if succeeded.
STDAPI_(int)
DeviceProblemWizardA(
HWND hwndParent,
LPCSTR MachineName,
LPCSTR DeviceId
);
STDAPI_(int)
DeviceProblemWizardW(
HWND hwndParent,
LPCWSTR MachineName,
LPCWSTR DeviceId
);
int
DeviceProblemWizard(
HWND hwndParent,
LPCTSTR MachineName,
LPCTSTR DeviceId
);
// Object to parse command line passed in the lpCmdLine parameter
// passed in DeviceProperties_RunDLL APIs
//
class CRunDLLCommandLine : public CCommandLine
{
public:
CRunDLLCommandLine() : m_ShowDeviceTree(FALSE), m_Flags(0), m_WaitMachineName(FALSE),
m_WaitDeviceID(FALSE), m_WaitFlags(FALSE)
{}
virtual void ParseParam(LPCTSTR Param, BOOL bFlag, BOOL bLast)
{
if (bFlag)
{
if (!lstrcmpi(RUNDLL_MACHINENAME, Param))
{
m_WaitMachineName = TRUE;
}
if (!lstrcmpi(RUNDLL_DEVICEID, Param))
{
m_WaitDeviceID = TRUE;
}
if (!lstrcmpi(RUNDLL_SHOWDEVICETREE, Param))
{
m_ShowDeviceTree = TRUE;
}
if (!lstrcmpi(RUNDLL_FLAGS, Param)) {
m_WaitFlags = TRUE;
}
}
else
{
if (m_WaitMachineName)
{
m_strMachineName = Param;
m_WaitMachineName = FALSE;
}
if (m_WaitDeviceID)
{
m_strDeviceID = Param;
m_WaitDeviceID = FALSE;
}
if (m_WaitFlags) {
m_Flags = (DWORD)StrToInt(Param);
m_WaitFlags = FALSE;
}
}
}
LPCTSTR GetMachineName()
{
return (m_strMachineName.IsEmpty()) ? NULL : (LPCTSTR)m_strMachineName;
}
LPCTSTR GetDeviceID()
{
return (m_strDeviceID.IsEmpty()) ? NULL : (LPCTSTR)m_strDeviceID;
}
BOOL ToShowDeviceTree()
{
return m_ShowDeviceTree;
}
DWORD GetFlags()
{
return m_Flags;
}
private:
BOOL m_WaitMachineName;
BOOL m_WaitDeviceID;
BOOL m_WaitFlags;
String m_strDeviceID;
String m_strMachineName;
BOOL m_ShowDeviceTree;
DWORD m_Flags;
};
//
// Object to return the corresponding LPTSTR for the given
// string.
//
class CTString
{
public:
CTString(LPCWSTR pWString);
CTString(LPCSTR pString);
~CTString()
{
if (m_Allocated && m_pTString)
{
delete [] m_pTString;
}
}
operator LPCTSTR()
{
return (LPCTSTR)m_pTString;
}
private:
LPTSTR m_pTString;
BOOL m_Allocated;
};
CTString::CTString(
LPCWSTR pWString
)
{
m_pTString = NULL;
m_Allocated = FALSE;
#ifdef UNICODE
m_pTString = (LPTSTR)pWString;
#else
int wLen = pWString ? wcslen(pWString) : 0;
if (wLen)
{
int tLen;
tLen = WideCharToMultiByte(CP_ACP, 0, pWString, wLen, NULL, 0, NULL, NULL);
if (tLen)
{
m_pTString = new TCHAR[tLen + 1];
WideCharToMultiByte(CP_ACP, 0, pWString, wLen, m_pTString, tLen, NULL, NULL);
m_pTString[tLen] = _T('\0');
}
m_Allocated = TRUE;
}
#endif
}
CTString::CTString(
LPCSTR pAString
)
{
m_pTString = NULL;
m_Allocated = FALSE;
#ifndef UNICODE
m_pTString = (LPTSTR)pAString;
#else
int aLen = pAString ? strlen(pAString) : 0;
if (aLen)
{
int tLen;
tLen = MultiByteToWideChar(CP_ACP, 0, pAString, aLen, NULL, 0);
if (tLen)
{
m_pTString = new TCHAR[tLen + 1];
MultiByteToWideChar(CP_ACP, 0, pAString, aLen, m_pTString, tLen);
m_pTString[tLen] = _T('\0');
}
m_Allocated = TRUE;
}
#endif
}
#endif // __API_H__