假设我们自己设计了一个 Blocking Hook 函式叫 myblockinghook(),那麽在程式中向 Winsock 系统注册的方法如下:(其中 _hInst 代表此 task 的 Instance)
FARPROC lpmybkhook = NULL;
lpmybkhook = MakeProcInstance( (FARPROC)myblockinghook, _hInst) );
WSASetBlockingHook( (FARPROC)lpmybkhook );
(图 2.)设定自己的 Blocking Hook 函式
我们在设定自己的 Blocking Hook 程式後,仍可以利用 WSAUnhookBlockingHook() 函式,来取消我们设定的 Blocking Hook 函式,而变更回原先系统内定的 Blocking Hook 函式。
◎ WSAUnhookBlockingHook():复原系统预设的 blocking hook 函式。
格式: int PASCAL FAR WSAUnhookBlockingHook( void )
参数: 无
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式取消使用者设定的 blocking hook 函式,而回复系统原先预设的 blocking hook 函式。
最後笔者要再说明一点,一个应用程式所设定的 Blocking Hook 函式,只会被这个应用程式所使用;其他的应用程式并不会执行到您设定的 Blocking Hook 函式的。另外,若非极有必要,最好是不要任意变更系统的 Blocking Hook 函式;因为一旦您没有设计好的话,整个 Windows 环境可能就完蛋了。
(图 3.)使用自己的 Blocking Hook 函式时该注意事项
【结语】
四期的「Winsock 应用程式设计篇」在此结束了;笔者除了介绍 Winsock API 外,也将自己亲身设计 winsock.dll 的经验与各位读者分享了;希望这几期的文章,对於国内想要在 Winsock 1.1 环境上开发网路应用程式的读者有些许的帮助。谢谢大家。