ptutils.cpp
上传用户:jencksen
上传日期:2016-04-08
资源大小:66k
文件大小:2k
源码类别:

ICQ弱点检测代码

开发平台:

Visual C++

  1. //////////////////////////////////////////////
  2. // ptutils.cpp文件
  3. #include <windows.h>
  4. #include <winioctl.h>
  5. #include <ntddndis.h>
  6. #include <stdio.h>
  7. #include <tchar.h>
  8. #include "../driver/IOCOMMON.h"
  9. #include "ptutils.h"
  10. HANDLE PtOpenControlDevice()
  11. {
  12. // 打开到驱动程序所控制设备的句柄
  13. HANDLE hFile = ::CreateFile(
  14. _T("\\.\PassThru"),
  15. GENERIC_READ | GENERIC_WRITE,
  16. 0,
  17. NULL,
  18. OPEN_EXISTING,
  19. FILE_ATTRIBUTE_NORMAL,
  20. NULL);
  21. return hFile;
  22. }
  23. HANDLE PtOpenAdapter(PWSTR pszAdapterName)
  24. {
  25. // 打开控制设备对象句柄
  26. HANDLE hAdapter = PtOpenControlDevice();
  27. if(hAdapter == INVALID_HANDLE_VALUE)
  28. return INVALID_HANDLE_VALUE;
  29. // 确定适配器名称的长度
  30. int nBufferLength = wcslen((PWSTR)pszAdapterName) * sizeof(WCHAR);
  31. // 发送IOCTL_PTUSERIO_OPEN_ADAPTER控制代码,打开适配器上下文
  32. DWORD dwBytesReturn;
  33. BOOL bOK = ::DeviceIoControl(hAdapter, IOCTL_PTUSERIO_OPEN_ADAPTER, 
  34. pszAdapterName, nBufferLength, NULL, 0, &dwBytesReturn, NULL);
  35. // 检查结果
  36. if(!bOK)
  37. {
  38. ::CloseHandle(hAdapter);
  39. return INVALID_HANDLE_VALUE;
  40. }
  41. return hAdapter;
  42. }
  43. BOOL PtAdapterRequest(HANDLE hAdapter, PPTUSERIO_OID_DATA pOidData, BOOL bQuery)
  44. {
  45. if(hAdapter == INVALID_HANDLE_VALUE)
  46. return FALSE;
  47. // 发送IOCTL
  48. DWORD dw;
  49. int bRet = ::DeviceIoControl(
  50. hAdapter, bQuery ? IOCTL_PTUSERIO_QUERY_OID : IOCTL_PTUSERIO_SET_OID,
  51. pOidData, sizeof(PTUSERIO_OID_DATA) -1 + pOidData->Length,
  52. pOidData, sizeof(PTUSERIO_OID_DATA) -1 + pOidData->Length, &dw, NULL);
  53. return bRet;
  54. }
  55. //////////////////////////////////////
  56. BOOL CIMAdapters::EnumAdapters(HANDLE hControlDevice)
  57. {
  58. DWORD dwBufferLength = sizeof(m_buffer);
  59. BOOL bRet = ::DeviceIoControl(hControlDevice, IOCTL_PTUSERIO_ENUMERATE, 
  60. NULL, 0, m_buffer, dwBufferLength, &dwBufferLength, NULL);
  61. if(!bRet)
  62. return FALSE;
  63. // 保存适配器数量
  64. m_nAdapters = (ULONG)((ULONG*)m_buffer)[0];
  65. // 下面从m_buffer中获取适配器名称和符号连接名称
  66. // 指向设备名称
  67. WCHAR *pwsz = (WCHAR *)((ULONG *)m_buffer + 1);
  68. int i = 0;
  69. m_pwszVirtualName[i] = pwsz;
  70. while(*(pwsz++) != NULL)
  71. {
  72. while(*(pwsz++) != NULL)
  73. { ; }
  74. m_pwszAdapterName[i] = pwsz;
  75. while(*(pwsz++) != NULL)
  76. { ; }
  77. if(++i >= MAX_ADAPTERS)
  78. break;
  79. m_pwszVirtualName[i] = pwsz;
  80. }
  81. return TRUE;
  82. }