• 拷贝文件版本信息

    ·

    发布于

    修改于

    #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;
    }
    
    

     


  • 格式化文件体积

    ·

    发布于

    修改于

    两个函数

    1. StrFormatByteSize
    2. 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

     


  • 没有TPM芯片的情况下开启系统盘BitLocker

    ·

    发布于

    修改于

    步骤1
    步骤1

    步骤2

    设置完成后就可以加密系统盘了。加密完成后,每次开机的时候需要先输入密码才能开始引导进系统。


  • 获取计算机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;
    }
    

最新