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

📄 request.c

📁 一个简单的sniffer,下载后请用winrar
💻 C
字号:
// request.c - PacketRequest, PacketRequestComplete 
//           
//           

// Original code by William Ingle (address unknown)
// debugged and extended by Chris Chlap (chrisc@fir.canberra.edu.au)

#include <basedef.h>
#include <vmm.h>
#include <debug.h>
#include <ndis.h>
#include <vwin32.h>

#include "packet.h"
#include "ntddpack.h"

#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG

//--------------------------------------------------------------------
//
//  PacketRequest - perform a packet request
//
//--------------------------------------------------------------------

DWORD PacketRequest(POPEN_INSTANCE  Open,
                    DWORD           FunctionCode,
                    DWORD           dwDDB,
                    DWORD           hDevice,
                    PDIOCPARAMETERS pDiocParms)
{
    PLIST_ENTRY       RequestListEntry;
    PINTERNAL_REQUEST pRequest;
	PPACKET_RESERVED  pReserved;
    PPACKET_OID_DATA  OidData;
    NDIS_STATUS       Status;

	//
	// Acquire request element from list
	//

    NdisAcquireSpinLock(&Open->RequestSpinLock);

    if (IsListEmpty(&Open->RequestList)) { 
        *(DWORD *)(pDiocParms->lpcbBytesReturned) = 0;
        NdisReleaseSpinLock(&Open->RequestSpinLock);
Debug_Out("PacketRequest: ERROR: request list empty\n"); 
        return NDIS_STATUS_SUCCESS;
	}
    else {
        RequestListEntry = RemoveHeadList(&Open->RequestList);
        NdisReleaseSpinLock(&Open->RequestSpinLock);
    }

    pReserved = CONTAINING_RECORD(RequestListEntry, PACKET_RESERVED, ListElement);
    pRequest  = CONTAINING_RECORD(pReserved, INTERNAL_REQUEST, Reserved);
	OidData   = (PPACKET_OID_DATA)(pDiocParms->lpvInBuffer);
	
    if ((pDiocParms->cbInBuffer == pDiocParms->cbOutBuffer) &&
        (pDiocParms->cbInBuffer >= sizeof(PACKET_OID_DATA) - 1 
        + OidData->Length)) {
        //
        // The buffer is valid
        //
        pReserved->lpBuffer          = (PVOID)PacketPageLock(pDiocParms->lpvInBuffer, pDiocParms->cbInBuffer);

        pReserved->lpcbBytesReturned = (PVOID)PacketPageLock((PVOID)pDiocParms->lpcbBytesReturned, sizeof(DWORD));

        pReserved->lpoOverlapped     = (PVOID)PacketPageLock((PVOID)pDiocParms->lpoOverlapped, sizeof(OVERLAPPED));

        pReserved->cbBuffer          = pDiocParms->cbInBuffer;
        pReserved->hDevice           = pDiocParms->hDevice;
        pReserved->tagProcess        = pDiocParms->tagProcess;

        OidData = (PPACKET_OID_DATA) (pReserved->lpBuffer); // Thanks to Arnoud Zwemmer
        
        if (FunctionCode == IOCTL_PROTOCOL_SET_OID) {                      
            pRequest->Request.RequestType                                  = NdisRequestSetInformation;
            pRequest->Request.DATA.SET_INFORMATION.Oid                     = OidData->Oid;
            pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength = OidData->Length;
            pRequest->Request.DATA.SET_INFORMATION.InformationBuffer       = OidData->Data;
        } 
        else 
        if (FunctionCode == IOCTL_PROTOCOL_QUERY_OID) {
            pRequest->Request.RequestType                                    = NdisRequestQueryInformation;
            pRequest->Request.DATA.QUERY_INFORMATION.Oid                     = OidData->Oid;
            pRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength = OidData->Length;
            pRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer       = OidData->Data;
        }
        else {
        pRequest->Request.RequestType                                      = NdisRequestGeneric1;
                                                                            // NdisRequestQueryStatistics;
        pRequest->Request.DATA.QUERY_INFORMATION.Oid                       = OidData->Oid;
        pRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength   = OidData->Length;
        pRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer         = OidData->Data;
        }

        //
        // submit the request
        //

        NdisRequest(&Status, Open->AdapterHandle, &pRequest->Request);

        if (Status != NDIS_STATUS_PENDING) {
            PacketRequestComplete(Open, &pRequest->Request, Status);
			return NDIS_STATUS_SUCCESS;
		}
        return(-1);      // This will make DeviceIOControl return ERROR_IO_PENDING
    }
    else {
Debug_Out("PacketRequest: ERROR: invalid request\n"); 
		*(DWORD *)(pDiocParms->lpcbBytesReturned) = 0;
	}
	return NDIS_STATUS_SUCCESS;
}

//--------------------------------------------------------------------
//
//  PacketRequestComplete - perform a packet request complete
//
//--------------------------------------------------------------------

VOID NDIS_API PacketRequestComplete(IN NDIS_HANDLE   ProtocolBindingContext,
                                    IN PNDIS_REQUEST NdisRequest,
                                    IN NDIS_STATUS   Status)
{
    POPEN_INSTANCE    Open;
    PINTERNAL_REQUEST pRequest;
    PPACKET_RESERVED  pReserved;
    OVERLAPPED*       pOverlap;
	PPACKET_OID_DATA  oidData;

    Open        = (POPEN_INSTANCE)ProtocolBindingContext;
    pRequest    = CONTAINING_RECORD(NdisRequest, INTERNAL_REQUEST, Request);
    pReserved   = &pRequest->Reserved;
    pOverlap    = (OVERLAPPED *) pReserved->lpoOverlapped;
	oidData		= (PPACKET_OID_DATA)(pReserved->lpBuffer);


    if (Status == NDIS_STATUS_SUCCESS) {
		//
		// set total bytes returned
		//
		*(pReserved->lpcbBytesReturned)	= oidData->Length + sizeof(PACKET_OID_DATA) - 1;
        pOverlap->O_InternalHigh        = *(pReserved->lpcbBytesReturned);
	}
    else {
		//
		// set total bytes returned
		//
		*(pReserved->lpcbBytesReturned)	= 0;
        pOverlap->O_InternalHigh        = *(pReserved->lpcbBytesReturned);

		//
		// return status in oidData if there is an error 
		//		
		oidData->Length = Status;
	}

	//
    // The internal member of overlapped structure contains
    // a pointer to the event structure that will be signalled,
    // resuming the execution of the waitng GetOverlappedResult
    // call.
    //
    VWIN32_DIOCCompletionRoutine(pOverlap->O_Internal);

	// Unlock buffers	
    PacketPageUnlock(pReserved->lpBuffer, pReserved->cbBuffer);
    PacketPageUnlock(pReserved->lpcbBytesReturned, sizeof(DWORD));
    PacketPageUnlock(pReserved->lpoOverlapped, sizeof(OVERLAPPED));

	//
	// Return request element to list
	//
    NdisAcquireSpinLock(&Open->RequestSpinLock);

    InsertTailList(&Open->RequestList, &pReserved->ListElement);

    NdisReleaseSpinLock(&Open->RequestSpinLock);
    return;
}

⌨️ 快捷键说明

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