📄 ndisbind.c
字号:
{
//
// Ignore status indications if 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));
break;
}
switch(GeneralStatus)
{
case NDIS_STATUS_RESET_START:
NUIO_ASSERT(!NUIO_TEST_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS));
NUIO_SET_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS);
break;
case NDIS_STATUS_RESET_END:
NUIO_ASSERT(NUIO_TEST_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_RESET_IN_PROGRESS));
NUIO_SET_FLAGS(pOpenContext->Flags,
NUIOO_RESET_FLAGS,
NUIOO_NOT_RESETTING);
break;
case NDIS_STATUS_MEDIA_CONNECT:
NUIO_SET_FLAGS(pOpenContext->Flags,
NUIOO_MEDIA_FLAGS,
NUIOO_MEDIA_CONNECTED);
break;
case NDIS_STATUS_MEDIA_DISCONNECT:
NUIO_SET_FLAGS(pOpenContext->Flags,
NUIOO_MEDIA_FLAGS,
NUIOO_MEDIA_DISCONNECTED);
break;
default:
break;
}
}
while (FALSE);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
}
VOID
NdisuioStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
)
/*++
Routine Description:
Protocol entry point called by NDIS. We ignore this.
Arguments:
ProtocolBindingContext - pointer to open context
Return Value:
None
--*/
{
PNDISUIO_OPEN_CONTEXT pOpenContext;
pOpenContext = (PNDISUIO_OPEN_CONTEXT)ProtocolBindingContext;
NUIO_STRUCT_ASSERT(pOpenContext, oc);
return;
}
NDIS_STATUS
ndisuioQueryBinding(
IN PUCHAR pBuffer,
IN ULONG InputLength,
IN ULONG OutputLength,
OUT PULONG pBytesReturned
)
/*++
Routine Description:
Return information about the specified binding.
Arguments:
pBuffer - pointer to NDISUIO_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.
--*/
{
PNDISUIO_QUERY_BINDING pQueryBinding;
PNDISUIO_OPEN_CONTEXT pOpenContext;
PLIST_ENTRY pEnt;
ULONG Remaining;
ULONG BindingIndex;
NDIS_STATUS Status;
do
{
if (InputLength < sizeof(NDISUIO_QUERY_BINDING))
{
Status = NDIS_STATUS_RESOURCES;
break;
}
if (OutputLength < sizeof(NDISUIO_QUERY_BINDING))
{
Status = NDIS_STATUS_BUFFER_OVERFLOW;
break;
}
Remaining = OutputLength - sizeof(NDISUIO_QUERY_BINDING);
pQueryBinding = (PNDISUIO_QUERY_BINDING)pBuffer;
BindingIndex = pQueryBinding->BindingIndex;
Status = NDIS_STATUS_ADAPTER_NOT_FOUND;
pOpenContext = NULL;
NUIO_ACQUIRE_LOCK(&Globals.GlobalLock);
for (pEnt = Globals.OpenList.Flink;
pEnt != &Globals.OpenList;
pEnt = pEnt->Flink)
{
pOpenContext = CONTAINING_RECORD(pEnt, NDISUIO_OPEN_CONTEXT, Link);
NUIO_STRUCT_ASSERT(pOpenContext, oc);
NUIO_ACQUIRE_LOCK(&pOpenContext->Lock);
//
// Skip if not bound.
//
if (!NUIO_TEST_FLAGS(pOpenContext->Flags, NUIOO_BIND_FLAGS, NUIOO_BIND_ACTIVE))
{
NUIO_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)
{
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
Status = NDIS_STATUS_BUFFER_OVERFLOW;
break;
}
NUIO_ZERO_MEM((PUCHAR)pBuffer + sizeof(NDISUIO_QUERY_BINDING),
pQueryBinding->DeviceNameLength +
pQueryBinding->DeviceDescrLength);
pQueryBinding->DeviceNameOffset = sizeof(NDISUIO_QUERY_BINDING);
NUIO_COPY_MEM((PUCHAR)pBuffer + pQueryBinding->DeviceNameOffset,
pOpenContext->DeviceName.Buffer,
pOpenContext->DeviceName.Length);
pQueryBinding->DeviceDescrOffset = pQueryBinding->DeviceNameOffset +
pQueryBinding->DeviceNameLength;
NUIO_COPY_MEM((PUCHAR)pBuffer + pQueryBinding->DeviceDescrOffset,
pOpenContext->DeviceDescr.Buffer,
pOpenContext->DeviceDescr.Length);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
*pBytesReturned = pQueryBinding->DeviceDescrOffset + pQueryBinding->DeviceDescrLength;
Status = NDIS_STATUS_SUCCESS;
break;
}
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
BindingIndex--;
}
NUIO_RELEASE_LOCK(&Globals.GlobalLock);
}
while (FALSE);
return (Status);
}
PNDISUIO_OPEN_CONTEXT
ndisuioLookupDevice(
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
--*/
{
PNDISUIO_OPEN_CONTEXT pOpenContext;
PLIST_ENTRY pEnt;
pOpenContext = NULL;
NUIO_ACQUIRE_LOCK(&Globals.GlobalLock);
for (pEnt = Globals.OpenList.Flink;
pEnt != &Globals.OpenList;
pEnt = pEnt->Flink)
{
pOpenContext = CONTAINING_RECORD(pEnt, NDISUIO_OPEN_CONTEXT, Link);
NUIO_STRUCT_ASSERT(pOpenContext, oc);
//
// Check if this has the name we are looking for.
//
if ((pOpenContext->DeviceName.Length == BindingInfoLength) &&
NUIO_MEM_CMP(pOpenContext->DeviceName.Buffer, pBindingInfo, BindingInfoLength))
{
NUIO_REF_OPEN(pOpenContext); // ref added by LookupDevice
break;
}
pOpenContext = NULL;
}
NUIO_RELEASE_LOCK(&Globals.GlobalLock);
return (pOpenContext);
}
NDIS_STATUS
ndisuioQueryOidValue(
IN PNDISUIO_OPEN_CONTEXT pOpenContext,
OUT PVOID pDataBuffer,
IN ULONG BufferLength,
OUT PULONG pBytesWritten
)
/*++
Routine Description:
Query an arbitrary OID value from the miniport.
Arguments:
pOpenContext - pointer to open context representing our binding to the miniport
pDataBuffer - place to store the returned value
BufferLength - length of the above
pBytesWritten - place to return length returned
Return Value:
NDIS_STATUS_SUCCESS if we successfully queried the OID.
NDIS_STATUS_XXX error code otherwise.
--*/
{
NDIS_STATUS Status;
PNDISUIO_QUERY_OID pQuery;
NDIS_OID Oid;
Oid = 0;
do
{
if (BufferLength < sizeof(NDISUIO_QUERY_OID))
{
Status = NDIS_STATUS_BUFFER_TOO_SHORT;
break;
}
pQuery = (PNDISUIO_QUERY_OID)pDataBuffer;
Oid = pQuery->Oid;
NUIO_ACQUIRE_LOCK(&pOpenContext->Lock);
if (!NUIO_TEST_FLAGS(pOpenContext->Flags, NUIOO_BIND_FLAGS, NUIOO_BIND_ACTIVE))
{
DEBUGP(DL_WARN,
("QueryOid: Open %p/%x is in invalid state\n",
pOpenContext, pOpenContext->Flags));
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
Status = NDIS_STATUS_FAILURE;
break;
}
//
// Make sure the binding doesn't go away.
//
NdisInterlockedIncrement(&pOpenContext->PendedSendCount);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
Status = ndisuioDoRequest(
pOpenContext,
NdisRequestQueryInformation,
Oid,
&pQuery->Data[0],
BufferLength - FIELD_OFFSET(NDISUIO_QUERY_OID, Data),
pBytesWritten);
NUIO_ACQUIRE_LOCK(&pOpenContext->Lock);
NdisInterlockedDecrement(&pOpenContext->PendedSendCount);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
if (Status == NDIS_STATUS_SUCCESS)
{
*pBytesWritten += FIELD_OFFSET(NDISUIO_QUERY_OID, Data);
}
}
while (FALSE);
DEBUGP(DL_LOUD, ("QueryOid: Open %p/%x, OID %x, Status %x\n",
pOpenContext, pOpenContext->Flags, Oid, Status));
return (Status);
}
NDIS_STATUS
ndisuioSetOidValue(
IN PNDISUIO_OPEN_CONTEXT pOpenContext,
OUT PVOID pDataBuffer,
IN ULONG BufferLength
)
/*++
Routine Description:
Set an arbitrary OID value to the miniport.
Arguments:
pOpenContext - pointer to open context representing our binding to the miniport
pDataBuffer - buffer that contains the value to be set
BufferLength - length of the above
Return Value:
NDIS_STATUS_SUCCESS if we successfully set the OID
NDIS_STATUS_XXX error code otherwise.
--*/
{
NDIS_STATUS Status;
PNDISUIO_SET_OID pSet;
NDIS_OID Oid;
ULONG BytesWritten;
Oid = 0;
do
{
if (BufferLength < sizeof(NDISUIO_SET_OID))
{
Status = NDIS_STATUS_BUFFER_TOO_SHORT;
break;
}
pSet = (PNDISUIO_SET_OID)pDataBuffer;
Oid = pSet->Oid;
NUIO_ACQUIRE_LOCK(&pOpenContext->Lock);
if (!NUIO_TEST_FLAGS(pOpenContext->Flags, NUIOO_BIND_FLAGS, NUIOO_BIND_ACTIVE))
{
DEBUGP(DL_WARN,
("SetOid: Open %p/%x is in invalid state\n",
pOpenContext, pOpenContext->Flags));
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
Status = NDIS_STATUS_FAILURE;
break;
}
//
// Make sure the binding doesn't go away.
//
NdisInterlockedIncrement(&pOpenContext->PendedSendCount);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
Status = ndisuioDoRequest(
pOpenContext,
NdisRequestSetInformation,
Oid,
&pSet->Data[0],
BufferLength - FIELD_OFFSET(NDISUIO_SET_OID, Data),
&BytesWritten);
NUIO_ACQUIRE_LOCK(&pOpenContext->Lock);
NdisInterlockedDecrement(&pOpenContext->PendedSendCount);
NUIO_RELEASE_LOCK(&pOpenContext->Lock);
}
while (FALSE);
DEBUGP(DL_LOUD, ("SetOid: Open %p/%x, OID %x, Status %x\n",
pOpenContext, pOpenContext->Flags, Oid, Status));
return (Status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -