📄 uiotest.c
字号:
IOCTL_NDISPROT_OPEN_DEVICE,
(LPVOID)&wNdisDeviceName[0],
wNameLength*sizeof(WCHAR),
NULL,
0,
&BytesReturned,
NULL));
}
BOOL
GetSrcMac(
HANDLE Handle,
PUCHAR pSrcMacAddr
)
{
DWORD BytesReturned;
BOOLEAN bSuccess;
UCHAR QueryBuffer[sizeof(NDISPROT_QUERY_OID) + MAC_ADDR_LEN];
PNDISPROT_QUERY_OID pQueryOid;
DEBUGP(("Trying to get src mac address\n"));
pQueryOid = (PNDISPROT_QUERY_OID)&QueryBuffer[0];
pQueryOid->Oid = OID_802_3_CURRENT_ADDRESS;
bSuccess = (BOOLEAN)DeviceIoControl(
Handle,
IOCTL_NDISPROT_QUERY_OID_VALUE,
(LPVOID)&QueryBuffer[0],
sizeof(QueryBuffer),
(LPVOID)&QueryBuffer[0],
sizeof(QueryBuffer),
&BytesReturned,
NULL);
if (bSuccess)
{
DEBUGP(("GetSrcMac: IoControl success, BytesReturned = %d\n",
BytesReturned));
memcpy(pSrcMacAddr, pQueryOid->Data, MAC_ADDR_LEN);
}
else
{
DEBUGP(("GetSrcMac: IoControl failed: %d\n", GetLastError()));
}
return (bSuccess);
}
VOID
DoReadProc(
HANDLE Handle
)
{
PUCHAR pReadBuf = NULL;
INT ReadCount = 0;
BOOLEAN bSuccess;
ULONG BytesRead;
DEBUGP(("DoReadProc\n"));
do
{
pReadBuf = malloc(PacketLength);
if (pReadBuf == NULL)
{
PRINTF(("DoReadProc: failed to alloc %d bytes\n", PacketLength));
break;
}
ReadCount = 0;
while (TRUE)
{
bSuccess = (BOOLEAN)ReadFile(
Handle,
(LPVOID)pReadBuf,
PacketLength,
&BytesRead,
NULL);
if (!bSuccess)
{
PRINTF(("DoReadProc: ReadFile failed on Handle %p, error %x\n",
Handle, GetLastError()));
break;
}
ReadCount++;
DEBUGP(("DoReadProc: read pkt # %d, %d bytes\n", ReadCount, BytesRead));
if ((NumberOfPackets != -1) && (ReadCount == NumberOfPackets))
{
break;
}
}
}
while (FALSE);
if (pReadBuf)
{
free(pReadBuf);
}
PRINTF(("DoReadProc finished: read %d packets\n", ReadCount));
}
VOID
DoWriteProc(
HANDLE Handle
)
{
PUCHAR pWriteBuf = NULL;
PUCHAR pData;
UINT i;
INT SendCount;
PETH_HEADER pEthHeader;
DWORD BytesWritten;
BOOLEAN bSuccess;
DEBUGP(("DoWriteProc\n"));
SendCount = 0;
do
{
pWriteBuf = malloc(PacketLength);
if (pWriteBuf == NULL)
{
DEBUGP(("DoWriteProc: Failed to malloc %d bytes\n", PacketLength));
break;
}
pEthHeader = (PETH_HEADER)pWriteBuf;
pEthHeader->EthType = EthType;
if (bUseFakeAddress)
{
memcpy(pEthHeader->SrcAddr, FakeSrcMacAddr, MAC_ADDR_LEN);
}
else
{
memcpy(pEthHeader->SrcAddr, SrcMacAddr, MAC_ADDR_LEN);
}
memcpy(pEthHeader->DstAddr, DstMacAddr, MAC_ADDR_LEN);
pData = (PUCHAR)(pEthHeader + 1);
for (i = 0; i < PacketLength - sizeof(ETH_HEADER); i++)
{
*pData++ = (UCHAR)i;
}
SendCount = 0;
while (TRUE)
{
bSuccess = (BOOLEAN)WriteFile(
Handle,
pWriteBuf,
PacketLength,
&BytesWritten,
NULL);
if (!bSuccess)
{
PRINTF(("DoWriteProc: WriteFile failed on Handle %p\n", Handle));
break;
}
SendCount++;
DEBUGP(("DoWriteProc: sent %d bytes\n", BytesWritten));
if ((NumberOfPackets != -1) && (SendCount == NumberOfPackets))
{
break;
}
}
}
while (FALSE);
if (pWriteBuf)
{
free(pWriteBuf);
}
PRINTF(("DoWriteProc: finished sending %d packets of %d bytes each\n",
SendCount, PacketLength));
}
VOID
EnumerateDevices(
HANDLE Handle
)
{
CHAR Buf[1024];
DWORD BufLength = sizeof(Buf);
DWORD BytesWritten;
DWORD i;
PNDISPROT_QUERY_BINDING pQueryBinding;
pQueryBinding = (PNDISPROT_QUERY_BINDING)Buf;
i = 0;
for (pQueryBinding->BindingIndex = i;
/* NOTHING */;
pQueryBinding->BindingIndex = ++i)
{
if (DeviceIoControl(
Handle,
IOCTL_NDISPROT_QUERY_BINDING,
pQueryBinding,
sizeof(NDISPROT_QUERY_BINDING),
Buf,
BufLength,
&BytesWritten,
NULL))
{
PRINTF(("%2d. %ws\n - %ws\n",
pQueryBinding->BindingIndex,
(WCHAR *)((PUCHAR)pQueryBinding + pQueryBinding->DeviceNameOffset),
(WCHAR *)((PUCHAR )pQueryBinding + pQueryBinding->DeviceDescrOffset)));
memset(Buf, 0, BufLength);
}
else
{
ULONG rc = GetLastError();
if (rc != ERROR_NO_MORE_ITEMS)
{
PRINTF(("EnumerateDevices: terminated abnormally, error %d\n", rc));
}
break;
}
}
}
VOID __cdecl
main(
INT argc,
CHAR *argv[]
)
{
HANDLE DeviceHandle;
DeviceHandle = INVALID_HANDLE_VALUE;
do
{
if (!GetOptions(argc, argv))
{
PrintUsage();
break;
}
DeviceHandle = OpenHandle(pNdisProtDevice);
if (DeviceHandle == INVALID_HANDLE_VALUE)
{
PRINTF(("Failed to open %s\n", pNdisProtDevice));
break;
}
if (DoEnumerate)
{
EnumerateDevices(DeviceHandle);
break;
}
if (!OpenNdisDevice(DeviceHandle, pNdisDeviceName))
{
PRINTF(("Failed to access %s\n", pNdisDeviceName));
break;
}
DEBUGP(("Opened device %s successfully!\n", pNdisDeviceName));
if (!GetSrcMac(DeviceHandle, SrcMacAddr))
{
PRINTF(("Failed to obtain local MAC address\n"));
break;
}
DEBUGP(("Got local MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
SrcMacAddr[0],
SrcMacAddr[1],
SrcMacAddr[2],
SrcMacAddr[3],
SrcMacAddr[4],
SrcMacAddr[5]));
if (!bDstMacSpecified)
{
memcpy(DstMacAddr, SrcMacAddr, MAC_ADDR_LEN);
}
if (DoReads)
{
DoReadProc(DeviceHandle);
}
else
{
DoWriteProc(DeviceHandle);
DoReadProc(DeviceHandle);
}
}
while (FALSE);
if (DeviceHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(DeviceHandle);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -