⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ethsock.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 4 页
字号:
#define new PNEW/////////////////////////////////////////////////////////////////////////////PWin32AsnAny::PWin32AsnAny(){  asnType = ASN_INTEGER;  asnValue.number = 0;}void PWin32AsnAny::MemFree(){  switch (asnType) {    case ASN_OCTETSTRING :      SnmpUtilMemFree(asnValue.string.stream);      break;#ifdef ASN_BITS    case ASN_BITS :      SnmpUtilMemFree(asnValue.bits.stream);      break;#endif    case ASN_OBJECTIDENTIFIER :      SnmpUtilMemFree(asnValue.object.ids);      break;    case ASN_SEQUENCE :      SnmpUtilMemFree(asnValue.sequence.stream);      break;    case ASN_IPADDRESS :      SnmpUtilMemFree(asnValue.address.stream);      break;#ifdef ASN_OPAQUE    case ASN_OPAQUE :      SnmpUtilMemFree(asnValue.arbitrary.stream);      break;#endif  }  asnType = ASN_INTEGER;}BOOL PWin32AsnAny::GetInteger(AsnInteger & i){  if (asnType != ASN_INTEGER)    return FALSE;  i = asnValue.number;  return TRUE;}BOOL PWin32AsnAny::GetIpAddress(PIPSocket::Address & addr){  if (asnType != ASN_IPADDRESS || asnValue.address.stream == NULL)    return FALSE;  addr = PIPSocket::Address(asnValue.address.length, asnValue.address.stream);  return TRUE;}///////////////////////////////////////////////////////////////////////////////PWin32AsnOid::PWin32AsnOid(){  ids = NULL;  idLength = 0;}PWin32AsnOid::PWin32AsnOid(const char * str){  idLength = 0;  ids = NULL;  AsnObjectIdentifier oid;  oid.idLength = 0;  const char * dot = strchr(str, '.');  while (dot != NULL) {    oid.idLength++;    dot = strchr(dot+1, '.');  }  if (oid.idLength > 0) {    oid.ids = new UINT[++oid.idLength];    char * next = (char *)str;    for (UINT i = 0; i < oid.idLength; i++) {      oid.ids[i] = strtoul(next, &next, 10);      if (*next != '.')        break;      next++;    }    if (*next == '\0')      SnmpUtilOidCpy(this, &oid);    delete [] oid.ids;  }}PWin32AsnOid & PWin32AsnOid::operator=(const AsnObjectIdentifier & oid){  ids = oid.ids;  idLength = oid.idLength;  return *this;}///////////////////////////////////////////////////////////////////////////////PWin32SnmpLibrary::PWin32SnmpLibrary()#ifndef _WIN32_WCE  : PDynaLink("inetmib1.dll")#endif{#ifndef _WIN32_WCE  HANDLE hEvent;  AsnObjectIdentifier baseOid;  if (!GetFunction("SnmpExtensionInit", (Function &)_Init) ||      !GetFunction("SnmpExtensionQuery", (Function &)_Query)) {    Close();    PTRACE(1, "PWlib\tInvalid DLL: inetmib1.dll");  }  else if (!Init(0, &hEvent, &baseOid)) {    PTRACE(1, "PWlib\tCould not initialise SNMP DLL: error=" << ::GetLastError());    Close();  }#else  _Init = SnmpExtensionInit; // do not call Init as we dont'have Close   _Query = SnmpExtensionQuery;#endif}BOOL PWin32SnmpLibrary::GetOid(AsnObjectIdentifier & oid, AsnInteger & value){  //if (!IsLoaded())  //  return FALSE;  PWin32AsnAny any;  if (!GetOid(oid, any))    return FALSE;  return any.GetInteger(value);}BOOL PWin32SnmpLibrary::GetOid(AsnObjectIdentifier & oid, PIPSocket::Address & value){  //if (!IsLoaded())  //  return FALSE;  PWin32AsnAny any;  if (!GetOid(oid, any))    return FALSE;  return any.GetIpAddress(value);}BOOL PWin32SnmpLibrary::GetOid(AsnObjectIdentifier & oid, PString & str){  //if (!IsLoaded())  //  return FALSE;  PWin32AsnAny any;  if (!GetOid(oid, any))    return FALSE;  if (any.asnType != ASN_OCTETSTRING)    return FALSE;  str = PString((char *)any.asnValue.string.stream, any.asnValue.string.length);  return TRUE;}BOOL PWin32SnmpLibrary::GetOid(AsnObjectIdentifier & oid, void * value, UINT valSize, UINT * len){  //if (!IsLoaded())  //  return FALSE;  PWin32AsnAny any;  if (!GetOid(oid, any))    return FALSE;  if (any.asnType != ASN_OCTETSTRING)    return FALSE;  if (len != NULL)    *len = any.asnValue.string.length;  if (any.asnValue.string.length > valSize)    return FALSE;  memcpy(value, any.asnValue.string.stream, any.asnValue.string.length);  if (valSize > any.asnValue.string.length)    ((char *)value)[any.asnValue.string.length] = '\0';  return TRUE;}BOOL PWin32SnmpLibrary::QueryOid(BYTE cmd, AsnObjectIdentifier & oid, PWin32AsnAny & value){  //if (!IsLoaded())  //  return FALSE;  value.MemFree();  SnmpVarBindList vars;  vars.len = 1;  vars.list = (SnmpVarBind*)SnmpUtilMemAlloc(sizeof(SnmpVarBind));  if (vars.list == NULL)    return FALSE;  vars.list->name = oid;  vars.list->value = value;  AsnInteger status, error;  if (Query(cmd, &vars, &status, &error) && status == SNMP_ERRORSTATUS_NOERROR) {    (AsnAny&)value = vars.list->value; // Use cast so does simple copy    oid = vars.list->name;  }  SnmpUtilMemFree(vars.list);  return status == SNMP_ERRORSTATUS_NOERROR;}PString PWin32SnmpLibrary::GetInterfaceName(int ifNum){  PIPSocket::Address gwAddr = 0;  gwAddr = GetInterfaceAddress(ifNum);  if (gwAddr == 0)    return PString::Empty();  PString name = GetInterfaceName(gwAddr);  if (name.IsEmpty()) {    PWin32AsnOid nameOid = "1.3.6.1.2.1.2.2.1.2.0";    nameOid[10] = ifNum;    if (GetOid(nameOid, name.GetPointer(100), 100))      name.MakeMinimumSize();  }  return name;}PString PWin32SnmpLibrary::GetInterfaceName(PIPSocket::Address ipAddr){  PString gatewayInterface, anInterface;  PWin32PacketDriver * tempDriver = PWin32PacketDriver::Create();  PINDEX ifIdx = 0;  while (gatewayInterface.IsEmpty() && tempDriver->EnumInterfaces(ifIdx++, anInterface)) {    if (tempDriver->BindInterface(anInterface)) {      PIPSocket::Address ifAddr, ifMask;      PINDEX ipIdx = 0;      if (tempDriver->EnumIpAddress(ipIdx++, ifAddr, ifMask) && ifAddr == ipAddr) {        gatewayInterface = anInterface;        break;      }    }  }  delete tempDriver;  return gatewayInterface;}PIPSocket::Address PWin32SnmpLibrary::GetInterfaceAddress(int ifNum){  PIPSocket::Address gwAddr = 0;  PWin32AsnOid baseOid = "1.3.6.1.2.1.4.20.1";  PWin32AsnOid oid = baseOid;  PWin32AsnAny value;  while (GetNextOid(oid, value)) {    if (!(baseOid *= oid))      break;    if (value.asnType != ASN_IPADDRESS)      break;    oid[9] = 2;    AsnInteger ifIndex = -1;    if (!GetOid(oid, ifIndex) || ifIndex < 0)      break;    if (ifIndex == ifNum) {      value.GetIpAddress(gwAddr);      break;    }    oid[9] = 1;  }  return gwAddr;}/*PWin32SnmpLibrary & PWin32SnmpLibrary::Current(){  static PWin32SnmpLibrary instance;  return instance;}*////////////////////////////////////////////////////////////////////////////////PWin32OidBuffer::PWin32OidBuffer(UINT oid, UINT len, const BYTE * data){  size = sizeof(DWORD)*2 + len;  buffer = new DWORD[(size+sizeof(DWORD)-1)/sizeof(DWORD)];  buffer[0] = oid;  buffer[1] = len;  if (data != NULL)    memcpy(&buffer[2], data, len);}void PWin32OidBuffer::Move(BYTE * data, DWORD received){  memcpy(data, &buffer[2], received-sizeof(DWORD)*2);}///////////////////////////////////////////////////////////////////////////////PWin32PacketDriver * PWin32PacketDriver::Create(){  OSVERSIONINFO info;  info.dwOSVersionInfoSize = sizeof(info);  GetVersionEx(&info);#ifndef _WIN32_WCE  if (info.dwPlatformId == VER_PLATFORM_WIN32_NT)    return new PWin32PacketSYS;  else    return new PWin32PacketVxD;#else    return new PWin32PacketCe;#endif}PWin32PacketDriver::PWin32PacketDriver(){  hDriver = INVALID_HANDLE_VALUE;  dwError = ERROR_OPEN_FAILED;}PWin32PacketDriver::~PWin32PacketDriver(){  Close();}void PWin32PacketDriver::Close(){  if (hDriver != INVALID_HANDLE_VALUE) {	CloseHandle(hDriver);    hDriver = INVALID_HANDLE_VALUE;  }}BOOL PWin32PacketDriver::IsOpen() const{  return hDriver != INVALID_HANDLE_VALUE;}DWORD PWin32PacketDriver::GetLastError() const{  return dwError;}BOOL PWin32PacketDriver::IoControl(UINT func,                              const void * input, DWORD inSize,                              void * output, DWORD outSize, DWORD & received){  PWin32Overlapped overlap;  if (DeviceIoControl(hDriver, func,                      (LPVOID)input, inSize, output, outSize,                      &received, &overlap)) {    dwError = ERROR_SUCCESS;    return TRUE;  }  dwError = ::GetLastError();  if (dwError != ERROR_IO_PENDING)    return FALSE;  return CompleteIO(received, overlap);}BOOL PWin32PacketDriver::CompleteIO(DWORD & received, PWin32Overlapped & overlap){#ifndef _WIN32_WCE  received = 0;  if (GetOverlappedResult(hDriver, &overlap, &received, TRUE)) {    dwError = ERROR_SUCCESS;    return TRUE;  }  dwError = ::GetLastError();  return FALSE;#else  return TRUE;#endif}BOOL PWin32PacketDriver::QueryOid(UINT oid, UINT len, BYTE * data){  PWin32OidBuffer buf(oid, len);  DWORD rxsize = 0;  if (!IoControl(GetQueryOidCommand(oid), buf, buf, buf, buf, rxsize))    return FALSE;  if (rxsize == 0)    return FALSE;  buf.Move(data, rxsize);  return TRUE;}BOOL PWin32PacketDriver::QueryOid(UINT oid, DWORD & data){  DWORD oidData[3];  oidData[0] = oid;  oidData[1] = sizeof(data);  oidData[2] = 0x12345678;  DWORD rxsize = 0;  if (!IoControl(GetQueryOidCommand(oid),                 oidData, sizeof(oidData),                 oidData, sizeof(oidData),                 rxsize))    return FALSE;  if (rxsize == 0)    return FALSE;  data = oidData[2];  return TRUE;}BOOL PWin32PacketDriver::SetOid(UINT oid, UINT len, const BYTE * data){  DWORD rxsize = 0;  PWin32OidBuffer buf(oid, len, data);  return IoControl(IOCTL_EPACKET_SET_OID, buf, buf, buf, buf, rxsize);}BOOL PWin32PacketDriver::SetOid(UINT oid, DWORD data){  DWORD oidData[3];  oidData[0] = oid;  oidData[1] = sizeof(data);  oidData[2] = data;  DWORD rxsize;  return IoControl(IOCTL_EPACKET_SET_OID,                   oidData, sizeof(oidData), oidData, sizeof(oidData), rxsize);}static BOOL RegistryQueryMultiSz(RegistryKey & registry,                                 const PString & variable,                                 PINDEX idx,                                 PString & value){  PString allValues;  if (!registry.QueryValue(variable, allValues))    return FALSE;  const char * ptr = allValues;  while (*ptr != '\0' && idx-- > 0)    ptr += strlen(ptr)+1;  if (*ptr == '\0')    return FALSE;  value = ptr;  return TRUE;}///////////////////////////////////////////////////////////////////////////////BOOL PWin32PacketVxD::EnumInterfaces(PINDEX idx, PString & name){  static const PString RegBase = SERVICES_REGISTRY_KEY "Class\\Net";  PString keyName;  RegistryKey registry(RegBase, RegistryKey::ReadOnly);  if (!registry.EnumKey(idx, keyName))    return FALSE;  PString description;  RegistryKey subkey(RegBase + "\\" + keyName, RegistryKey::ReadOnly);  if (subkey.QueryValue("DriverDesc", description))    name = keyName + ": " + description;  else    name = keyName;  return TRUE;}static PString SearchRegistryKeys(const PString & key,                                  const PString & variable,                                  const PString & value){  RegistryKey registry(key, RegistryKey::ReadOnly);  PString str;  if (registry.QueryValue(variable, str) && (str *= value))    return key;  for (PINDEX idx = 0; registry.EnumKey(idx, str); idx++) {    PString result = SearchRegistryKeys(key + str + '\\', variable, value);    if (!result)      return result;  }  return PString::Empty();}BOOL PWin32PacketVxD::BindInterface(const PString & interfaceName){#ifndef _WIN32_WCE  BYTE buf[20];  DWORD rxsize;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -