Joe*_*oel 2 winapi multithreading semaphore
我有一个关于使用信号量的问题
HANDLE WINAPI CreateSemaphore(...);
Run Code Online (Sandbox Code Playgroud)
无论如何我能获得信号量的当前值吗?
这里使用Native Api的解决方案,由http://undocumented.ntinternals.net/记录.我省略了一些东西,因为这会使代码更长.当您理解本机API的语法时,代码很简单.例如(几乎)所有本机api函数,这些由ntdll导出并且没有由microsoft记录,返回NTSTATUS,并且不使用函数simliar来获取Set/GetLastError().如果NtQuerySemaphore失败(Status!= STATUS_SUCCESS),您可能需要在此处查找错误代码:http://source.winehq.org/source/include/ntstatus.h.
好吧,让我们来看看代码,非常简单,首先定义一些你可以从ntinernals.net获得的结构.然后在ntdll.dll中获取NtQuerySemaphore的地址.您不需要使用LoadLibrary,因为每个进程都加载了ntdll.dll.
NtQuerySemaphore也很简单,第一个参数是信号量的句柄,第二个是你想要检索的信息类(在我们的例子中是SemaphoreBasicInformation = 0x0).第三个参数是指向结构的指针,它会重新获取信息.第四个参数是结构的大小.第五个是ReturnLength,例如,如果您可以使用此函数接收sempahore的名称,则此参数可以在第一次调用后使用不正确的SemaphoreInformationLength保存需要的缓冲区大小.
足够!代码:)
#include <windows.h>
#include <stdio.h>
typedef LONG NTSTATUS;
typedef NTSTATUS (NTAPI *_NtQuerySemaphore)(
HANDLE SemaphoreHandle,
DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */
PVOID SemaphoreInformation, /* but this is to much to dump here */
ULONG SemaphoreInformationLength,
PULONG ReturnLength OPTIONAL
);
typedef struct _SEMAPHORE_BASIC_INFORMATION {
ULONG CurrentCount;
ULONG MaximumCount;
} SEMAPHORE_BASIC_INFORMATION;
int main (int argc, char *argv[])
{
_NtQuerySemaphore NtQuerySemaphore;
HANDLE Semaphore;
SEMAPHORE_BASIC_INFORMATION BasicInfo;
NTSTATUS Status;
Semaphore = CreateSemaphore (NULL, 50, 100, "Test");
NtQuerySemaphore = (_NtQuerySemaphore)GetProcAddress (GetModuleHandle ("ntdll.dll"), "NtQuerySemaphore");
if (NtQuerySemaphore)
{
Status = NtQuerySemaphore (Semaphore, 0 /*SemaphoreBasicInformation*/,
&BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL);
if (Status == ERROR_SUCCESS)
{
printf ("CurrentCount: %lu", BasicInfo.CurrentCount);
}
}
CloseHandle (Semaphore);
}
Run Code Online (Sandbox Code Playgroud)
最后一件事,请注意,microsoft可以删除或更改此功能的工作方式.
干杯恶魔
不,那是故意的.即使您可以获得"当前"值,在您可以对其执行任何操作之前,该值可能已经发生了很大变化.对它做任何事情的唯一方法是以原子方式获取和设置值 - 例如,等待信号量空闲并在同一操作中将其设置为"拥有"(由该段代码).
| 归档时间: |
|
| 查看次数: |
5569 次 |
| 最近记录: |