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

📄 packet.c

📁 截获以太网数据,附源代码(NT 控制台程序 )
💻 C
📖 第 1 页 / 共 2 页
字号:
    Open = IrpSp->FileObject->FsContext;

    RequestListEntry = ExInterlockedRemoveHeadList(&Open->RequestList,
            &Open->RequestSpinLock);

    if (RequestListEntry == NULL)
    {
        Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        return STATUS_UNSUCCESSFUL;
    }


    pRequest = CONTAINING_RECORD(RequestListEntry, INTERNAL_REQUEST, ListElement);
    pRequest->Irp = Irp;


    IoMarkIrpPending(Irp);
    Irp->IoStatus.Status = STATUS_PENDING;



    IF_LOUD(DbgPrint("Packet: Function code is %08lx  buff size=%08lx  %08lx\n", FunctionCode, IrpSp->Parameters.DeviceIoControl.InputBufferLength,
                    IrpSp->Parameters.DeviceIoControl.OutputBufferLength));

    if (FunctionCode == IOCTL_PROTOCOL_RESET)
    {
        IF_LOUD(DbgPrint("Packet: IoControl - Reset request\n"));

        ExInterlockedInsertTailList(&Open->ResetIrpList, &Irp->Tail.Overlay.ListEntry,
                &Open->RequestSpinLock);

        NdisReset(&Status, Open->AdapterHandle);

        if (Status != NDIS_STATUS_PENDING)
        {

            IF_LOUD(DbgPrint("Packet: IoControl - ResetComplte being called\n"));

            PacketResetComplete(Open, Status);
        }
    }
    else
    {
//
// See if it is an Ndis request
//
        PPACKET_OID_DATA OidData = Irp->AssociatedIrp.SystemBuffer;

        if (((FunctionCode == IOCTL_PROTOCOL_SET_OID) || (FunctionCode == IOCTL_PROTOCOL_SET_OID))
                &&
                (IrpSp->Parameters.DeviceIoControl.InputBufferLength == IrpSp->Parameters.DeviceIoControl.OutputBufferLength)
                &&
                (IrpSp->Parameters.DeviceIoControl.InputBufferLength >= sizeof(PACKET_OID_DATA))
                &&
                (IrpSp->Parameters.DeviceIoControl.InputBufferLength >= sizeof(PACKET_OID_DATA) - 1 + OidData->Length))
        {

            IF_LOUD(DbgPrint("Packet: IoControl: Request: Oid=%08lx, Length=%08lx\n", OidData->Oid, OidData->Length));

//
// The buffer is valid
//
            if (FunctionCode == IOCTL_PROTOCOL_SET_OID)
            {
                pRequest->Request.RequestType = NdisRequestSetInformation;
                pRequest->Request.DATA.SET_INFORMATION.Oid = OidData->Oid;

                pRequest->Request.DATA.SET_INFORMATION.InformationBuffer = OidData->Data;
                pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength = OidData->Length;
            }
            else
            {
                pRequest->Request.RequestType = NdisRequestQueryInformation;
                pRequest->Request.DATA.QUERY_INFORMATION.Oid = OidData->Oid;

                pRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer = OidData->Data;
                pRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength = OidData->Length;
            }

//
// submit the request
//
            NdisRequest(&Status, Open->AdapterHandle, &pRequest->Request);
        }
        else
        {
//
// buffer too small
//
            Status = NDIS_STATUS_FAILURE;
            pRequest->Request.DATA.SET_INFORMATION.BytesRead = 0;
            pRequest->Request.DATA.QUERY_INFORMATION.BytesWritten = 0;
        }

        if (Status != NDIS_STATUS_PENDING)
        {
            IF_LOUD(DbgPrint("Packet: Calling RequestCompleteHandler\n"));

            PacketRequestComplete(Open, &pRequest->Request, Status);
        }

    }

    return (STATUS_PENDING);

}





VOID
PacketRequestComplete(IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest,
        IN NDIS_STATUS Status)
{
    POPEN_INSTANCE  Open;
    PIO_STACK_LOCATION IrpSp;
    PIRP            Irp;
    PINTERNAL_REQUEST pRequest;
    UINT            FunctionCode;

    PPACKET_OID_DATA OidData;

    IF_LOUD(DbgPrint("Packet: RequestComplete\n"));

    Open = (POPEN_INSTANCE) ProtocolBindingContext;

    pRequest = CONTAINING_RECORD(NdisRequest, INTERNAL_REQUEST, Request);
    Irp = pRequest->Irp;

    IrpSp = IoGetCurrentIrpStackLocation(Irp);

    FunctionCode = IrpSp->Parameters.DeviceIoControl.IoControlCode;

    OidData = Irp->AssociatedIrp.SystemBuffer;

    if (FunctionCode == IOCTL_PROTOCOL_SET_OID)
    {
        OidData->Length = pRequest->Request.DATA.SET_INFORMATION.BytesRead;
    }
    else
    {
        if (FunctionCode == IOCTL_PROTOCOL_QUERY_OID)
            OidData->Length = pRequest->Request.DATA.QUERY_INFORMATION.BytesWritten;
    }

    Irp->IoStatus.Information = IrpSp->Parameters.DeviceIoControl.InputBufferLength;


    ExInterlockedInsertTailList(&Open->RequestList, &pRequest->ListElement,
            &Open->RequestSpinLock);


    Irp->IoStatus.Status = Status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);

}





