使用开源GCC编译微软WMI相关函数的示例代码

server/2024/12/2 14:15:18/

如下代码是使用国产RedPanda-Cpp的编译工具编译的,该工具使用简单;

该方式是调用微软的WMI接口相关函数

但是使用GCC编译会出现编译不过的问题,很多代码库的函数都不存在;

在编译时,需要添加这些库文件:

即使添加了,但是comutil.h文件里面的缺少对应的函数(例如:ConvertStringToBSTR),但GCC里面没有对应的库文件,于是使用修改了GCC里面的comutil.h的头文件,代码内容(改代码来自于reactos源码comsup.c)如下:

namespace _com_util {BSTR WINAPI ConvertStringToBSTR(const char *pSrc);char *WINAPI ConvertBSTRToString(BSTR pSrc);BSTR WINAPI ConvertStringToBSTR(const char *pSrc){DWORD cwch;BSTR wsOut(NULL);if (!pSrc) return NULL;/* Compute the needed size with the NULL terminator */cwch = ::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, NULL, 0);if (cwch == 0) return NULL;/* Allocate the BSTR (without the NULL terminator) */wsOut = ::SysAllocStringLen(NULL, cwch - 1);if (!wsOut){::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));return NULL;}/* Convert the string */if (::MultiByteToWideChar(CP_ACP, 0, pSrc, -1, wsOut, cwch) == 0){/* We failed, clean everything up */cwch = ::GetLastError();::SysFreeString(wsOut);wsOut = NULL;::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);}return wsOut;}char* WINAPI ConvertBSTRToString(BSTR pSrc){DWORD cb, cwch;char *szOut = NULL;if (!pSrc) return NULL;/* Retrieve the size of the BSTR with the NULL terminator */cwch = ::SysStringLen(pSrc) + 1;/* Compute the needed size with the NULL terminator */cb = ::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, NULL, 0, NULL, NULL);if (cb == 0){cwch = ::GetLastError();::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);return NULL;}/* Allocate the string */szOut = (char*)::operator new(cb * sizeof(char));if (!szOut){::_com_issue_error(HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY));return NULL;}/* Convert the string and NULL-terminate */szOut[cb - 1] = '\0';if (::WideCharToMultiByte(CP_ACP, 0, pSrc, cwch, szOut, cb, NULL, NULL) == 0){/* We failed, clean everything up */cwch = ::GetLastError();::operator delete(szOut);szOut = NULL;::_com_issue_error(!IS_ERROR(cwch) ? HRESULT_FROM_WIN32(cwch) : cwch);}return szOut;}
}

例如下面的代码是用来检查微软的OS是否激活的代码

#include <stdio.h>
#include <windows.h>
#include <Wbemidl.h>
#include <comutil.h>void CheckActivationStatus() {HRESULT hres;// 初始化COM库hres = CoInitializeEx(0, COINIT_MULTITHREADED);if (FAILED(hres)) {printf("Failed to initialize COM library. Error code = 0x%X\n", (unsigned int)hres);return;}// 初始化安全性hres = CoInitializeSecurity(NULL,-1,                          // COM negotiationNULL,                        // Authentication servicesNULL,                        // ReservedRPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  NULL,                        // Authentication infoEOAC_NONE,                   // Additional capabilities NULL                         // Reserved);if (FAILED(hres)) {printf("Failed to initialize security. Error code = 0x%X\n", (unsigned int)hres);CoUninitialize();return;}IWbemLocator *pLoc = NULL;// 获取IWbemLocator指针hres = CoCreateInstance(CLSID_WbemLocator,             0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);if (FAILED(hres)) {printf("Failed to create IWbemLocator object. Err code = 0x%X\n", (unsigned int)hres);CoUninitialize();return;}IWbemServices *pSvc = NULL;// 连接到WMI命名空间hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), // WMI命名空间NULL,                    // 用户名称NULL,                    // 用户密码0,                       // 本地安全0,                    // 安全标志0,                       // 权威0,                       // 上下文对象 &pSvc                    // IWbemServices代理);if (FAILED(hres)) {printf("Could not connect. Error code = 0x%X\n", (unsigned int)hres);pLoc->Release();     CoUninitialize();return;}// 设置代理安全级别hres = CoSetProxyBlanket(pSvc,                        // 设置代理RPC_C_AUTHN_WINNT,           // NTLM认证RPC_C_AUTHZ_NONE,            // 无授权NULL,                        // 服务器主体名称 RPC_C_AUTHN_LEVEL_CALL,      // 调用认证级别RPC_C_IMP_LEVEL_IMPERSONATE, // 仿冒级别NULL,                        // 认证服务EOAC_NONE                    // 额外的能力 );if (FAILED(hres)) {printf("Could not set proxy blanket. Error code = 0x%X\n", (unsigned int)hres);pSvc->Release();pLoc->Release();     CoUninitialize();return;}IEnumWbemClassObject* pEnumerator = NULL;hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM SoftwareLicensingProduct WHERE ApplicationId='55c92734-d682-4d71-983e-d6ec3f16059f' AND PartialProductKey IS NOT NULL"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL,&pEnumerator);if (FAILED(hres)) {printf("Query for products failed. Error code = 0x%X\n", (unsigned int)hres);pSvc->Release();pLoc->Release();     CoUninitialize();return;}IWbemClassObject *pclsObj = NULL;ULONG uReturn = 0;while (pEnumerator) {HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);if (SUCCEEDED(hr)) {	if (0 == uReturn) {break;}VARIANT vtProp;hr = pclsObj->Get(L"LicenseStatus", 0, &vtProp, 0, 0);wprintf(L"LicenseStatus : %d\n", vtProp.iVal);VariantClear(&vtProp);pclsObj->Release();}}// 清理pSvc->Release();pLoc->Release();pEnumerator->Release();CoUninitialize();
}int main() {CheckActivationStatus();return 0;
}


http://www.ppmy.cn/server/146739.html

相关文章

【大数据学习 | Spark调优篇】Spark之JVM调优

1. Java虚拟机垃圾回收调优的背景 如果在持久化RDD的时候&#xff0c;持久化了大量的数据&#xff0c;那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收&#xff0c;此时就会追踪所有的java对象&#xff0c;并且在垃圾回收时&#xff0c;找…

Linux服务器安装Linux宝塔面板部署wordpress网站以及雷池WAF

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程&#xff0c;保证网站能够正常访问&#xff0c;并且使用Linux宝塔面板申请并部署了SSL证书&#xff0c;使用https协议正常访问。 三、Linux宝塔…

MYSQL-查看系统变量信息语法(四十)

13.7.5.40 SHOW WARNINGS 语句 SHOW WARNINGS [LIMIT [offset,] row_count] SHOW COUNT(*) WARNINGSSHOW WARNINGS是一个诊断语句&#xff0c;显示有关在当前会话中执行语句所导致的情况&#xff08;错误、警告和注释&#xff09;的信息。DML语句&#xff08;如INSERT、UPDATE…

Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档

家政服务系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着人们生活水平的提高&#xff0c;老龄化、少子化等多重因素影响&#xff0c;我国对家政服务人群的需求与日俱增。家政服务行业对我国的就业和社会效益贡献也与日俱增&#…

linux环境下,导出conda和pip的安装包和对应版本

linux环境下&#xff0c;导出conda和pip的安装包和对应版本 导出conda环境中的安装包文件&#xff1a;导出环境重新创建环境注意事项 导出pip的安装包导出当前安装包列表根据导出的列表重新安装包 注意事项 导出conda环境中的安装包文件&#xff1a; 导出环境 导出环境到 YAML…

uniapp图片上传预览uni.chooseImage、uni.previewImage

文章目录 1.上传图片2.预览图片 1.上传图片 uni.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照。 App端如需要更丰富的相机拍照API&#xff08;如直接调用前置摄像头&#xff09;&#xff0c;参考plus.camera 微信小程序从基础库 2.21.0 开始&#xff0c; wx.choos…

编程语言中什么是框架?什么是Cocoa?Foundation.framework的底层实现?Swift如何引入ObjC框架?

编程语言中什么是框架&#xff1f; 在编程语言中&#xff0c;框架&#xff08;Framework&#xff09;是一种特定的软件库&#xff0c;它提供了一套预先定义的代码和组件&#xff0c;用于加速和简化特定类型的应用程序的开发。框架通常提供了一套标准化的开发工具集和约定&#…

【Pytorch】优化器(Optimizer)模块‘torch.optim’

torch.optim 是 PyTorch 中提供的优化器&#xff08;Optimizer&#xff09;模块&#xff0c;用于优化神经网络模型的参数&#xff0c;更新网络权重&#xff0c;使得模型在训练过程中最小化损失函数。它提供了多种常见的优化算法&#xff0c;如 梯度下降法&#xff08;SGD&#…