windows-nt/Source/XPSP1/NT/enduser/windows.com/wuv3/cdm/cdmau/cdmau.cpp
2020-09-26 16:20:57 +08:00

238 lines
7.5 KiB
C++

#include <iostream>
using namespace std;
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdarg.h>
#include <setupapi.h>
#include <objbase.h>
#include <shlwapi.h>
#include <wustl.h>
#include <download.h>
#include "..\cdm.h"
void usage();
void SimulateAU();
void FindUpdate(PDOWNLOADINFO pinfo);
void DownloadUpdate(PDOWNLOADINFO pinfo);
void __cdecl main(int argc, char *argv[])
{
DOWNLOADINFO info;
ZeroMemory(&info, sizeof(info));
info.dwDownloadInfoSize = sizeof(DOWNLOADINFO);
info.dwArchitecture = PROCESSOR_ARCHITECTURE_UNKNOWN;
if ( 2 == argc && 0 == lstrcmpi(argv[1], "SimulateAU") )
{
SimulateAU();
}
else if ( 4 == argc && 0 == lstrcmpi(argv[1], "FindUpdate") && 0 == lstrcmpi(argv[2], "devinst") )
{
WCHAR wszParam[2048];
MultiByteToWideChar(CP_ACP, 0, argv[3], -1, wszParam, 2048);
info.lpDeviceInstanceID = wszParam;
FindUpdate(&info);
}
else if ( 4 == argc && 0 == lstrcmpi(argv[1], "FindUpdate") && 0 == lstrcmpi(argv[2], "hwid") )
{
WCHAR wszParam[2048];
MultiByteToWideChar(CP_ACP, 0, argv[3], -1, wszParam, 2048);
info.lpHardwareIDs = wszParam;
FindUpdate(&info);
}
else if ( 4 == argc && 0 == lstrcmpi(argv[1], "DownloadUpdate") && 0 == lstrcmpi(argv[2], "devinst") )
{
WCHAR wszParam[2048];
MultiByteToWideChar(CP_ACP, 0, argv[3], -1, wszParam, 2048);
info.lpDeviceInstanceID = wszParam;
DownloadUpdate(&info);
}
else if ( 4 == argc && 0 == lstrcmpi(argv[1], "DownloadUpdate") && 0 == lstrcmpi(argv[2], "hwid") )
{
WCHAR wszParam[2048];
MultiByteToWideChar(CP_ACP, 0, argv[3], -1, wszParam, 2048);
info.lpHardwareIDs = wszParam;
DownloadUpdate(&info);
}
else
{
usage();
}
}
void usage()
{
cout << "usage:" << endl
<< " CdmAu SimulateAU" << endl
<< " CdmAu FindUpdate devinst [DevInst ID]" << endl
<< " CdmAu FindUpdate hwid [Hardware ID]" << endl
<< " CdmAu DownloadUpdate devinst [DevInst ID]" << endl
<< " CdmAu DownloadUpdate hwid [Hardware ID]" << endl;
}
void QueryDetectionFilesCallback( void* pCallbackParam, LPCSTR pszURL, LPCSTR pszLocalFile)
{
printf(" %s - %s\n", pszURL, pszLocalFile);
// download file
CDownload download;
char szURL[INTERNET_MAX_PATH_LENGTH];
strcpy(szURL, pszURL);
char* pszServerFile = strrchr(szURL, '/');
*pszServerFile = 0;
pszServerFile ++;
char szDir[MAX_PATH];
strcpy(szDir, pszLocalFile);
*strrchr(szDir, '\\') = 0;
char szDirCabs[MAX_PATH];
strcpy(szDirCabs, szDir);
*strrchr(szDirCabs, '\\') = 0;
CreateDirectory(szDirCabs, NULL);
CreateDirectory(szDir, NULL);
if(!download.Connect(szURL))
{
printf(" ERROR - Connect(%s) fails\n", szURL);
return;
}
if(!download.Copy(pszServerFile, pszLocalFile))
{
printf(" ERROR - Copy(%s, %s) fails\n", pszServerFile, pszLocalFile);
return;
}
}
void SimulateAU()
{
cout << "--- SimulateAU ---" << endl;
auto_hlib hlib = LoadLibrary("cdm.dll");
if ( !hlib.valid() )
{
cout << " ERROR: cdm.dll Load Library Failed. Return value = " << GetLastError() << endl;
return;
}
OPEN_CDM_CONTEXT_EX_PROC fpOpenCDMContextEx = (OPEN_CDM_CONTEXT_EX_PROC)GetProcAddress(hlib, "OpenCDMContextEx");
QUERY_DETECTION_FILES_PROC fpQueryDetectionFiles = (QUERY_DETECTION_FILES_PROC)GetProcAddress(hlib, "QueryDetectionFiles");
DET_FILES_DOWNLOADED_PROC fpDetFilesDownloaded = (DET_FILES_DOWNLOADED_PROC)GetProcAddress(hlib, "DetFilesDownloaded");
CLOSE_CDM_CONTEXT_PROC fpCloseCDMContext = (CLOSE_CDM_CONTEXT_PROC)GetProcAddress(hlib, "CloseCDMContext");
if ( !fpOpenCDMContextEx || !fpQueryDetectionFiles || !fpDetFilesDownloaded || !fpCloseCDMContext )
{
cout << " ERROR: GetProcAddress failed." << endl;
return;
}
HANDLE handle = (fpOpenCDMContextEx)(TRUE);
if ( !handle )
{
cout << " ERROR: OpenCDMContextEx failed. GetLastError = "<< GetLastError() << endl;
return;
}
int nCount = (*fpQueryDetectionFiles)(handle, 0, QueryDetectionFilesCallback);
(fpDetFilesDownloaded)(handle);
(fpCloseCDMContext)(handle);
if (-1 == nCount)
cout << " ERROR: QueryDetectionFiles failed. GetLastError = "<< GetLastError() << endl;
else
cout << " SUCCESS: " << nCount << " files downloaded, ready for offline detection" << endl;
}
void FindUpdate(PDOWNLOADINFO pinfo)
{
cout << "--- FindUpdate ---" << endl;
auto_hlib hlib = LoadLibrary("cdm.dll");
if ( !hlib.valid() )
{
cout << " ERROR: cdm.dll Load Library Failed. Return value = " << GetLastError() << endl;
return;
}
OPEN_CDM_CONTEXT_EX_PROC fpOpenCDMContextEx = (OPEN_CDM_CONTEXT_EX_PROC)GetProcAddress(hlib, "OpenCDMContextEx");
FIND_MATCHING_DRIVER_PROC fpFindMatchingDriver = (FIND_MATCHING_DRIVER_PROC)GetProcAddress(hlib, "FindMatchingDriver");
CLOSE_CDM_CONTEXT_PROC fpCloseCDMContext = (CLOSE_CDM_CONTEXT_PROC)GetProcAddress(hlib, "CloseCDMContext");
if ( !fpOpenCDMContextEx|| !fpFindMatchingDriver || !fpCloseCDMContext )
{
cout << " ERROR: GetProcAddress failed." << endl;
return;
}
HANDLE handle = (fpOpenCDMContextEx)(FALSE);
if ( !handle )
{
cout << " ERROR: OpenCDMContextEx failed. GetLastError = "<< GetLastError() << endl;
return;
}
WUDRIVERINFO wudrvinfo;
BOOL fRC = (*fpFindMatchingDriver)(handle, pinfo, &wudrvinfo);
DWORD dwError = GetLastError();
(fpCloseCDMContext)(handle);
if (!fRC)
{
if (dwError == ERROR_INVALID_FUNCTION)
cout << " Not ready for offline detection " << endl;
else
cout << " No update is found. GetLastError = "<< dwError << endl;
return;
}
cout << " SUCCESS: CDM has driver" << endl;
char szTmp[HWID_LEN];
WideCharToMultiByte(CP_ACP, 0, wudrvinfo.wszHardwareID, -1, szTmp, sizeof(szTmp), NULL, NULL);
cout << " HardwareID = " << szTmp << endl;
WideCharToMultiByte(CP_ACP, 0, wudrvinfo.wszDescription, -1, szTmp, sizeof(szTmp), NULL, NULL);
cout << " Description = " << szTmp << endl;
WideCharToMultiByte(CP_ACP, 0, wudrvinfo.wszMfgName, -1, szTmp, sizeof(szTmp), NULL, NULL);
cout << " MfgName = " << szTmp << endl;
WideCharToMultiByte(CP_ACP, 0, wudrvinfo.wszProviderName, -1, szTmp, sizeof(szTmp), NULL, NULL);
cout << " ProviderName = " << szTmp << endl;
WideCharToMultiByte(CP_ACP, 0, wudrvinfo.wszDriverVer, -1, szTmp, sizeof(szTmp), NULL, NULL);
cout << " DriverVer = " << szTmp << endl;
}
void DownloadUpdate(PDOWNLOADINFO pinfo)
{
cout << "--- DownloadUpdate ---" << endl;
auto_hlib hlib = LoadLibrary("cdm.dll");
if ( !hlib.valid() )
{
cout << " ERROR: cdm.dll Load Library Failed. Return value = " << GetLastError() << endl;
return;
}
OPEN_CDM_CONTEXT_EX_PROC fpOpenCDMContextEx = (OPEN_CDM_CONTEXT_EX_PROC)GetProcAddress(hlib, "OpenCDMContextEx");
DOWNLOAD_UPDATED_FILES_PROC fpDownloadUpdatedFiles = (DOWNLOAD_UPDATED_FILES_PROC)GetProcAddress(hlib, "DownloadUpdatedFiles");
CLOSE_CDM_CONTEXT_PROC fpCloseCDMContext = (CLOSE_CDM_CONTEXT_PROC)GetProcAddress(hlib, "CloseCDMContext");
if ( !fpOpenCDMContextEx|| !fpDownloadUpdatedFiles || !fpCloseCDMContext )
{
cout << " ERROR: GetProcAddress failed." << endl;
return;
}
HANDLE handle = (fpOpenCDMContextEx)(TRUE);
if ( !handle )
{
cout << " ERROR: OpenCDMContextEx failed. GetLastError = "<< GetLastError() << endl;
return;
}
UINT uRequired;
WCHAR wszPath[MAX_PATH];
BOOL fRC = (fpDownloadUpdatedFiles)(handle, NULL, pinfo, wszPath, MAX_PATH, &uRequired);
DWORD dwError = GetLastError();
(fpCloseCDMContext)(handle);
if (!fRC)
{
cout << " ERROR: DownloadUpdatedFiles failed. GetLastError = "<< dwError << endl;
return;
}
char szPath[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szPath, sizeof(szPath), NULL, NULL);
cout << "SUCCESS:Downloaded Driver Files @ " << szPath << endl;
}