系统通过使用计数来管理系统核心对象,当某核心对象的使用计数为0时,系统便释放此对象。当你调用CreateMutex是创立一个互斥量并使其使用计数为1,当你在
WlxLoggedOnSAS 中当调用OpenMutex成功时使其使用计数为2,然后你使用
CloseHandle使其计数变为1,所以此互斥量一直没用释放。
因此,当你再次调用OpenMutex时总是返回你当前创建的互斥量的句柄,就一直
不会屏蔽CTRL+ALT+DEL.现在你要做的是在
if(hMutex){……}中通知你的程序调用CloseHandle及时释放那个互斥量。
这是我的理解,我现在无法试验一下。
另外,互斥量的拥有者是线程,所以要使ReleaseMutex调用成功,必须保证调用
ReleaseMutex的线程拥有此互斥量。在WlxLoggedOnSAS 中,你在CloseHandle
后调用ReleaseMutex是不会成功的。

解决方案 »

  1.   

    楼上说的是对的,不知道你要实现的是什么功能,是在由其它程序切换是否屏蔽(即按一下屏蔽一次)?还是ctrl+alt+del执行一次后就永远不让执行了?若是前者,则要求使用ReleaseMutex和WaitForMultipleObjects等函数来操作互斥量,
    若是后者,则程序该是:
    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都将存在。
      

  2.   

    多谢指点
    我也试验了一下
    你说的是正确的
    但我不懂在if(hMutex){……}中通知
      

  3.   

    我的意思
    在系统一启动即屏蔽CTRL+ALT+DEL
    然后在我的程序里实现对CTRL+ALT+DEL的屏蔽解除
    但我希望只让CTRL+ALT+DEL只执行一次
    若想再对CTRL+ALT+DEL的屏蔽解除
    又必须在我的程序控制
      

  4.   

    Win9.X下有没有GINA.DLL一样的东东,Win9.X的登录安全太差了。
      

  5.   

    我的意思是你可以通过发消息或其他方式通知你的应用程序来释放你创建的互斥量,而代码就加在if(hMutex){……}中。这样以后你再次运行你的程序就可以
    不再屏蔽CTRL+ALT+DEL了。
      

  6.   

    to qgw_2000:
    我明白你的意思
    可惜我做不到
    往某个进程发送自定义消息不容易
      

  7.   

    究竟是谁的意思啊?? 哈哈……to WJL_2001:
    明白你的意思,我想你该这样来实现: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,只要释放就行。
    这样需要两个线程一直运行,当然你也可以建两个互斥量来标记状态,就不用两头不断循环检测了,我还没有仔细考虑,应该是可以的。