Речь идет о перехвате TDI_SEND и подмене Irp->MdlAddress (в продолжении *моего* предыдущего поста о проблемах редиректа в TDI_CONNECT, там сошлись на странностях поведения некоторых web-серверов и необходимости подмены "на лету" данных в TDI_SEND, в частности поля "Host"). Собственно это я хочу реализовать. Шеф поставил такую задачу — при посещении развлекательных сайтов организовать скрытый редирект на какой-нибудь нейтральный сайт.
static const char Data[] = "GET / HTTP/1.1\r\n"
"Host: www.rambler.ru\r\n"
"Connection: close\r\n"
"\r\n";
NTSTATUS TdiSend(IN PDEVICE_EXTENSION pde, IN PIRP pIrp, IN PIO_STACK_LOCATION stack)
{
NTSTATUS status;
void* p;
PUCHAR pAddress, pDstDddress;
ULONG r;
PMDL pDstMdl, pSrcMdl;
MappedAddress = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
p = strstr((PCCHAR)MappedAddress, "Host: www.sex.com");
if(p != NULL & glRedirectFlag == TRUE)
{
pSrcMdl = IoAllocateMdl((PVOID)&Data, 2048, FALSE, FALSE, NULL);
if(pSrcMdl)
{
MmBuildMdlForNonPagedPool(pSrcMdl);
pAddress = MmGetSystemAddressForMdlSafe(pSrcMdl, NormalPagePriority);
__try
{
pDstDddress = MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority);
if (pDstDddress)
{
memset(pDstDddress, 0, 2048);
for (r = 0; r < 2048; r++)
{
if (MmIsAddressValid(pAddress))
*pDstDddress = *pAddress;
pAddress++;
pDstDddress++;
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER){}
IoFreeMdl(pSrcMdl);
}
}
try
{
IoCopyCurrentIrpStackLocationToNext(pIrp);
IoSetCompletionRoutine(pIrp, DefaultCompletionRoutine, pde, TRUE, TRUE, TRUE);
status = IoCallDriver(pde->LowerDeviceObject, pIrp);
}
finally{}
return status;
}
C "r = 1" ступил, каюсь. Переменная glRedirectFlag устанавливается в TRUE при отлове "плохих" IP-адресов в обработчике TDI_CONNECT.