Problems In encrypting Packet Data in NDIS IM Filter Driver.

Hi ,
We r tring to encript the data going to perticular machine…as u
adviced us last week. Here we allocated new buffer and prepairing the
packet and adding new buffer descriptor to this packet.
Since we don’t have Soft ICE , we r finding it dificult to debug the
code So we used DbgView and added few dbgprint() statements.We r not able
to print data before encryption. Do we need to modify any other
message handlers.

//Here is our code snap shot…Please suggest what is wrong in it.
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
/*
Routine Description:
Send handler. Just re-wrap the packet and send it below. Re-wrapping is necessary since
NDIS uses the WrapperReserved for its own use.
LBFO- All sends will be done in the secondary miniport of the bundle.
We are using the Secondary Miniport as the Send path. All sends should use that pAdapt structure.
Arguments:
MiniportAdapterContext Pointer to the adapter
Packet Packet to send
Flags Unused, passed down below
Return Value:
Return code from NdisSend
*/
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
//PNDIS_PACKET MyPacket;
//PRSVD Rsvd;
PVOID MediaSpecificInfo = NULL;
ULONG MediaSpecificInfoSize = 0;
// ADDED BY CAIR
// retrieve the IP packet header information

#define szPayloadCopy ETH_MAX_PACKET_SIZE
char PayloadCopy[szPayloadCopy];
pEthHdr pETH;
pIPHdr pIPH;
pTCPHdr pTCPH;

KIRQL OldIrql;
pEncapPktHdr pEncPkt;
NDIS_STATUS lclStatus;
USHORT usIPHdr,usTCPHdr,usNewHdrs;

PNDIS_PACKET pPacket, pMyPacket;
PNDIS_BUFFER pNewNdisBfr;
ULONG ulOrigPayload, ulNewPayload;
PUCHAR pCurr,
pEnd,
pNewPayload = NULL;
ULONG ulDataLen = 0 ;
char msg[1000];
memset(msg,0,1000);

// CAIR END

//
// According to our LBFO design, all sends will be performed on the secondary miniport
// However, the must be completed on the primary’s miniport handle
//

DBGPRINT(“***** CAIR- INSIDE MPSEND ***********”);
ASSERT (pAdapt->pSecondaryAdapt);

pAdapt = pAdapt->pSecondaryAdapt;

if (IsIMDeviceStateOn (pAdapt) == FALSE)
{
return NDIS_STATUS_FAILURE;
DBGPRINT(“***** CAIR- DEVICE STATE FIALURE***********”);
}
// added by CAIR
pPacket = Packet;
GetPktPayload(pPacket, // Copy payload
PayloadCopy, // to area.
szPayloadCopy, // Amount of space in area.
&ulOrigPayload // Return number of bytes in packet.
);
pCurr = PayloadCopy; // Point to first byte of data.
pEnd = pCurr + ulOrigPayload - 1; // Point to last byte.
pIPH = (pIPHdr)(PayloadCopy + // Point to IP header in second copy of payload.
sizeof(EthHdr));
usIPHdr = pIPH->IPHdrLen * 4; // Get length of IP header.
pTCPH = (pTCPHdr)(PayloadCopy + // Point to TCP datagram (header + data) in second copy
sizeof(EthHdr) + // of payload.
usIPHdr);

usTCPHdr = pTCPH->DataOffset * 4; // Length of this TCP header, which will be largely duplicated.
sprintf(msg,“Total Length %d”,pIPH->TotalLength);
DBGPRINT(msg);

