#include <Windows.h>
#pragma comment(lib,"Version.lib")
BOOLEAN CopyVersionInfo(LPCSTR SrcFile, LPCSTR DstFile)
{
BOOLEAN Rv = FALSE;
PVOID VersionInfo;
DWORD VersionInfoSize;
HANDLE hUpdate = NULL;
VersionInfoSize = GetFileVersionInfoSizeA(SrcFile, NULL);
if (VersionInfoSize == 0)
return FALSE;
VersionInfo = LocalAlloc(LPTR, VersionInfoSize);
if (VersionInfo == NULL)
return FALSE;
do
{
if (GetFileVersionInfoA(SrcFile, 0, VersionInfoSize, VersionInfo) == FALSE)
break;
hUpdate = BeginUpdateResourceA(DstFile, FALSE);
if (hUpdate == NULL)
break;
if (UpdateResourceA(hUpdate, RT_VERSION, (LPCSTR)1, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
VersionInfo, VersionInfoSize) == FALSE)
break;
if (EndUpdateResourceA(hUpdate, FALSE) == FALSE)
break;
hUpdate = NULL;
Rv = TRUE;
} while (0);
if (hUpdate)
EndUpdateResourceA(hUpdate, TRUE);
LocalFree(VersionInfo);
return Rv;
}
int main(int argc, char* argv[])
{
CopyVersionInfo("c:\\windows\\system32\\ntdll.dll", "D:\\muma.dll");
return 1;
}
-
拷贝文件版本信息
-
boost base64编码
方案一
#include <boost/archive/iterators/base64_from_binary.hpp> #include <boost/archive/iterators/binary_from_base64.hpp> #include <boost/archive/iterators/transform_width.hpp> bool Base64Encode(const std::string& input, std::string& output) { typedef boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<std::string::const_iterator, 6, 8> > Base64EncodeIterator; std::stringstream result; std::copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), std::ostream_iterator<char>(result)); size_t equal_count = (3 - input.length() % 3) % 3; for (size_t i = 0; i < equal_count; i++) { result.put('='); } output = result.str(); return output.empty() == false; } bool Base64Decode(const std::string& input, std::string& output) { typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<std::string::const_iterator>, 8, 6> Base64DecodeIterator; std::stringstream result; try { std::copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), std::ostream_iterator<char>(result)); } catch (...) { return false; } output = result.str(); return output.empty() == false; }方案一有问题,在使用Base64Decode解码的时候,如果输入源的末尾有“=”补位符,那么output的字符串的长度是不对的,不是实际字符串的长度,比实际的字符串长度要长(就是包含补位符的input的字符串应算出来的解码长度)。
方案二
#include <boost/archive/iterators/binary_from_base64.hpp> #include <boost/archive/iterators/base64_from_binary.hpp> #include <boost/archive/iterators/transform_width.hpp> #include <boost/algorithm/string.hpp> std::string decode64(const std::string &val) { using namespace boost::archive::iterators; using It = transform_width<binary_from_base64<std::string::const_iterator>, 8, 6>; return boost::algorithm::trim_right_copy_if(std::string(It(std::begin(val)), It(std::end(val))), [](char c) { return c == '\0'; }); } std::string encode64(const std::string &val) { using namespace boost::archive::iterators; using It = base64_from_binary<transform_width<std::string::const_iterator, 6, 8>>; auto tmp = std::string(It(std::begin(val)), It(std::end(val))); return tmp.append((3 - val.size() % 3) % 3, '='); }方案二没有方案一的那个问题。
-
启动、停止Windows服务
#include <windows.h> BOOL EasyStartService(LPCSTR ServiceName) { SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; SERVICE_STATUS ServiceStatus; BOOL Ret = FALSE; do { hSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); if (hSCManager == NULL) break; hService = OpenServiceA(hSCManager, ServiceName, SERVICE_START | SERVICE_QUERY_STATUS); if (hService == NULL) break; if (StartServiceA(hService, 0, NULL) == FALSE) break; do { if (QueryServiceStatus(hService, &ServiceStatus) == FALSE) break; if (ServiceStatus.dwCurrentState == SERVICE_RUNNING) Ret = TRUE; } while (ServiceStatus.dwCurrentState == SERVICE_START_PENDING); } while (0); if (hService) CloseServiceHandle(hService); if (hSCManager) CloseServiceHandle(hSCManager); return Ret; } BOOL EasyStopService(LPCSTR ServiceName) { SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; SERVICE_STATUS ServiceStatus; BOOL Ret = FALSE; do { hSCManager = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); if (hSCManager == NULL) break; hService = OpenServiceA(hSCManager, ServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS); if (hService == NULL) break; if (ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus) == FALSE) break; if (ServiceStatus.dwCurrentState == SERVICE_STOPPED) Ret = TRUE; while (ServiceStatus.dwCurrentState == SERVICE_STOP_PENDING) { if (QueryServiceStatus(hService, &ServiceStatus) == FALSE) break; if (ServiceStatus.dwCurrentState == SERVICE_STOPPED) Ret = TRUE; } } while (0); if (hService) CloseServiceHandle(hService); if (hSCManager) CloseServiceHandle(hSCManager); return Ret; } VOID StopIIS() { EasyStopService("AppHostSvc"); EasyStopService("w3logsvc"); EasyStopService("W3SVC"); //必须最后结束下面这个服务,否则该服务结束不了 //WAS服务的显示名称是Windows Process Activation Service EasyStopService("WAS"); } VOID StartIIS() { EasyStartService("AppHostSvc"); EasyStartService("w3logsvc"); EasyStartService("W3SVC"); EasyStartService("WAS"); }
-
Windows CryptoAPI AES加解密
#include <Windows.h> #include <tchar.h> #include <stdio.h> void ShowError(const char* pszText); BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength); BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength); int main(int argc, _TCHAR* argv[]) { BYTE pData[MAX_PATH] = { 0 }; DWORD dwDataLength = 0, dwBufferLength = MAX_PATH; DWORD i = 0; RtlZeroMemory(pData, dwBufferLength); lstrcpyA((char*)pData, "Hello World !11111111111111111122222222222222222222"); dwDataLength = lstrlenA((char*)pData); printf("Text[%d]\n", dwDataLength); for (i = 0; i < dwDataLength; i++) { printf("%x ", pData[i]); } printf("\n\n"); //AES加密 AesEncrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength); printf("AES Encrypt[%d]\n", dwDataLength); for (i = 0; i < dwDataLength; i++) { printf("%x ", pData[i]); } printf("\n\n"); //AES解密 AesDecrypt((BYTE*)"yxx", 3, pData, &dwDataLength, dwBufferLength); printf("AES Decrypt[%d]\n", dwDataLength); for (i = 0; i < dwDataLength; i++) { printf("%x ", pData[i]); } printf("\n\n"); system("pause"); return 0; } void ShowError(const char* pszText) { char szErr[MAX_PATH] = { 0 }; wsprintfA(szErr, "%s Error [%d]", pszText, GetLastError()); MessageBoxA(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR); } //AES加密 BOOL AesEncrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength) { BOOL bRet = TRUE; HCRYPTPROV hCryptprov = 0; HCRYPTHASH hCryptHash = 0; HCRYPTKEY hCryptKey = 0; do { //获取CSP句柄 bRet = CryptAcquireContextA(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT); if (FALSE == bRet) { ShowError("CryptAcquireContext"); break; } //创建HASH对象 bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash); if (FALSE == bRet) { ShowError("CryptCreateHash"); break; } //对密钥进行HASH计算 bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0); if (FALSE == bRet) { ShowError("CryptHashData"); break; } //使用HASH来生成密钥 bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey); if (FALSE == bRet) { ShowError("CryptDeriveKey"); break; } bRet = CryptEncrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength, dwBufferLength); if (FALSE == bRet) { ShowError("CryptEncrypt"); break; } } while (FALSE); if (hCryptKey) { CryptDestroyKey(hCryptKey); } if (hCryptHash) { CryptDestroyHash(hCryptHash); } if (hCryptprov) { CryptReleaseContext(hCryptprov, 0); } return bRet; } //AES解密 BOOL AesDecrypt(BYTE* pPassword, DWORD dwPasswordLength, BYTE* pData, LPDWORD dwDataLength, DWORD dwBufferLength) { BOOL bRet = TRUE; HCRYPTPROV hCryptprov = 0; HCRYPTHASH hCryptHash = 0; HCRYPTKEY hCryptKey = 0; do { //获取CSP句柄 bRet = CryptAcquireContext(&hCryptprov, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT); if (FALSE == bRet) { ShowError("CryptAcquireContext"); break; } //创建HASH对象 bRet = CryptCreateHash(hCryptprov, CALG_MD5, 0, 0, &hCryptHash); if (FALSE == bRet) { ShowError("CryptCreateHash"); break; } //对密钥进行HASH计算 bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0); if (FALSE == bRet) { ShowError("CryptHashData"); break; } //使用HASH来生成密钥 bRet = CryptDeriveKey(hCryptprov, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey); if (FALSE == bRet) { ShowError("CryptDeriveKey"); break; } bRet = CryptDecrypt(hCryptKey, 0, TRUE, 0, pData, dwDataLength); if (FALSE == bRet) { ShowError("CryptDecrypt"); break; } } while (FALSE); if (hCryptKey) { CryptDestroyKey(hCryptKey); } if (hCryptHash) { CryptDestroyHash(hCryptHash); } if (hCryptprov) { CryptReleaseContext(hCryptprov, 0); } return bRet; }
-
格式化文件体积
两个函数
- StrFormatByteSize
- StrFormatByteSize64
StrFormatByteSize64 can be used for either ANSI or Unicode characters. However, while StrFormatByteSize64A can be called directly, StrFormatByteSize64W is not defined. When StrFormatByteSize64 is called with a Unicode value, StrFormatByteSizeW is used.
In Windows 10, size is reported in base 10 rather than base 2. For example, 1 KB is 1000 bytes rather than 1024.
The following table illustrates how this function converts a numeric value into a text string.
REMARKS Numeric value Text string 532 532 bytes 1340 1.30 KB 23506 23.5 KB 2400016 2.40 MB 2400000000 2.4 GB
-
boost中json库的用法
boost在最新的1.75版本加入了json库,下面是该库的使用小例。
#include <stdio.h> #include <boost/json.hpp> #include <iostream> void test1(std::string &str) { boost::json::object obj; obj["1"] = { {"v1","abc"}, {"v2","def"} , {"v3","ghi"}, {"v4",1234}, {"v5", 5678} }; obj["2"] = "test"; str = boost::json::serialize(obj); } void main(int argc, char* argv[]) { std::string str; test1(str); std::cout << str << std::endl; //解析字符串 boost::json::value val = boost::json::parse(str); if (val.is_object()) { for (auto obj : val.as_object()) { if (obj.key() == "1") { if (obj.value().is_object() == false) { break; } for (auto elm : obj.value().as_object()) { if (elm.key() == "v1") { if (elm.value().is_string() == false) { break; } std::cout << elm.value() << std::endl; } if (elm.key() == "v2") { if (elm.value().is_string() == false) { break; } std::cout << elm.value() << std::endl; } if (elm.key() == "v3") { if (elm.value().is_string() == false) { break; } std::cout << elm.value() << std::endl; } if (elm.key() == "v4") { if (elm.value().is_number() == false) { break; } std::cout << elm.value() << std::endl; } if (elm.key() == "v5") { if (elm.value().is_number() == false) { break; } std::cout << elm.value() << std::endl; } } } if (obj.key() == "2") { if (obj.value().is_string() == false) { break; } std::cout << obj.value() << std::endl; } } } getchar(); }
-
36项特权
SeAssignPrimaryTokenPrivilege SeAuditPrivilege SeBackupPrivilege SeChangeNotifyPrivilege SeCreateGlobalPrivilege SeCreatePagefilePrivilege SeCreatePermanentPrivilege SeCreateSymbolicLinkPrivilege SeCreateTokenPrivilege SeDebugPrivilege SeDelegateSessionUserImpersonatePrivilege SeEnableDelegationPrivilege SeImpersonatePrivilege SeIncreaseBasePriorityPrivilege SeIncreaseQuotaPrivilege SeIncreaseWorkingSetPrivilege SeLoadDriverPrivilege SeLockMemoryPrivilege SeMachineAccountPrivilege SeManageVolumePrivilege SeProfileSingleProcessPrivilege SeRelabelPrivilege SeRemoteShutdownPrivilege SeRestorePrivilege SeSecurityPrivilege SeShutdownPrivilege SeSyncAgentPrivilege SeSystemEnvironmentPrivilege SeSystemProfilePrivilege SeSystemtimePrivilege SeTakeOwnershipPrivilege SeTcbPrivilege SeTimeZonePrivilege SeTrustedCredManAccessPrivilege SeUndockPrivilege SeUnsolicitedInputPrivilege
-
获取计算机CPU核心数
#include <Windows.h> DWORD CountSetBits(ULONG_PTR bitMask) { DWORD LSHIFT = sizeof(ULONG_PTR) * 8 - 1; DWORD bitSetCount = 0; ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT; DWORD i; for (i = 0; i <= LSHIFT; ++i) { bitSetCount += ((bitMask & bitTest) ? 1 : 0); bitTest /= 2; } return bitSetCount; } VOID GetProcessorCoreCount(PDWORD LogicalProcessorCount, PDWORD ProcessorCoreCount) { PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ProcessorInfo; DWORD ReturnedLength = 0; *LogicalProcessorCount = 0; *ProcessorCoreCount = 0; GetLogicalProcessorInformation(NULL, &ReturnedLength); ProcessorInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)LocalAlloc(LPTR, ReturnedLength); GetLogicalProcessorInformation(ProcessorInfo, &ReturnedLength); for (DWORD i = 0; i < ReturnedLength / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++) { if (ProcessorInfo[i].Relationship == RelationProcessorCore) { (*ProcessorCoreCount)++; *LogicalProcessorCount += CountSetBits(ProcessorInfo[i].ProcessorMask); } } LocalFree(ProcessorInfo); } int main() { DWORD LogicalProcessorCount, ProcessorCoreCount; GetProcessorCoreCount(&LogicalProcessorCount, &ProcessorCoreCount); printf("logical:%d core:%d\n", LogicalProcessorCount, ProcessorCoreCount); }
-
Windows exe服务程序
#include <windows.h> TCHAR szServiceName[] = "ServiceProject"; DWORD g_CurrentState; SERVICE_STATUS_HANDLE g_SSHandle; void MyWriteFileA(const CHAR* aaa, DWORD bbb = 0) { HANDLE fileHandle = CreateFile("C:\\Info.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fileHandle == INVALID_HANDLE_VALUE) { return; } int dwPos = SetFilePointer(fileHandle, 0, NULL, FILE_END); DWORD writeSize = 0; if (bbb == 0) { if (!WriteFile(fileHandle, aaa, lstrlen(aaa), &writeSize, NULL) && writeSize != lstrlen(aaa)) { CloseHandle(fileHandle); return; } } else { if (!WriteFile(fileHandle, aaa, bbb, &writeSize, NULL) && writeSize != bbb) { CloseHandle(fileHandle); return; } } CloseHandle(fileHandle); } BOOL TellSCM(DWORD dwState, DWORD dwExitCode, DWORD dwProgress) { SERVICE_STATUS srvStatus; srvStatus.dwServiceType = SERVICE_WIN32; srvStatus.dwCurrentState = g_CurrentState = dwState; srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN; srvStatus.dwWin32ExitCode = dwExitCode; srvStatus.dwServiceSpecificExitCode = 0; srvStatus.dwCheckPoint = dwProgress; srvStatus.dwWaitHint = 1000; return SetServiceStatus(g_SSHandle, &srvStatus); } void WINAPI ServiceControl(DWORD dwCommand) { switch (dwCommand) { case SERVICE_CONTROL_STOP: MyWriteFileA("SERVICE_CONTROL_STOP\r\n"); TellSCM(SERVICE_STOP_PENDING, 0, 1); TellSCM(SERVICE_STOPPED, 0, 0); break; case SERVICE_CONTROL_PAUSE: MyWriteFileA("SERVICE_CONTROL_PAUSE\r\n"); TellSCM(SERVICE_PAUSE_PENDING, 0, 1); TellSCM(SERVICE_PAUSED, 0, 0); break; case SERVICE_CONTROL_CONTINUE: MyWriteFileA("SERVICE_CONTROL_CONTINUE\r\n"); TellSCM(SERVICE_CONTINUE_PENDING, 0, 1); TellSCM(SERVICE_RUNNING, 0, 0); break; case SERVICE_CONTROL_INTERROGATE: MyWriteFileA("SERVICE_CONTROL_INTERROGATE\r\n"); TellSCM(g_CurrentState, 0, 0); break; case SERVICE_CONTROL_SHUTDOWN: MyWriteFileA("SERVICE_CONTROL_SHUTDOWN\r\n"); TellSCM(SERVICE_STOPPED, 0, 0); break; default: MyWriteFileA("SERVICE_CONTROL_NONE\r\n"); break; } } void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) { CHAR svcname[256] = { 0 }; lstrcpy(svcname, argv[0]); g_SSHandle = RegisterServiceCtrlHandler(svcname, (LPHANDLER_FUNCTION)ServiceControl); if (!g_SSHandle) { return; } MyWriteFileA("SERVICE_CONTROL_START"); TellSCM(SERVICE_START_PENDING, 0, 1); TellSCM(SERVICE_RUNNING, 0, 0); //CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainStart, NULL, 0, NULL)); } int main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = szServiceName; ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; StartServiceCtrlDispatcher(ServiceTable); return 0; }

