Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

188 lines
5.2 KiB

#include <windows.h>
#include <objbase.h>
#include <atlbase.h>
#include <wianew.h>
#include <simreg.h>
#include <dumpprop.h>
#include <devlist.h>
#include <simbstr.h>
#include <stdio.h>
void DumpDevice( IWiaDevMgr *pWiaDevMgr, HANDLE hFile, const CSimpleStringWide &strDeviceID )
{
//
// Create the device manager
//
fprintf( stderr, "Creating [%ls]\n", strDeviceID.String() );
CComPtr<IWiaItem> pWiaItem;
HRESULT hr = pWiaDevMgr->CreateDevice( CSimpleBStr(strDeviceID), &pWiaItem );
if (SUCCEEDED(hr))
{
CSimpleStringWide strDeviceName;
PropStorageHelpers::GetProperty( pWiaItem, WIA_DIP_DEV_NAME, strDeviceName );
CWiaDebugDumpToFileHandle DebugDump( hFile );
DebugDump.Print( TEXT("") );
DebugDump.Print( CSimpleString().Format( TEXT("Device: %ws"), strDeviceName.String() ) );
DebugDump.Print( TEXT("===============================================") );
DebugDump.DumpRecursive(pWiaItem);
}
}
bool GetStringArgument( int argc, wchar_t *argv[], CSimpleString &strArgument, int &nCurrArg )
{
bool bResult = true;
if (lstrlenW(argv[nCurrArg]) > 2)
{
if (argv[nCurrArg][2] == L':')
{
strArgument = argv[nCurrArg] + 3;
}
else
{
strArgument = argv[nCurrArg] + 2;
}
}
else if (nCurrArg < argc-1)
{
strArgument = argv[++nCurrArg];
}
else bResult = false;
return bResult;
}
bool ParseArguments( int argc, wchar_t *argv[], CSimpleDynamicArray<CSimpleString> &DeviceIDs, CSimpleString &strOutputFile, bool &bHidden )
{
int nCurrArg = 1;
while (nCurrArg < argc)
{
if (argv[nCurrArg][0] == L'-')
{
switch (argv[nCurrArg][1])
{
case 'd':
{
CSimpleString strArg;
if (GetStringArgument( argc, argv, strArg, nCurrArg ))
{
DeviceIDs.Append(strArg);
}
}
break;
case 'o':
{
CSimpleString strArg;
if (GetStringArgument( argc, argv, strArg, nCurrArg ))
{
strOutputFile = strArg;
}
}
break;
case 'h':
{
bHidden = true;
}
break;
}
}
nCurrArg++;
}
return true;
}
class CCoInitialize
{
private:
HRESULT m_hr;
private:
CCoInitialize( const CCoInitialize & );
CCoInitialize &operator=( const CCoInitialize & );
public:
CCoInitialize()
{
m_hr = CoInitialize(NULL);
}
~CCoInitialize()
{
if (SUCCEEDED(m_hr))
{
CoUninitialize();
}
}
HRESULT Result(void) const
{
return m_hr;
}
};
int __cdecl wmain( int argc, wchar_t *argv[] )
{
CSimpleDynamicArray<CSimpleString> DeviceIDs;
CSimpleString strOutputFile;
bool bHidden = false;
if (ParseArguments(argc,argv,DeviceIDs,strOutputFile,bHidden))
{
HANDLE hFile = INVALID_HANDLE_VALUE;
if (strOutputFile.Length())
{
hFile = CreateFile( strOutputFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
}
else
{
hFile = GetStdHandle(STD_OUTPUT_HANDLE);
}
if (INVALID_HANDLE_VALUE != hFile)
{
//
// Initialize COM
//
CCoInitialize coinit;
if (SUCCEEDED(coinit.Result()))
{
//
// Create the device manager
//
CComPtr<IWiaDevMgr> pWiaDevMgr;
HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr );
if (SUCCEEDED(hr))
{
if (DeviceIDs.Size())
{
for (int i=0;i<DeviceIDs.Size();i++)
{
DumpDevice( pWiaDevMgr, hFile, CSimpleStringConvert::WideString(DeviceIDs[i]) );
}
}
else
{
CDeviceList DeviceList(pWiaDevMgr,StiDeviceTypeDefault,bHidden ? 0xFFFFFFFF : 0);
for (int i=0;i<DeviceList.Size();i++)
{
CSimpleStringWide strDeviceID;
if (PropStorageHelpers::GetProperty( DeviceList[i], WIA_DIP_DEV_ID, strDeviceID ))
{
DumpDevice( pWiaDevMgr, hFile, CSimpleStringConvert::WideString(strDeviceID) );
}
else
{
fprintf( stderr, "Unable to get the device ID\n" );
}
}
}
}
}
}
else
{
fprintf( stderr, "Unable to open %ls for writing\n", strOutputFile.String() );
}
}
return 0;
}