• 格式化文件体积

    ·

    发布于

    修改于

    两个函数

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

  • VC编译openssl 3.0.7

    ·

    发布于

    修改于

    1. 安装ActivePerl和NASM
    2. 执行perl Configure no-asm no-shared no-sse2 zlib VC-WIN64A –prefix=d:\openssl-3.0.7 –with-zlib-include=d:\zlib-1.2.13 –with-zlib-lib=d:\zlib-1.2.13\zlib.lib 生成makefile
    3. 执行nmake 进行编译(或者使用jom)
    4. 执行nmake install进行安装
    • VC-WIN64A 使用VC编译器编译WIN64位版本,A表示架构为X64(区别于IA64)
    • VC-WIN32 使用VC编译器编译WIN32位版本
    • no-shared 编译为静态库
    • shared 编译为动态库(默认选项)
    • zlib 使用zlib静态库
    • zlib-dynamic 只用zlib动态库
    • no-zlib 不使用zlib

    可以通过修改第二步生成的makefile文件改变具体的编译链接选项,默认选项为/GF /Gs0 /Gy /MD,在3.1.3版本中发现已经没有这个/MD了,代码生成选项已经移动到了下面。下面是一些选项的含义。

    • /O2(最大速度优化)
    • /GF(消除重复的字符串)
    • /Gs(控制堆栈检查调用)
    • /Gy(启用函数级链接)

    可以根据需要在CFLAGS中调整代码生成选项,我这里使用/MT选项,记得删除文件中其它代码生成选项。若想编译调试版本需要将/MT改为/MDd。

    如果想使用jom -j<线程数>进行多线程编译,则必须给CFLAGS指定/FS选项。

    修改CFLAGS选项
    删除其它代码生成选项

    另外还有一些编译链接选项是分开的,也就是静态库、动态库、可执行程序都有自己独特的编译选项,修改这些内容的时候要注意区分。


  • PE文件释放资源

    ·

    发布于

    修改于

    姑且算是有C和C++两个版本吧。

    //C
    BOOL GetResource(HMODULE mod, const char* rname, const char* rtype, unsigned char** rdata, int* rlen)
    {
    	HRSRC rhandle = FindResourceA(mod, rname, rtype);
    	if (rhandle == NULL)
    		return FALSE;
    	*rlen = SizeofResource(mod, rhandle);
    	HGLOBAL global_handle = LoadResource(mod, rhandle);
    	if (NULL == global_handle)
    		return FALSE;
    	*rdata = LockResource(global_handle);
    	if (*rdata)
    	{
    		DWORD flOldProtect;
    		VirtualProtect(*rdata, *rlen, PAGE_READWRITE, &flOldProtect);
    		return TRUE;
    	}
    	FreeResource(global_handle);
    	return FALSE;
    }
    //C++
    bool GetResource(HMODULE module, const char * rname, const char * rtype, byte* &rdata, int &rlen)
    {
      HRSRC rhandle = FindResourceA(module, rname, rtype);
      if (rhandle == NULL)
        return false;
      rlen = SizeofResource(module, rhandle);
      HGLOBAL global_handle = LoadResource(module, rhandle);
      if (NULL == global_handle)
        return false;
      rdata = reinterpret_cast<byte*>(LockResource(global_handle));
      if (rdata)
      {
        DWORD flOldProtect;
        VirtualProtect(rdata, rlen, PAGE_READWRITE, &flOldProtect);
        return true;
      }
      FreeResource(global_handle);
      return false;
    }

  • 编译安装Apache

    ·

    发布于

    修改于

    下载apr和apr-util到apache源码目录下的srlib目录中,并去掉目录名称中的版本号,如图所示。

    安装步骤:

    1. 安装编译过程中需要用到的工具和库
    2. sudo apt-get install autoconf automake libtool libexpat1-dev libpcre3-dev

      其中前三个是编译apr需要用到的工具,libexpat1-dev是编译apr-util用到的库,最后libpcre3-dev是编译apache本体用到的库。

    3. apr
    4. cd srclib/apr
      ./configure --prefix=/usr/local/apr            
      make && make install
    5. apr-util
    6. cd srclib/apr-util
      ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
      make && make install
    7. apache
    8. ./configure --prefix=/opt/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
      make && make install

  • Linux安装cisco anyconnect VPN client

    ·

    发布于

    修改于

    首先将安装包解压,然后会看到4个组件,我们这里只安装vpn组件。

      1. 安装编译环境(如果已经安装,则忽略此步骤)
    sudo apt-get install build-essential
      1. 执行anyconnect vpn安装脚本
    sudo ./vpn_install.sh

    这一步很简单,只需要同意软件的协议就可以了,anyconnect会被安装到/opt/cisco/anyconnect/目录

      1. 执行vpn 图形界面客户端
    cd /opt/cisco/anyconnect/bin
    ./vpnui

    提示缺少组件libgtk

      1. 安装缺少的组件libgtk
    sudo apt-get install libgtk2.0-0
      1. 再次尝试执行vpn客户端即可成功运行


最新