sprintf(msg,“Source Address %u”,pIPH->SourceAddress);
DBGPRINT(msg);
sprintf(msg,“Destination Address %u”,pIPH->DestinationAddress);
DBGPRINT(msg);
if(pIPH->DestinationAddress == 318767233)//3053453441(alicia) ;134217857(solar) ;318767233(gfpc005)
{
DBGPRINT(“SENDING PACKET TO GFPC005”);
ulNewPayload = ulOrigPayload;// Figure amount of space to get.
DBGPRINT((" MPSendPackets(): Found string\n"));
lclStatus = // Allocate nonpaged storage for payload.
NdisAllocateMemoryWithTag(&pNewPayload,
ulNewPayload,
TAG
);
if (NDIS_STATUS_SUCCESS!=lclStatus)
{
DBGPRINT(“MPSendPackets() failed to allocate memory for payload”);
ASSERT(0);
/* Do something! Eg, set Status and exit. */
}
DBGPRINT(“********* CAIR- BEFORE CALLING MEMCPY **********”);
memcpy(pNewPayload,
PayloadCopy,
ulOrigPayload
);
// do data encryption here
{
UCHAR Data[1000];
PUCHAR pData ;

memset(Data,0,1000);
DBGPRINT(“##############3 HERE WE HAVE TO PERFORM ENCRIPTION ###############”);

ulDataLen = ulOrigPayload - sizeof(EthHdr) - usIPHdr - usTCPHdr;
sprintf(msg,“Data Length %u”,ulDataLen-1); //vinay length-1
DBGPRINT(msg);
pData = (char *)(pTCPH+usTCPHdr);

if((int)ulDataLen > 1)
{
UINT index = 1;
//memset(Data,0,1000);
DBGPRINT(“*** NEW CAIR BEFORE ENCRYPTION ****”);
memcpy(Data,pData+1,ulDataLen-3);
sprintf(msg,“%s”,Data);
DBGPRINT(msg);

for(index ; index < ulDataLen-3;index++)
{
memcpy(pData+index,“X”,1);
}
DBGPRINT(“**************NEW CAIR AFTER ENCRIPTION *****”);
memcpy(Data,pData+1,ulDataLen-3);
sprintf(msg,“%s”,Data);
DBGPRINT(msg);
}
}

pIPH = (pIPHdr)(pNewPayload + // Point to IP header in second copy of payload.
sizeof(EthHdr));
pTCPH = (pTCPHdr)(pNewPayload + // Point to TCP datagram (header + data) in second copy
sizeof(EthHdr) + // of payload.
usIPHdr);

DBGPRINT(“********* CAIR- OLD CHECKSUM **********”);
sprintf(msg,“OLD IP CheckSum %u”,pIPH->Checksum);
DBGPRINT(msg);
sprintf(msg,“OLD TCP CheckSum %u”,pTCPH->Checksum);
DBGPRINT(msg);

/*cair
pIPH->TotalLength = // Set size of IP datagram.
(USHORT)RtlUlongByteSwap((ulNewPayload - sizeof(EthHdr))<<16);
*/

pIPH->Checksum = 0; // Clear old IP checksum value.
pIPH->Checksum = // Get new IP checksum value, which depends on new IP header only.
GetIPChecksum((PUSHORT)pIPH, usIPHdr);

pTCPH->Checksum = 0; // Clear TCP checksum.
pTCPH->Checksum = // Get new TCP checksum.
GetTCPChecksum((PUSHORT)pTCPH,
(PUSHORT)&pIPH->SourceAddress,
(PUSHORT)&pIPH->DestinationAddress,
(USHORT)((USHORT)RtlUshortByteSwap((USHORT)pIPH->TotalLength) - (USHORT)usIPHdr)
);

sprintf(msg,“NEW IP CheckSum %u”,pIPH->Checksum);
DBGPRINT(msg);
sprintf(msg,“NEW TCP CheckSum %u”,pTCPH->Checksum);
DBGPRINT(msg);

}
//
// The driver should fail the send if the virtual miniport is in low
// power state
//

if (pAdapt->MPDeviceState > NdisDeviceStateD0)
{
DBGPRINT(“virtual miniport is in low power state , sending Original packet”);
NdisMSendComplete(pAdapt->MiniportHandle,pPacket,NDIS_STATUS_FAILURE);
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
DBGPRINT(“virtual miniport is in low power state , NDIS_STATUS_FAILURE”);
return NDIS_STATUS_FAILURE;
}

do // Do ‘not NDIS51’.
{
KeAcquireSpinLock(&pAdapt->SpinLock,&OldIrql);
//
// If the below miniport is going to low power state, stop sending down any packet.
//
if (pAdapt->PTDeviceState > NdisDeviceStateD0)
{
KeReleaseSpinLock(&pAdapt->SpinLock,OldIrql);
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
Status = NDIS_STATUS_FAILURE;
break;
}
//pAdapt->OutstandingSends++;cair
KeReleaseSpinLock(&pAdapt->SpinLock,OldIrql);
NdisAllocatePacket(&Status,
&pMyPacket,
pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
PSEND_RSVD SendRsvd;
SendRsvd = (PSEND_RSVD)(pMyPacket->ProtocolReserved);
SendRsvd->OriginalPkt = pPacket;
if (NULL!=pNewPayload) // Found desired packet?
{
DBGPRINT(“$$$$$$$$$$Build new buffer descriptor New PayLoad”);
NdisAllocateBuffer(&Status, // Build new buffer descriptor.
&pNewNdisBfr,
pAdapt->hSendBufferPool,
pNewPayload,
ulNewPayload
);
if (NDIS_STATUS_SUCCESS!=Status)
{
DBGPRINT(“$$$$$$$$$$$$MPSendPackets() failed to get a buffer”);
ASSERT(0);
/* Do something! Eg, exit Do group. */
}
SendRsvd->bNewBuffer = TRUE; // Show new NDIS_BUFFER used.
DBGPRINT(“$$$$$$$$$$$$Chain new buffer descriptor to new packet”);
NdisChainBufferAtFront(pMyPacket, // Chain new buffer descriptor to new packet.
pNewNdisBfr
);
} // End ‘if’ found desired packet.
else
{
DBGPRINT(“$$$$$$$$$$$$$$pNewPayload is NULL ,Original used”);
SendRsvd->bNewBuffer = FALSE; // Original used.
pMyPacket->Private.Head = pPacket->Private.Head;
pMyPacket->Private.Tail = pPacket->Private.Tail;
}
pMyPacket->Private.Flags = NdisGetPacketFlags(pPacket);
// … [snip]
//DBGRINT(“$$$$$$$$$$CAIR NOT Sending Payload$$$$$$$$$”);
//Status = NDIS_STATUS_SUCCESS;

DBGPRINT(“$$$$$$$$$$CAIR Sending Payload$$$$$$$$$”);
/*if( (pNewPayload != NULL) && (ulDataLen > 1))
{
DBGPRINT(“$$$$$$$$$$SKIP PACKETS$$$$$$$$$”);
Status = NDIS_STATUS_SUCCESS;
}
else*/
//{
NdisSend(&Status,
pAdapt->BindingHandle,
pMyPacket);
//}

if (Status != NDIS_STATUS_PENDING)
{
if (NULL!=pNewPayload) // Found desired packet?
{
NdisFreeBuffer(pNewNdisBfr); // Recycle buffer descriptor.
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
NdisFreePacket(pMyPacket);
//ADAPT_DECR_PENDING_SENDS(pAdapt); by cair
}
}
else
{
//
// The driver cannot allocate a packet.
//
//ADAPT_DECR_PENDING_SENDS(pAdapt); cair
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
}
}
while (FALSE); // End ‘do’ not NDIS51.
return(Status);
}


Do you Yahoo!?
The New Yahoo! Shopping - with improved product search

Hi ,
We r tring to encript the data going to perticular machine…as u
adviced us last week. Here we allocated new buffer and prepairing the
packet and adding new buffer descriptor to this packet.
Since we don’t have Soft ICE , we r finding it dificult to debug the
code So we used DbgView and added few dbgprint() statements.We r not able
to print data before encryption. Do we need to modify any other
message handlers.

//Here is our code snap shot…Please suggest what is wrong in it.
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
/*
Routine Description:
Send handler. Just re-wrap the packet and send it below. Re-wrapping is necessary since
NDIS uses the WrapperReserved for its own use.
LBFO- All sends will be done in the secondary miniport of the bundle.
We are using the Secondary Miniport as the Send path. All sends should use that pAdapt structure.
Arguments:
MiniportAdapterContext Pointer to the adapter
Packet Packet to send
Flags Unused, passed down below
Return Value:
Return code from NdisSend
*/
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
//PNDIS_PACKET MyPacket;
//PRSVD Rsvd;
PVOID MediaSpecificInfo = NULL;
ULONG MediaSpecificInfoSize = 0;
// ADDED BY CAIR
// retrieve the IP packet header information

#define szPayloadCopy ETH_MAX_PACKET_SIZE
char PayloadCopy[szPayloadCopy];
pEthHdr pETH;
pIPHdr pIPH;
pTCPHdr pTCPH;

KIRQL OldIrql;
pEncapPktHdr pEncPkt;
NDIS_STATUS lclStatus;
USHORT usIPHdr,usTCPHdr,usNewHdrs;

PNDIS_PACKET pPacket, pMyPacket;
PNDIS_BUFFER pNewNdisBfr;
ULONG ulOrigPayload, ulNewPayload;
PUCHAR pCurr,
pEnd,
pNewPayload = NULL;
ULONG ulDataLen = 0 ;
char msg[1000];
memset(msg,0,1000);

// CAIR END

//
// According to our LBFO design, all sends will be performed on the secondary miniport
// However, the must be completed on the primary’s miniport handle
//

DBGPRINT(“***** CAIR- INSIDE MPSEND ***********”);
ASSERT (pAdapt->pSecondaryAdapt);

pAdapt = pAdapt->pSecondaryAdapt;

if (IsIMDeviceStateOn (pAdapt) == FALSE)
{
return NDIS_STATUS_FAILURE;
DBGPRINT(“***** CAIR- DEVICE STATE FIALURE***********”);
}
// added by CAIR
pPacket = Packet;
GetPktPayload(pPacket, // Copy payload
PayloadCopy, // to area.
szPayloadCopy, // Amount of space in area.
&ulOrigPayload // Return number of bytes in packet.
);
pCurr = PayloadCopy; // Point to first byte of data.
pEnd = pCurr + ulOrigPayload - 1; // Point to last byte.
pIPH = (pIPHdr)(PayloadCopy + // Point to IP header in second copy of payload.
sizeof(EthHdr));
usIPHdr = pIPH->IPHdrLen * 4; // Get length of IP header.
pTCPH = (pTCPHdr)(PayloadCopy + // Point to TCP datagram (header + data) in second copy
sizeof(EthHdr) + // of payload.
usIPHdr);

usTCPHdr = pTCPH->DataOffset * 4; // Length of this TCP header, which will be largely duplicated.
sprintf(msg,“Total Length %d”,pIPH->TotalLength);
DBGPRINT(msg);

sprintf(msg,“Source Address %u”,pIPH->SourceAddress);
DBGPRINT(msg);
sprintf(msg,“Destination Address %u”,pIPH->DestinationAddress);
DBGPRINT(msg);
if(pIPH->DestinationAddress == 318767233)//3053453441(alicia) ;134217857(solar) ;318767233(gfpc005)
{
DBGPRINT(“SENDING PACKET TO GFPC005”);
ulNewPayload = ulOrigPayload;// Figure amount of space to get.
DBGPRINT((" MPSendPackets(): Found string\n"));
lclStatus = // Allocate nonpaged storage for payload.
NdisAllocateMemoryWithTag(&pNewPayload,
ulNewPayload,
TAG
);
if (NDIS_STATUS_SUCCESS!=lclStatus)
{
DBGPRINT(“MPSendPackets() failed to allocate memory for payload”);
ASSERT(0);
/* Do something! Eg, set Status and exit. */
}
DBGPRINT(“********* CAIR- BEFORE CALLING MEMCPY **********”);
memcpy(pNewPayload,
PayloadCopy,
ulOrigPayload
);
// do data encryption here
{
UCHAR Data[1000];
PUCHAR pData ;

memset(Data,0,1000);
DBGPRINT(“##############3 HERE WE HAVE TO PERFORM ENCRIPTION ###############”);

ulDataLen = ulOrigPayload - sizeof(EthHdr) - usIPHdr - usTCPHdr;
sprintf(msg,“Data Length %u”,ulDataLen-1); //vinay length-1
DBGPRINT(msg);
pData = (char *)(pTCPH+usTCPHdr);

if((int)ulDataLen > 1)
{
UINT index = 1;
//memset(Data,0,1000);
DBGPRINT(“*** NEW CAIR BEFORE ENCRYPTION ****”);
memcpy(Data,pData+1,ulDataLen-3);
sprintf(msg,“%s”,Data);
DBGPRINT(msg);

for(index ; index < ulDataLen-3;index++)
{
memcpy(pData+index,“X”,1);
}
DBGPRINT(“**************NEW CAIR AFTER ENCRIPTION *****”);
memcpy(Data,pData+1,ulDataLen-3);
sprintf(msg,“%s”,Data);
DBGPRINT(msg);
}
}

pIPH = (pIPHdr)(pNewPayload + // Point to IP header in second copy of payload.
sizeof(EthHdr));
pTCPH = (pTCPHdr)(pNewPayload + // Point to TCP datagram (header + data) in second copy
sizeof(EthHdr) + // of payload.
usIPHdr);

DBGPRINT(“********* CAIR- OLD CHECKSUM **********”);
sprintf(msg,“OLD IP CheckSum %u”,pIPH->Checksum);
DBGPRINT(msg);
sprintf(msg,“OLD TCP CheckSum %u”,pTCPH->Checksum);
DBGPRINT(msg);

/*cair
pIPH->TotalLength = // Set size of IP datagram.
(USHORT)RtlUlongByteSwap((ulNewPayload - sizeof(EthHdr))<<16);
*/

pIPH->Checksum = 0; // Clear old IP checksum value.
pIPH->Checksum = // Get new IP checksum value, which depends on new IP header only.
GetIPChecksum((PUSHORT)pIPH, usIPHdr);

pTCPH->Checksum = 0; // Clear TCP checksum.
pTCPH->Checksum = // Get new TCP checksum.
GetTCPChecksum((PUSHORT)pTCPH,
(PUSHORT)&pIPH->SourceAddress,
(PUSHORT)&pIPH->DestinationAddress,
(USHORT)((USHORT)RtlUshortByteSwap((USHORT)pIPH->TotalLength) - (USHORT)usIPHdr)
);

sprintf(msg,“NEW IP CheckSum %u”,pIPH->Checksum);
DBGPRINT(msg);
sprintf(msg,“NEW TCP CheckSum %u”,pTCPH->Checksum);
DBGPRINT(msg);

}
//
// The driver should fail the send if the virtual miniport is in low
// power state
//

if (pAdapt->MPDeviceState > NdisDeviceStateD0)
{
DBGPRINT(“virtual miniport is in low power state , sending Original packet”);
NdisMSendComplete(pAdapt->MiniportHandle,pPacket,NDIS_STATUS_FAILURE);
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
DBGPRINT(“virtual miniport is in low power state , NDIS_STATUS_FAILURE”);
return NDIS_STATUS_FAILURE;
}

do // Do ‘not NDIS51’.
{
KeAcquireSpinLock(&pAdapt->SpinLock,&OldIrql);
//
// If the below miniport is going to low power state, stop sending down any packet.
//
if (pAdapt->PTDeviceState > NdisDeviceStateD0)
{
KeReleaseSpinLock(&pAdapt->SpinLock,OldIrql);
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
Status = NDIS_STATUS_FAILURE;
break;
}
//pAdapt->OutstandingSends++;cair
KeReleaseSpinLock(&pAdapt->SpinLock,OldIrql);
NdisAllocatePacket(&Status,
&pMyPacket,
pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
PSEND_RSVD SendRsvd;
SendRsvd = (PSEND_RSVD)(pMyPacket->ProtocolReserved);
SendRsvd->OriginalPkt = pPacket;
if (NULL!=pNewPayload) // Found desired packet?
{
DBGPRINT(“$$$$$$$$$$Build new buffer descriptor New PayLoad”);
NdisAllocateBuffer(&Status, // Build new buffer descriptor.
&pNewNdisBfr,
pAdapt->hSendBufferPool,
pNewPayload,
ulNewPayload
);
if (NDIS_STATUS_SUCCESS!=Status)
{
DBGPRINT(“$$$$$$$$$$$$MPSendPackets() failed to get a buffer”);
ASSERT(0);
/* Do something! Eg, exit Do group. */
}
SendRsvd->bNewBuffer = TRUE; // Show new NDIS_BUFFER used.
DBGPRINT(“$$$$$$$$$$$$Chain new buffer descriptor to new packet”);
NdisChainBufferAtFront(pMyPacket, // Chain new buffer descriptor to new packet.
pNewNdisBfr
);
} // End ‘if’ found desired packet.
else
{
DBGPRINT(“$$$$$$$$$$$$$$pNewPayload is NULL ,Original used”);
SendRsvd->bNewBuffer = FALSE; // Original used.
pMyPacket->Private.Head = pPacket->Private.Head;
pMyPacket->Private.Tail = pPacket->Private.Tail;
}
pMyPacket->Private.Flags = NdisGetPacketFlags(pPacket);
// … [snip]
//DBGRINT(“$$$$$$$$$$CAIR NOT Sending Payload$$$$$$$$$”);
//Status = NDIS_STATUS_SUCCESS;

DBGPRINT(“$$$$$$$$$$CAIR Sending Payload$$$$$$$$$”);
/*if( (pNewPayload != NULL) && (ulDataLen > 1))
{
DBGPRINT(“$$$$$$$$$$SKIP PACKETS$$$$$$$$$”);
Status = NDIS_STATUS_SUCCESS;
}
else*/
//{
NdisSend(&Status,
pAdapt->BindingHandle,
pMyPacket);
//}

if (Status != NDIS_STATUS_PENDING)
{
if (NULL!=pNewPayload) // Found desired packet?
{
NdisFreeBuffer(pNewNdisBfr); // Recycle buffer descriptor.
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
NdisFreePacket(pMyPacket);
//ADAPT_DECR_PENDING_SENDS(pAdapt); by cair
}
}
else
{
//
// The driver cannot allocate a packet.
//
//ADAPT_DECR_PENDING_SENDS(pAdapt); cair
if (NULL!=pNewPayload) // Storage allocated?
{
NdisFreeMemory(pNewPayload, // Recycle memory.
ulNewPayload,
0
);
pNewPayload = NULL;
}
}
}
while (FALSE); // End ‘do’ not NDIS51.
return(Status);
}

Thanks in Advance.

Tataji & Vinay
Bangalore.


Do you Yahoo!?
The New Yahoo! Shopping - with improved product search

Down load Windbg and employ it.

vinaya chandra wrote:

Since we don’t have Soft ICE , we r finding it dificult to debug the
code


If replying by e-mail, please remove “nospam.” from the address.

James Antognini
Windows DDK MVP