📄 ndisbind.c
字号:
// be to explicitly handle cancellation of this IRP.
//
NPROT_WAIT_EVENT(&pOpenContext->PoweredUpEvent, 4500);
}
Status = ndisprotDoRequest(
pOpenContext,
RequestType,
Oid,
InformationBuffer,
InformationBufferLength,
pBytesProcessed);
//
// Let go of the binding.
//
NdisInterlockedDecrement((PLONG)&pOpenContext->PendedSendCount);
}
while (FALSE);
DEBUGP(DL_LOUD, ("ValidateOpenAndDoReq: Open %p/%x, OID %x, Status %x\n",
pOpenContext, pOpenContext->Flags, Oid, Status));
return (Status);
}
VOID
NdisProtResetComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
)
/*++
Routine Description:
NDIS entry point indicating that a protocol initiated reset
has completed. Since we never call NdisReset(), this should
never be called.
Arguments:
ProtocolBindingContext - pointer to open context
Status - status of reset completion
Return Value:
None
--*/
{
UNREFERENCED_PARAMETER(ProtocolBindingContext);
UNREFERENCED_PARAMETER(Status);
ASSERT(FALSE);
return;
}
VOID
NdisProtRequestComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST pNdisRequest,
IN NDIS_STATUS Status
)
/*++
Routine Description:
NDIS entry point indicating completion of a pended NDIS_REQUEST.
Arguments:
ProtocolBindingContext - pointer to open context
pNdisRequest - pointer to NDIS request
Status - status of reset completion
Return Value:
None
--*/
{
PNDISPROT_OPEN_CONTEXT pOpenContext;
PNDISPROT_REQUEST pReqContext;
pOpenContext = (PNDISPROT_OPEN_CONTEXT)ProtocolBindingContext;
NPROT_STRUCT_ASSERT(pOpenContext, oc);
//
// Get at the request context.
//
pReqContext = CONTAINING_RECORD(pNdisRequest, NDISPROT_REQUEST, Request);
//
// Save away the completion status.
//
pReqContext->Status = Status;
//
// Wake up the thread blocked for this request to complete.
//
NPROT_SIGNAL_EVENT(&pReqContext->ReqEvent);
}
VOID
NdisProtStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
)
/*++
Routine Description:
Protocol entry point called by NDIS to indicate a change
in status at the miniport.
We make note of reset and media connect status indications.
Arguments:
ProtocolBindingContext - pointer to open context
GeneralStatus - status code
StatusBuffer - status-specific additional information
StatusBufferSize - size of the above
Return Value:
None
--*/
{
PNDISPROT_OPEN_CONTEXT pOpenContext;
UNREFERENCED_PARAMETER(StatusBuffer);
UNREFERENCED_PARAMETER(StatusBufferSize);
pOpenContext = (PNDISPROT_OPEN_CONTEXT)ProtocolBindingContext;
NPROT_STRUCT_ASSERT(pOpenContext, oc);
DEBUGP(DL_INFO, ("Status: Open %p, Status %x\n",
pOpenContext, GeneralStatus));
ndisServiceIndicateStatusIrp(pOpenContext,
GeneralStatus,
StatusBuffer,
StatusBufferSize,
FALSE);
NPROT_ACQUIRE_LOCK(&pOpenContext->Lock);
do
{
if (pOpenContext->PowerState != NetDeviceStateD0)
{
//
// The device is in a low power state.
//
DEBUGP(DL_INFO, ("Status: Open %p in power state %d,"
" Status %x ignored\n", pOpenContext,
pOpenContext->PowerState, GeneralStatus));
//
// We continue and make note of status indications
//
// break;
//
//
// NOTE that any actions we take based on these
// status indications should take into account
// the current device power state.
//
}
switch(GeneralStatus)
{
case NDIS_STATUS_RESET_START:
NPROT_ASSERT(!NPROT_TEST_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS));
NPROT_SET_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS);
break;
case NDIS_STATUS_RESET_END:
NPROT_ASSERT(NPROT_TEST_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS));
NPROT_SET_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_NOT_RESETTING);
break;
case NDIS_STATUS_MEDIA_CONNECT:
NPROT_SET_FLAGS(pOpenContext->Flags,
NUIOO_MEDIA_FLAGS,
NUIOO_MEDIA_CONNECTED);
break;
case NDIS_STATUS_MEDIA_DISCONNECT:
NPROT_SET_FLAGS(pOpenContext->Flags,
NUIOO_MEDIA_FLAGS,
NUIOO_MEDIA_DISCONNECTED);
break;
default:
break;
}
}
while (FALSE);
NPROT_RELEASE_LOCK(&pOpenContext->Lock);
}
VOID
NdisProtStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
)
/*++
Routine Description:
Protocol entry point called by NDIS. We ignore this.
Arguments:
ProtocolBindingContext - pointer to open context
Return Value:
None
--*/
{
PNDISPROT_OPEN_CONTEXT pOpenContext;
pOpenContext = (PNDISPROT_OPEN_CONTEXT)ProtocolBindingContext;
NPROT_STRUCT_ASSERT(pOpenContext, oc);
return;
}
NDIS_STATUS
ndisprotQueryBinding(
IN PUCHAR pBuffer,
IN ULONG InputLength,
IN ULONG OutputLength,
OUT PULONG pBytesReturned
)
/*++
Routine Description:
Return information about the specified binding.
Arguments:
pBuffer - pointer to NDISPROT_QUERY_BINDING
InputLength - input buffer size
OutputLength - output buffer size
pBytesReturned - place to return copied byte count.
Return Value:
NDIS_STATUS_SUCCESS if successful, failure code otherwise.
--*/
{
PNDISPROT_QUERY_BINDING pQueryBinding;
PNDISPROT_OPEN_CONTEXT pOpenContext;
PLIST_ENTRY pEnt;
ULONG Remaining;
ULONG BindingIndex;
NDIS_STATUS Status;
do
{
if (InputLength < sizeof(NDISPROT_QUERY_BINDING))
{
Status = NDIS_STATUS_RESOURCES;
break;
}
if (OutputLength < sizeof(NDISPROT_QUERY_BINDING))
{
Status = NDIS_STATUS_BUFFER_OVERFLOW;
break;
}
Remaining = OutputLength - sizeof(NDISPROT_QUERY_BINDING);
pQueryBinding = (PNDISPROT_QUERY_BINDING)pBuffer;
BindingIndex = pQueryBinding->BindingIndex;
Status = NDIS_STATUS_ADAPTER_NOT_FOUND;
pOpenContext = NULL;
NPROT_ACQUIRE_LOCK(&Globals.GlobalLock);
for (pEnt = Globals.OpenList.Flink;
pEnt != &Globals.OpenList;
pEnt = pEnt->Flink)
{
pOpenContext = CONTAINING_RECORD(pEnt, NDISPROT_OPEN_CONTEXT, Link);
NPROT_STRUCT_ASSERT(pOpenContext, oc);
NPROT_ACQUIRE_LOCK(&pOpenContext->Lock);
//
// Skip if not bound.
//
if (!NPROT_TEST_FLAGS(pOpenContext->Flags, NUIOO_BIND_FLAGS, NUIOO_BIND_ACTIVE))
{
NPROT_RELEASE_LOCK(&pOpenContext->Lock);
continue;
}
if (BindingIndex == 0)
{
//
// Got the binding we are looking for. Copy the device
// name and description strings to the output buffer.
//
DEBUGP(DL_INFO,
("QueryBinding: found open %p\n", pOpenContext));
pQueryBinding->DeviceNameLength = pOpenContext->DeviceName.Length + sizeof(WCHAR);
pQueryBinding->DeviceDescrLength = pOpenContext->DeviceDescr.Length + sizeof(WCHAR);
if (Remaining < pQueryBinding->DeviceNameLength +
pQueryBinding->DeviceDescrLength)
{
NPROT_RELEASE_LOCK(&pOpenContext->Lock);
Status = NDIS_STATUS_BUFFER_OVERFLOW;
break;
}
NPROT_ZERO_MEM((PUCHAR)pBuffer + sizeof(NDISPROT_QUERY_BINDING),
pQueryBinding->DeviceNameLength +
pQueryBinding->DeviceDescrLength);
pQueryBinding->DeviceNameOffset = sizeof(NDISPROT_QUERY_BINDING);
NPROT_COPY_MEM((PUCHAR)pBuffer + pQueryBinding->DeviceNameOffset,
pOpenContext->DeviceName.Buffer,
pOpenContext->DeviceName.Length);
pQueryBinding->DeviceDescrOffset = pQueryBinding->DeviceNameOffset +
pQueryBinding->DeviceNameLength;
NPROT_COPY_MEM((PUCHAR)pBuffer + pQueryBinding->DeviceDescrOffset,
pOpenContext->DeviceDescr.Buffer,
pOpenContext->DeviceDescr.Length);
NPROT_RELEASE_LOCK(&pOpenContext->Lock);
*pBytesReturned = pQueryBinding->DeviceDescrOffset + pQueryBinding->DeviceDescrLength;
Status = NDIS_STATUS_SUCCESS;
break;
}
NPROT_RELEASE_LOCK(&pOpenContext->Lock);
BindingIndex--;
}
NPROT_RELEASE_LOCK(&Globals.GlobalLock);
}
while (FALSE);
return (Status);
}
PNDISPROT_OPEN_CONTEXT
ndisprotLookupDevice(
IN PUCHAR pBindingInfo,
IN ULONG BindingInfoLength
)
/*++
Routine Description:
Search our global list for an open context structure that
has a binding to the specified device, and return a pointer
to it.
NOTE: we reference the open that we return.
Arguments:
pBindingInfo - pointer to unicode device name string
BindingInfoLength - length in bytes of the above.
Return Value:
Pointer to the matching open context if found, else NULL
--*/
{
PNDISPROT_OPEN_CONTEXT pOpenContext;
PLIST_ENTRY pEnt;
pOpenContext = NULL;
NPROT_ACQUIRE_LOCK(&Globals.GlobalLock);
for (pEnt = Globals.OpenList.Flink;
pEnt != &Globals.OpenList;
pEnt = pEnt->Flink)
{
pOpenContext = CONTAINING_RECORD(pEnt, NDISPROT_OPEN_CONTEXT, Link);
NPROT_STRUCT_ASSERT(pOpenContext, oc);
//
// Check if this has the name we are looking for.
//
if ((pOpenContext->DeviceName.Length == BindingInfoLength) &&
NPROT_MEM_CMP(pOpenContext->DeviceName.Buffer, pBindingInfo, BindingInfoLength))
{
NPROT_REF_OPEN(pOpenContext); // ref added by LookupDevice
break;
}
pOpenContext = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -