Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::lock\u guard是否增加dll引用计数器?(装载计数)_C++_Winapi_Dll_C++11_Std - Fatal编程技术网

C++ std::lock\u guard是否增加dll引用计数器?(装载计数)

C++ std::lock\u guard是否增加dll引用计数器?(装载计数),c++,winapi,dll,c++11,std,C++,Winapi,Dll,C++11,Std,我在使用std::lock_警卫时遇到了一件奇怪的事情。 注意:我使用的是MSVS 2012和std::lock_-guard,它们在这个版本中包含和发布的新c++11头文件的互斥体头文件中声明 下面是复制此行为的代码,似乎出于某种原因,使用此函数会增加dll LoadCount,我的问题是是否有人可以解释原因,是否有更好的锁定函数可以使用,而不会弄乱LoadCount #include <windows.h> #include <mutex> typedef stru

我在使用std::lock_警卫时遇到了一件奇怪的事情。 注意:我使用的是MSVS 2012和std::lock_-guard,它们在这个版本中包含和发布的新c++11头文件的互斥体头文件中声明

下面是复制此行为的代码,似乎出于某种原因,使用此函数会增加dll LoadCount,我的问题是是否有人可以解释原因,是否有更好的锁定函数可以使用,而不会弄乱LoadCount

#include <windows.h>
#include <mutex>

typedef struct _PEB_LDR_DATA {
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;


typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
typedef LSA_UNICODE_STRING UNICODE_STRING, *PUNICODE_STRING;

typedef struct _RTL_USER_PROCESS_PARAMETERS {
   BYTE           Reserved1[16];
   PVOID          Reserved2[10];
   UNICODE_STRING ImagePathName;
   UNICODE_STRING CommandLine;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

typedef VOID (NTAPI *PPS_POST_PROCESS_INIT_ROUTINE) (VOID);

typedef struct _PEB {
    BYTE                          Reserved1[2];
    BYTE                          BeingDebugged;
    BYTE                          Reserved2[1];
    PVOID                         Reserved3[2];
    PPEB_LDR_DATA                 Ldr;
    PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
    BYTE                          Reserved4[104];
    PVOID                         Reserved5[52];
    PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
    BYTE                          Reserved6[128];
    PVOID                         Reserved7[1];
    ULONG                         SessionId;
} PEB, *PPEB;
typedef struct _PROCESS_BASIC_INFORMATION
{
    PVOID Reserved1;
    PPEB PebBaseAddress;
    PVOID Reserved2[2];
    ULONG_PTR UniqueProcessId;
    PVOID Reserved3;
} PROCESS_BASIC_INFORMATION;
typedef enum _PROCESSINFOCLASS
{
    ProcessBasicInformation = 0,
} PROCESSINFOCLASS, *PPROCESSINFOCLASS;

typedef struct _LDRP_CSLIST
{
    PSINGLE_LIST_ENTRY Tail;
} LDRP_CSLIST, *PLDRP_CSLIST;
typedef enum _LDR_DDAG_STATE
{
LdrModulesMerged = -5,
LdrModulesInitError = -4,
LdrModulesSnapError = -3,
LdrModulesUnloaded = -2,
LdrModulesUnloading = -1,
LdrModulesPlaceHolder = 0,
LdrModulesMapping = 1,
LdrModulesMapped = 2,
LdrModulesWaitingForDependencies = 3,
LdrModulesSnapping = 4,
LdrModulesSnapped = 5,
LdrModulesCondensed = 6,
LdrModulesReadyToInit = 7,
LdrModulesInitializing = 8,
LdrModulesReadyToRun = 9
} LDR_DDAG_STATE;
typedef struct _LDR_DDAG_NODE
{
LIST_ENTRY Modules;
PVOID ServiceTagList;
ULONG LoadCount;//this is where its located in windows 8
ULONG ReferenceCount;
ULONG DependencyCount;
union
{
    LDRP_CSLIST Dependencies;
    SINGLE_LIST_ENTRY RemovalLink;
};
LDRP_CSLIST IncomingDependencies;
LDR_DDAG_STATE State;
SINGLE_LIST_ENTRY CondenseLink;
ULONG PreorderNumber;
ULONG LowestLink;
} LDR_DDAG_NODE, *PLDR_DDAG_NODE;
typedef struct _LDR_MODULE {
LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    LIST_ENTRY InInitializationOrderModuleList;
    PVOID BaseAddress;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT obsoleteLoadCount;//in windows 8 this is obsolete
    USHORT TlsIndex;//but we can still use it in win 7 and below
union
{
        LIST_ENTRY HashLinks;
        struct CheckPtr
        {
            PVOID SectionPointer;
            ULONG CheckSum;
        };
};
union
{
        ULONG TimeDateStamp;
        PVOID LoadedImports;
};
struct _ACTIVATION_CONTEXT *EntryPointActivationContext;
PVOID PatchInformation;
PLDR_DDAG_NODE DdagNode;
} LDR_MODULE, *PLDR_MODULE;

typedef NTSTATUS (__stdcall *pfnZwQueryInformationProcess) (HANDLE, PROCESSINFOCLASS,
    PVOID, ULONG, PULONG);
pfnZwQueryInformationProcess ZwQueryInformationProcess;

DWORD GetModuleLoadCount(HMODULE hmod)
{
    HMODULE hModule = LoadLibrary("ntdll.dll");
    if(hModule==NULL)
       return NULL;
    ZwQueryInformationProcess = (pfnZwQueryInformationProcess) GetProcAddress(hModule, 
        "ZwQueryInformationProcess");
    if (ZwQueryInformationProcess == NULL) {
        FreeLibrary(hModule)
        return NULL;    // failed to get PEB
    }

PROCESS_BASIC_INFORMATION pbi;
    PROCESSINFOCLASS pic = ProcessBasicInformation;
    if (ZwQueryInformationProcess(GetCurrentProcess(), pic, &pbi, sizeof(pbi), NULL) 
        != STATUS_SUCCESS)
    {
        // ZwQueryInformationProcess failed...
        FreeLibrary(hModule);
        return NULL;
    }
    FreeLibrary(hModule);

LDR_MODULE *peb_ldr_module = (LDR_MODULE 
        *)pbi.PebBaseAddress->Ldr->InLoadOrderModuleList.Flink;
while((peb_ldr_module = (LDR_MODULE 
        *)peb_ldr_module->InLoadOrderModuleList.Flink)!=(LDR_MODULE 
        *)pbi.PebBaseAddress->Ldr->InLoadOrderModuleList.Blink) {
    if(peb_ldr_module->BaseAddress==hmod) {
        //well this actualy works in windows 8...
        //and probably vista with aero enabled as well...
        //anyway if it is obsolete its always 6
        //so we can if it out like this...
        if(peb_ldr_module->obsoleteLoadCount==6)
            return peb_ldr_module->DdagNode->LoadCount;
        else
            return peb_ldr_module->obsoleteLoadCount;
    }
}
if(peb_ldr_module->BaseAddress==hmod) {
    if(peb_ldr_module->obsoleteLoadCount==6)
        return peb_ldr_module->DdagNode->LoadCount;
    else
        return peb_ldr_module->obsoleteLoadCount;
}
}

mutable std::mutex g_logMutex;
void test()//test is just a function inside of my dll
{          //which is injected and running under low privileges in internet explorer as
           //an addon, I dont think that matters, but i dont want to leave any info out 
           //that might help answer my question.
int loadcount = GetModuleLoadCount((HMODULE)gModule);//its 1 here
    std::lock_guard<std::mutex> lock(g_logMutex);
loadcount = GetModuleLoadCount((HMODULE)gModule);//now its 2
}
#包括
#包括
类型定义结构\u PEB\u LDR\u数据{
乌龙长度;
布尔初始化;
pvoidsshandle;
LoadOrderModuleList中的列表项;
在MemoryDermoduleList中列出条目;
InitializationOrderModuleList中的列表项;
}PEB_LDR_数据,*PPEB_LDR_数据;
typedef结构\u LSA\u UNICODE\u字符串{
USHORT长度;
USHORT最大长度;
PWSTR缓冲区;
}LSA_UNICODE_字符串,*PLSA_UNICODE_字符串;
typedef LSA_UNICODE_STRING UNICODE_STRING,*PUNICODE_STRING;
类型定义结构\u RTL\u用户\u进程\u参数{
字节保留1[16];
PVOID储备2[10];
UNICODE_字符串图像路径名;
UNICODE_字符串命令行;
}RTL用户过程参数,*PRTL用户过程参数;
typedef VOID(NTAPI*PPS\u POST\u PROCESS\u INIT\u例程)(VOID);
类型定义结构{
字节保留1[2];
正在调试的字节;
保留的字节2[1];
PVOID储备3[2];
PPEB_LDR_数据LDR;
PRTL_用户_过程_参数过程参数;
保留的字节4[104];
PVOID保留5[52];
PPS_后处理_初始化_例程后处理初始化例程;
字节保留6[128];
PVOID保留7[1];
ULONG SessionId;
}PEB,*PPEB;
类型定义结构\u进程\u基本信息
{
PVOID储备1;
PebBaseAddress;
PVOID储备2[2];
ULONG_PTR唯一进程ID;
PVOID储备3;
}处理基本信息;
typedef枚举\u PROCESSINFOCLASS
{
ProcessBasicInformation=0,
}PROCESSINFOCLASS,*PPROCESSINFOCLASS;
类型定义结构\u LDRP\u CSLIST
{
p单个列表项尾;
}LDRP_CSLIST,*PLDRP_CSLIST;
类型定义枚举\u LDR\u DDAG\u状态
{
LdrModulesMerged=-5,
ldrmodules=-4,
LdrModulesSnapError=-3,
LdrModuleSunload=-2,
LdrModulesUnloading=-1,
LdrModulesPlaceHolder=0,
LdrModulesMapping=1,
LdrModulesMapped=2,
LdrModulesWaitingForDependencies=3,
LdrModulesSnapping=4,
LdrModulesSnapped=5,
LdrModulesCondensed=6,
LdrModulesReadyToInit=7,
LDR模块化=8,
LdrModulesReadyRun=9
}LDR_DDAG_州;
typedef结构\u LDR\u DDAG\u节点
{
列出输入模块;
PVOID服务标签列表;
ULONG LoadCount;//这是它在windows 8中的位置
乌龙参考计数;
乌龙依赖计数;
联盟
{
LDRP_CSLIST依赖关系;
单项目列表删除链接;
};
LDRP_CSLIST收入依赖性;
LDR_DDAG_州;
单条列表链接;
ULONG预订单编号;
乌隆下部油墨;
}LDR_-DDAG_节点,*PLDR_-DDAG_节点;
类型定义结构(LDR)模块{
LoadOrderModuleList中的列表项;
在MemoryDermoduleList中列出条目;
InitializationOrderModuleList中的列表项;
PVOID基址;
PVOID入口点;
乌龙西泽图像;
UNICODE_字符串完整名称;
UNICODE_基于字符串的名称;
乌龙旗;
USHORT obsoletloadcount;//在windows 8中,这是过时的
USHORT-TlsIndex;//但我们仍然可以在Win7及以下版本中使用它
联盟
{
列出项目链接;
结构检查
{
PVOID截面指针;
ULONG校验和;
};
};
联盟
{
乌龙时间戳;
PVOID加载导入;
};
结构激活上下文*入口点激活上下文;
PVOID信息;
PLDR_DDAG_NODE DdagNode;
}LDR_模块,*PLDR_模块;
typedef NTSTATUS(uu stdcall*pfnZwQueryInformationProcess)(句柄,PROCESSINFOCLASS,
PVOID、ULONG、PULONG);
pfnZwQueryInformationProcess ZwQueryInformationProcess;
DWORD GetModuleLoadCount(HMODULE hmod)
{
HMODULE HMODULE=LoadLibrary(“ntdll.dll”);
if(hModule==NULL)
返回NULL;
ZwQueryInformationProcess=(pfnZwQueryInformationProcess)GetProcAddress(hModule,
“ZwQueryInformationProcess”);
if(ZwQueryInformationProcess==NULL){
免费图书馆(hModule)
return NULL;//获取PEB失败
}
处理基本信息pbi;
PROCESSINFOCLASS pic=ProcessBasicInformation;
if(ZwQueryInformationProcess(GetCurrentProcess(),pic,&pbi,sizeof(pbi),NULL)
!=状态(成功)
{
//ZwQueryInformationProcess失败。。。
免费图书馆(hModule);
返回NULL;
}
免费图书馆(hModule);
LDR_模块*peb_LDR_模块=(LDR_模块
*)pbi.PebBaseAddress->Ldr->InLoadOrderModuleList.Flink;
而((peb_ldr_模块=(ldr_模块
*)peb_ldr_模块->InLoadOrderModuleList.Flink)!=(ldr_模块
*)pbi.PebBaseAddress->Ldr->InLoadOrderModuleList.Blink){
if(peb_ldr_模块->基址==hmod){
//这实际上在Windows8中工作。。。
//可能vista也启用了aero。。。
//无论如何,如果它是过时的,它总是6
//所以我们可以这样解决。。。
如果(peb_ldr_模块->废弃装载计数==6)
返回peb\U ldr\U模块->DdagNode->装载计数;
其他的
返回peb_ldr_模块->废弃装载计数;
}
}
if(peb_ldr_模块->基址==hmod){
如果(peb_ldr_模块->废弃装载计数==6)
返回peb\U ldr\U模块->DdagNode->装载计数;
其他的
返回peb_ldr_模块->废弃装载计数;
}
}
可变std::mutex g_logMutex;
void test()//test只是我的dll中的一个函数
{//在internet explorer中以低权限注入并运行
//一个插件,我认为这不重要,但我不想留下任何