📄 packet.c
字号:
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 + -