系统通过使用计数来管理系统核心对象,当某核心对象的使用计数为0时,系统便释放此对象。当你调用CreateMutex是创立一个互斥量并使其使用计数为1,当你在
WlxLoggedOnSAS 中当调用OpenMutex成功时使其使用计数为2,然后你使用
CloseHandle使其计数变为1,所以此互斥量一直没用释放。
因此,当你再次调用OpenMutex时总是返回你当前创建的互斥量的句柄,就一直
不会屏蔽CTRL+ALT+DEL.现在你要做的是在
if(hMutex){……}中通知你的程序调用CloseHandle及时释放那个互斥量。
这是我的理解,我现在无法试验一下。
另外,互斥量的拥有者是线程,所以要使ReleaseMutex调用成功,必须保证调用
ReleaseMutex的线程拥有此互斥量。在WlxLoggedOnSAS 中,你在CloseHandle
后调用ReleaseMutex是不会成功的。
WlxLoggedOnSAS 中当调用OpenMutex成功时使其使用计数为2,然后你使用
CloseHandle使其计数变为1,所以此互斥量一直没用释放。
因此,当你再次调用OpenMutex时总是返回你当前创建的互斥量的句柄,就一直
不会屏蔽CTRL+ALT+DEL.现在你要做的是在
if(hMutex){……}中通知你的程序调用CloseHandle及时释放那个互斥量。
这是我的理解,我现在无法试验一下。
另外,互斥量的拥有者是线程,所以要使ReleaseMutex调用成功,必须保证调用
ReleaseMutex的线程拥有此互斥量。在WlxLoggedOnSAS 中,你在CloseHandle
后调用ReleaseMutex是不会成功的。
若是后者,则程序该是:
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"_ac952_z_cn_CTRL_ALT_DEL");
if (hMutex)
{
CloseHandle(hMutex);
WriteInfo("disble CTRL+ALT+DEL \r\n");
return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
}
else
WriteInfo("not disble CTRL+ALT+DEL \r\n");
}
return prcWlxLoggedOnSAS (pWlxContext,dwSasType,pReserved);因为在你关闭执行HANDLE hMutex = CreateMutex(NULL, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");这句的程序前,建立的Mutex都将存在。
我也试验了一下
你说的是正确的
但我不懂在if(hMutex){……}中通知
在系统一启动即屏蔽CTRL+ALT+DEL
然后在我的程序里实现对CTRL+ALT+DEL的屏蔽解除
但我希望只让CTRL+ALT+DEL只执行一次
若想再对CTRL+ALT+DEL的屏蔽解除
又必须在我的程序控制
不再屏蔽CTRL+ALT+DEL了。
我明白你的意思
可惜我做不到
往某个进程发送自定义消息不容易
明白你的意思,我想你该这样来实现:1、建立互斥量(GINA和你的程序都该有这句,因为若互斥量已经存在还是会返回互斥量的句柄)
HANDLE hMutex = CreateMutex(NULL, FALSE, "CTRL_ALT_DEL_A");
并打开互斥量(OpenMutex);2、GINA建立一个线程,循环调用WaitForSingleObject来得到互斥量的控制权,
若能得到控制权,则认为enable CTRL+ALT+DEL;若得不到,则认为disble CTRL+ALT+DEL。可用一个变量来记下来,如enableCTRLALDEL =true。3、若得到控制权,在WlxLoggedOnSAS被调用时 ,执行
ReleaseMutex(hMutex);
enableCTRLALDEL =false;
return prcWlxLoggedOnSAS (pWlxContext,dwSasType,pReserved);
4、这样你只要在你的另外一个程序里控制互斥量的控制权就行了。建立一个线程循环调用WaitForSingleObject来得到互斥量的控制权,因为GINA一执行ReleaseMutex(hMutex)完,互斥量就被你控制了,你想enable CTRL+ALT+DEL,只要释放就行。
这样需要两个线程一直运行,当然你也可以建两个互斥量来标记状态,就不用两头不断循环检测了,我还没有仔细考虑,应该是可以的。