Leaked source code of windows server 2003
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.
 
 
 
 
 
 

126 lines
3.7 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>
typedef HANDLE (WINAPI *WiaAddDeviceProc)();
typedef BOOL (WINAPI *WiaRemoveDeviceProc)(STI_DEVICE_INFORMATION *);
HINSTANCE g_hInstance;
bool RemoveDevice( LPCWSTR pszDeviceId )
{
bool bResult = false;
CComPtr<IStillImage> pStillImage;
if (SUCCEEDED(StiCreateInstance( g_hInstance, STI_VERSION, &pStillImage, NULL)) && pStillImage)
{
HINSTANCE hClassInstaller = LoadLibrary(TEXT("sti_ci.dll"));
if (hClassInstaller)
{
WiaRemoveDeviceProc pfnWiaRemoveDeviceProc = reinterpret_cast<WiaRemoveDeviceProc>(GetProcAddress(hClassInstaller, "WiaRemoveDevice"));
if (pfnWiaRemoveDeviceProc)
{
STI_DEVICE_INFORMATION *pStiDeviceInformation = NULL;
if (SUCCEEDED(pStillImage->GetDeviceInfo( const_cast<LPWSTR>(pszDeviceId), reinterpret_cast<LPVOID*>(&pStiDeviceInformation))) && pStiDeviceInformation )
{
bResult = (pfnWiaRemoveDeviceProc( pStiDeviceInformation ) != FALSE);
if (!bResult)
{
wprintf( L"WiaRemoveDeviceProc failed\n");
}
LocalFree(pStiDeviceInformation);
}
else
{
wprintf( L"GetDeviceInfo on %ws failed\n", pszDeviceId );
}
}
else
{
wprintf( L"GetProcAddress on WiaRemoveDeviceProc failed\n");
}
FreeLibrary( hClassInstaller );
}
else
{
wprintf( L"LoadLibrary failed\n");
}
}
else
{
wprintf( L"StiCreateInstance failed\n");
}
return bResult;
}
void RemoveAllDevices()
{
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
CComPtr<IWiaDevMgr> pWiaDevMgr;
if (SUCCEEDED(CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr )))
{
CDeviceList DeviceList( pWiaDevMgr );
for (int i=0;i<DeviceList.Size();++i)
{
CSimpleStringWide strwDeviceId;
if (PropStorageHelpers::GetProperty( DeviceList[i], WIA_DIP_DEV_ID, strwDeviceId ))
{
CSimpleStringWide strwDeviceName;
PropStorageHelpers::GetProperty( DeviceList[i], WIA_DIP_DEV_NAME, strwDeviceName );
wprintf( L"Removing %ws -- %ws\n", strwDeviceId.String(), strwDeviceName.String() );
wprintf( L"%ws\n", RemoveDevice( strwDeviceId ) ? L"succeeded" : L"failed" );
}
}
}
}
CoUninitialize();
}
int __cdecl wmain( int argc, wchar_t *argv[] )
{
g_hInstance = GetModuleHandle(NULL);
WIA_DEBUG_CREATE(g_hInstance);
bool bRemove = false;
for (int i=1;i<argc;i++)
{
if (L'/' == argv[i][0] || L'-' == argv[i][0])
{
switch (argv[i][1])
{
case L'y':
case L'Y':
bRemove = true;
break;
}
}
}
if (!bRemove)
{
wprintf( L"Do you want to remove all of your WIA devices? (y/n): " );
int chResponse = getchar();
if (L'y' == chResponse || L'Y' == chResponse)
{
bRemove = true;
}
}
if (bRemove)
{
RemoveAllDevices();
}
return 0;
}