VOID
PacketStatus(IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status,
        IN PVOID StatusBuffer, IN UINT StatusBufferSize)
{

    IF_LOUD(DbgPrint("Packet: Status Indication\n"));

}



VOID
PacketStatusComplete(IN NDIS_HANDLE ProtocolBindingContext)
{

    IF_LOUD(DbgPrint("Packet: StatusIndicationComplete\n"));

}


#if 0


NTSTATUS
PacketCreateSymbolicLink(IN PUNICODE_STRING DeviceName, IN BOOLEAN Create)
{

    UNICODE_STRING  UnicodeDosDeviceName;
    NTSTATUS        Status;

    if (DeviceName->Length < sizeof(_WS("\\Device\\")))
        return STATUS_UNSUCCESSFUL;

    RtlInitUnicodeString(&UnicodeDosDeviceName, NULL);

    UnicodeDosDeviceName.MaximumLength = DeviceName->Length + sizeof(_WS("\\DosDevices")) + sizeof(UNICODE_NULL);

    UnicodeDosDeviceName.Buffer = ExAllocatePool(NonPagedPool,
            UnicodeDosDeviceName.MaximumLength);

    if (UnicodeDosDeviceName.Buffer != NULL)
    {
        RtlZeroMemory(UnicodeDosDeviceName.Buffer, UnicodeDosDeviceName.MaximumLength);

        RtlAppendUnicodeToString(&UnicodeDosDeviceName, _WS("\\DosDevices\\"));

        RtlAppendUnicodeToString(&UnicodeDosDeviceName,
                (DeviceName->Buffer + (sizeof(_WS("\\Device")))));

        IF_LOUD(DbgPrint("Packet: DosDeviceName is %ws\n", UnicodeDosDeviceName.Buffer));

        if (Create)
            Status = IoCreateSymbolicLink(&UnicodeDosDeviceName, DeviceName);
        else
            Status = IoDeleteSymbolicLink(&UnicodeDosDeviceName);

        ExFreePool(UnicodeDosDeviceName.Buffer);
    }

    return Status;

}



#endif




NTSTATUS
PacketReadRegistry(IN PWSTR * MacDriverName, IN PWSTR * PacketDriverName,
        IN PUNICODE_STRING RegistryPath)
{

    NTSTATUS        Status;

    RTL_QUERY_REGISTRY_TABLE ParamTable[5];

    PWSTR           Bind = _WS("Bind");
    PWSTR           Export = _WS("Export");
    PWSTR           Parameters = _WS("Parameters");
    PWSTR           Linkage = _WS("Linkage");

    PWCHAR          Path;

    Path = ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));

    if (Path == NULL)
        return STATUS_INSUFFICIENT_RESOURCES;

    RtlZeroMemory(Path, RegistryPath->Length + sizeof(WCHAR));

    RtlCopyMemory(Path, RegistryPath->Buffer, RegistryPath->Length);

    IF_LOUD(DbgPrint("Packet: Reg path is %ws\n", RegistryPath->Buffer));

    RtlZeroMemory(ParamTable, sizeof(ParamTable));

//
// change to the parmeters key
//

    ParamTable[0].QueryRoutine = NULL;
    ParamTable[0].Flags = RTL_QUERY_REGISTRY_SUBKEY;
    ParamTable[0].Name = Parameters;

//
// change to the linkage key
//

    ParamTable[1].QueryRoutine = NULL;
    ParamTable[1].Flags = RTL_QUERY_REGISTRY_SUBKEY;
    ParamTable[1].Name = Linkage;

//
// Get the name of the mac driver we should bind to
//

    ParamTable[2].QueryRoutine = PacketQueryRegistryRoutine;
    ParamTable[2].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_NOEXPAND;

    ParamTable[2].Name = Bind;
    ParamTable[2].EntryContext = (PVOID) MacDriverName;
    ParamTable[2].DefaultType = REG_MULTI_SZ;

//
// Get the name that we should use for the driver object
//

    ParamTable[3].QueryRoutine = PacketQueryRegistryRoutine;
    ParamTable[3].Flags = RTL_QUERY_REGISTRY_REQUIRED |
            RTL_QUERY_REGISTRY_NOEXPAND;

    ParamTable[3].Name = Export;
    ParamTable[3].EntryContext = (PVOID) PacketDriverName;
    ParamTable[3].DefaultType = REG_MULTI_SZ;


    Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, Path, ParamTable,
            NULL, NULL);


    ExFreePool(Path);

    return Status;

}




NTSTATUS
PacketQueryRegistryRoutine(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData,
        IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
{

    PUCHAR          Buffer;

    IF_LOUD(DbgPrint("Perf: QueryRegistryRoutine\n"));

    if (ValueType != REG_MULTI_SZ)
        return STATUS_OBJECT_NAME_NOT_FOUND;

    Buffer = ExAllocatePool(NonPagedPool, ValueLength);

    if (Buffer == NULL)
        return STATUS_INSUFFICIENT_RESOURCES;

    RtlCopyMemory(Buffer, ValueData, ValueLength);

    *((PUCHAR *) EntryContext) = Buffer;

    return STATUS_SUCCESS;

}

⌨️ 快捷键说明

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