static long Verify(long size, long offset, MemoryStream* backingStore, long packetSize) { long ret = -1; try { backingStore->setSize(size + offset); } catch (...) { esReport("Caught an exception.\n"); return -1; } es::Cache* cache = es::Cache::createInstance(backingStore); if (!cache) { esReport("Unable to create cache.\n"); return -1; } es::Stream* stream = cache->getStream(); if (!stream) { esReport("Unable to create stream.\n"); return -1; } SetData(WriteBuf, size); // write, changing number of packets. ret = PacketWrite(stream, size, offset, packetSize); stream->flush(); stream->release(); cache->release(); // read at once. cache = es::Cache::createInstance(backingStore); stream = cache->getStream(); ret = stream->read(ReadBuf, size, offset); if (ret != size) { ret = -1; goto ERROR; } #ifdef VERBOSE esReport(" read : %5d\n", ret); #endif // VERBOSE if (memcmp(ReadBuf, WriteBuf, ret) != 0) { ret = -1; } else { ret = 0; } ERROR: stream->release(); cache->release(); return ret; }
DWORD _stdcall PacketIOControl(DWORD dwService, DWORD dwDDB, DWORD hDevice, PDIOCPARAMETERS pDiocParms) { // called from applications POPEN_INSTANCE Open; NDIS_STATUS Status; UCHAR AdapterBuffer[5]; NDIS_STRING AdapterName = NDIS_STRING_CONST(AdapterBuffer); switch (dwService) { case DIOC_OPEN: return NDIS_STATUS_SUCCESS; case DIOC_CLOSEHANDLE: if ((Open = GetOpen(hDevice)) != NULL) PacketUnbindAdapter(&Status, Open, NULL); return NDIS_STATUS_SUCCESS; case IOCTL_EPACKET_VERSION: if (pDiocParms->cbOutBuffer < 2) *(DWORD *)(pDiocParms->lpcbBytesReturned) = 0; else { ((BYTE *)pDiocParms->lpvOutBuffer)[0] = MAJOR_VERSION; ((BYTE *)pDiocParms->lpvOutBuffer)[1] = MINOR_VERSION; *(DWORD *)pDiocParms->lpcbBytesReturned = 2; } return NDIS_STATUS_SUCCESS; case IOCTL_EPACKET_BIND: memcpy(AdapterName.Buffer, (BYTE *)pDiocParms->lpvInBuffer, min(strlen((char *)pDiocParms->lpvInBuffer), sizeof(AdapterBuffer)-1)); AdapterName.Buffer[sizeof(AdapterBuffer)-1] = '\0'; PacketBindAdapter(&Status, GlobalDeviceExtension->NdisProtocolHandle, &AdapterName, (PVOID)hDevice, /* special */ NULL); // Note: If the above usage of the 4'th arg to PacketBindAdapter // causes problems, use a global variable instead. if (Status == NDIS_STATUS_SUCCESS || Status == NDIS_STATUS_PENDING) { *(DWORD *)pDiocParms->lpcbBytesReturned = 1; return NDIS_STATUS_SUCCESS; } break; case IOCTL_EPACKET_SET_OID: case IOCTL_EPACKET_QUERY_OID: if ((Open = GetOpen(hDevice)) != NULL) return PacketRequest(Open, dwService, dwDDB, hDevice, pDiocParms); break; case IOCTL_EPACKET_READ: if ((Open = GetOpen(hDevice)) != NULL) return PacketRead(Open, dwDDB, hDevice, pDiocParms); break; case IOCTL_EPACKET_WRITE: if ((Open = GetOpen(hDevice)) != NULL) return PacketWrite(Open, dwDDB, hDevice, pDiocParms); break; } *(DWORD *)pDiocParms->lpcbBytesReturned = 0; return NDIS_STATUS_SUCCESS; }