自己实现临界区

#include <iostream>
#include <Windows.h>
 
// 全局变量
int X = 0;
ULONG Key = 0;
 
// 实现临界区
VOID  _declspec(naked) _fastcall GetMyLockCode(ULONG * mLock)
{
	__asm
	{
		pushad;
		pushfd;
 
	Lockstart:
		mov eax, 0x1;
		lock xadd dword ptr[ecx], eax;
		// 如果 EAX 等于 0x1, 代表已经有人获得了 Lock
		cmp eax, 0x0;
		jz  LockEnd;
		// 没有获取锁, 循环等待获取
		lock dec [ecx];
		push ecx;
		push 1;
		push 1;
		call SleepEx;
		pop  ecx;
		jmp  Lockstart;
 
	LockEnd:
		// 代表已经获取了锁
		popfd;
		popad;
 
		retn;
	}
}
 
VOID  _declspec(naked) _fastcall ReleaseLockCode(ULONG * mLock)
{
	// 释放锁
	__asm
	{
		lock dec [ecx];
		retn;
	}
}
 
 
DWORD WINAPI ThreadRoutine(
	LPVOID lpThreadParameter
	)
{
	for (int i = 0; i < 100000; i++)
	{
		GetMyLockCode(&Key);
		X += 1;
		ReleaseLockCode(&Key);
	}
 
	return X;
}
 
int main()
{
	HANDLE hThreadArray[2] = { NULL };
	for (int i = 0; i < 2; i++)
	{
		hThreadArray[i] = CreateThread(NULL, NULL , ThreadRoutine, (PVOID)i, NULL, NULL);
	}
 
	WaitForMultipleObjects(2, hThreadArray, TRUE, INFINITE);
	printf("X = %d\n", X);
 
	system("pause");
}

原创文章,转载请注明: 转载自Windows内核安全驱动编程

本文链接地址: 自己实现临界区

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注