本文整理汇总了C++中IsListEmpty函数的典型用法代码示例。如果您正苦于以下问题:C++ IsListEmpty函数的具体用法?C++ IsListEmpty怎么用?C++ IsListEmpty使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IsListEmpty函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CounterInsertGroup
ULONG
CounterInsertGroup(
IN PDIALOG_OBJECT Object
)
{
PLIST_ENTRY ListHead;
PLIST_ENTRY ListEntry;
PMSP_DTL_OBJECT DtlObject;
PCOUNTER_CONTEXT Context;
PTREELIST_OBJECT TreeList;
PMSP_COUNTER_GROUP Group;
TVINSERTSTRUCT tvi = {0};
HTREEITEM hItemGroup;
HTREEITEM hItemRoot;
HWND hWndTree;
PMSP_COUNTER_OBJECT Counter;
ULONG Count;
Context = SdkGetContext(Object, COUNTER_CONTEXT);
DtlObject = Context->DtlObject;
TreeList = Context->TreeList;
hWndTree = TreeList->hWndTree;
MspReferenceCounterObject(DtlObject, &Counter);
Context->Counter = Counter;
if (IsListEmpty(&Counter->GroupListHead)) {
return 0;
}
Count = 0;
//
// Insert unique root node
//
tvi.hParent = NULL;
tvi.hInsertAfter = TVI_ROOT;
tvi.item.mask = TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = Counter->Name;
tvi.item.lParam = (LPARAM)Counter;
hItemRoot = TreeView_InsertItem(hWndTree, &tvi);
//
// Insert process group
//
hItemGroup = hItemRoot;
ListHead = &Counter->GroupListHead;
ListEntry = ListHead->Flink;
while (ListEntry != ListHead) {
Group = CONTAINING_RECORD(ListEntry, MSP_COUNTER_GROUP, ListEntry);
tvi.hParent = hItemRoot;
tvi.hInsertAfter = hItemGroup;
tvi.item.mask = TVIF_TEXT | TVIF_PARAM;
tvi.item.pszText = Group->Name;
tvi.item.lParam = (LPARAM)Group;
hItemGroup = TreeView_InsertItem(hWndTree, &tvi);
CounterInsertEntry(hWndTree, hItemGroup, Group);
ListEntry = ListEntry->Flink;
Count += 1;
}
return Count;
}
示例2: bind_device_ex
/*-------------------------------------------------------------------*/
int bind_device_ex (DEVBLK* dev, char* spec, ONCONNECT fn, void* arg )
{
bind_struct* bs;
int was_list_empty;
if (!init_done) init_sockdev();
if (sysblk.shutdown) return 0;
logdebug("bind_device (%4.4X, %s)\n", dev->devnum, spec);
/* Error if device already bound */
if (dev->bs)
{
logmsg (_("HHCSD001E Device %4.4X already bound to socket %s\n"),
dev->devnum, dev->bs->spec);
return 0; /* (failure) */
}
/* Create a new bind_struct entry */
bs = malloc(sizeof(bind_struct));
if (!bs)
{
logmsg (_("HHCSD002E bind_device malloc() failed for device %4.4X\n"),
dev->devnum);
return 0; /* (failure) */
}
memset(bs,0,sizeof(bind_struct));
bs->fn = fn;
bs->arg = arg;
if (!(bs->spec = strdup(spec)))
{
logmsg (_("HHCSD003E bind_device strdup() failed for device %4.4X\n"),
dev->devnum);
free (bs);
return 0; /* (failure) */
}
/* Create a listening socket */
if (bs->spec[0] == '/') bs->sd = unix_socket (bs->spec);
else bs->sd = inet_socket (bs->spec);
if (bs->sd == -1)
{
/* (error message already issued) */
free( bs->spec );
free( bs );
return 0; /* (failure) */
}
/* Chain device and bind_struct to each other */
dev->bs = bs;
bs->dev = dev;
/* Add the new entry to our list of bound devices
and create the socket thread that will listen
for connections (if it doesn't already exist) */
obtain_lock( &bind_lock );
was_list_empty = IsListEmpty( &bind_head );
InsertListTail( &bind_head, &bs->bind_link );
if ( was_list_empty )
{
if ( create_thread( &sysblk.socktid, JOINABLE,
socket_thread, NULL, "socket_thread" ) )
{
logmsg( _( "HHCSD023E Cannot create socketdevice thread: errno=%d: %s\n" ),
errno, strerror( errno ) );
RemoveListEntry( &bs->bind_link );
close_socket(bs->sd);
free( bs->spec );
free( bs );
release_lock( &bind_lock );
return 0; /* (failure) */
}
}
SIGNAL_SOCKDEV_THREAD();
release_lock( &bind_lock );
logmsg (_("HHCSD004I Device %4.4X bound to socket %s\n"),
dev->devnum, dev->bs->spec);
return 1; /* (success) */
}
示例3: LpcExitThread
VOID
LpcExitThread (
PETHREAD Thread
)
/*++
Routine Description:
This routine is called whenever a thread is exiting and need to cleanup the
lpc port for the thread.
Arguments:
Thread - Supplies the thread being terminated
Return Value:
None.
--*/
{
PLPCP_MESSAGE Msg;
//
// Acquire the mutex that protects the LpcReplyMessage field of
// the thread. Zero the field so nobody else tries to process it
// when we release the lock.
//
LpcpAcquireLpcpLock();
if (!IsListEmpty( &Thread->LpcReplyChain )) {
RemoveEntryList( &Thread->LpcReplyChain );
}
//
// Indicate that this thread is exiting
//
Thread->LpcExitThreadCalled = TRUE;
Thread->LpcReplyMessageId = 0;
//
// If we need to reply to a message then if the thread that we need to reply
// to is still around we want to dereference the thread and free the message
//
Msg = Thread->LpcReplyMessage;
if (Msg != NULL) {
Thread->LpcReplyMessage = NULL;
if (Msg->RepliedToThread != NULL) {
ObDereferenceObject( Msg->RepliedToThread );
Msg->RepliedToThread = NULL;
}
LpcpTrace(( "Cleanup Msg %lx (%d) for Thread %lx allocated\n", Msg, IsListEmpty( &Msg->Entry ), Thread ));
LpcpFreeToPortZone( Msg, TRUE );
}
//
// Free the global lpc lock
//
LpcpReleaseLpcpLock();
//
// And return to our caller
//
return;
}
示例4: InitializeAttrib
//.........这里部分代码省略.........
if (ChkPck.ValueCount > 0 ||
ChkPck.FlagCount > 2 ||
(2 == ChkPck.FlagCount && !LibCheckVarGetFlag (&ChkPck, L"-b"))
) {
PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_TOO_MANY), HiiHandle, L"attrib");
Status = EFI_INVALID_PARAMETER;
} else {
PrintToken (STRING_TOKEN (STR_ATTRIB_VERBOSE_HELP), HiiHandle);
Status = EFI_SUCCESS;
}
goto Quit;
}
//
// Local Variable Initializations
//
InitializeListHead (&FileList);
Link = NULL;
Arg = NULL;
Remove = 0;
Add = 0;
//
// Parse command line arguments
//
Item = GetFirstFlag (&ChkPck);
for (Index = 0; Index < ChkPck.FlagCount; Index += 1) {
if (Item->FlagStr[0] == '-') {
//
// Attributes to remove
//
Status = AttribSet (&Item->FlagStr[1], &Remove);
if (EFI_ERROR (Status)) {
PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_INVALID_ARG), HiiHandle, L"attrib", Item->FlagStr);
goto Done;
}
} else if (Item->FlagStr[0] == '+') {
//
// Attributes to Add
//
Status = AttribSet (&Item->FlagStr[1], &Add);
if (EFI_ERROR (Status)) {
PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_INVALID_ARG), HiiHandle, L"attrib", Item->FlagStr);
goto Done;
}
} else {
//
// we should never get here
//
ASSERT (FALSE);
}
Item = GetNextArg (Item);
}
Item = GetFirstArg (&ChkPck);
for (Index = 0; Index < ChkPck.ValueCount; Index += 1) {
Status = ShellFileMetaArg (Item->VarStr, &FileList);
if (EFI_ERROR (Status)) {
PrintToken (STRING_TOKEN (STR_ATTRIB_CANNOT_OPEN), HiiHandle, L"attrib", Item->VarStr, Status);
goto Done;
}
Item = GetNextArg (Item);
}
//
// if no file is specified, get the whole directory
//
if (IsListEmpty (&FileList)) {
Status = ShellFileMetaArg (L"*", &FileList);
if (EFI_ERROR (Status)) {
PrintToken (STRING_TOKEN (STR_ATTRIB_CANNOT_OPEN_DIR), HiiHandle, L"attrib", Status);
goto Done;
}
}
ShellDelDupFileArg (&FileList);
//
// Attrib each file
//
for (Link = FileList.Flink; Link != &FileList; Link = Link->Flink) {
//
// Break the execution?
//
if (GetExecutionBreak ()) {
goto Done;
}
Arg = CR (Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
Status = AttribFile (Arg, Remove, Add);
}
Done:
ShellFreeFileList (&FileList);
Quit:
LibCheckVarFreeVarList (&ChkPck);
LibUnInitializeStrings ();
return Status;
}
示例5: HelperPortFlushBSSList
NDIS_STATUS
HelperPortFlushBSSList(
__in PMP_PORT Port
)
{
MP_RW_LOCK_STATE LockState;
PLIST_ENTRY pListEntry;
PMP_BSS_ENTRY pBSSEntry = NULL;
LONG APRefCount;
LIST_ENTRY TempList;
PMP_HELPER_PORT HelperPort = MP_GET_HELPPORT(Port);
PMP_BSS_LIST pDiscoveredBSSList = &(HelperPort->BSSList);
//
// Entries that are currently in use (eg for connection)
// we cannot flush and instead would put in the temporary queue
//
InitializeListHead(&TempList);
MP_ACQUIRE_WRITE_LOCK(&(HelperPort->BSSList.ListLock), &LockState);
while (!IsListEmpty(&(pDiscoveredBSSList->List)))
{
pListEntry = RemoveHeadList(&(pDiscoveredBSSList->List));
pBSSEntry = CONTAINING_RECORD(pListEntry, MP_BSS_ENTRY, Link);
APRefCount = NdisInterlockedDecrement(&(pBSSEntry->RefCount));
if (APRefCount == 0)
{
NdisAcquireSpinLock(&(pBSSEntry->Lock));
MPASSERT(pBSSEntry->pAssocRequest == NULL);
MPASSERT(pBSSEntry->pAssocResponse == NULL);
if (pBSSEntry->pDot11BeaconFrame != NULL)
{
MP_FREE_MEMORY(pBSSEntry->pDot11BeaconFrame);
pBSSEntry->pDot11BeaconFrame = NULL;
pBSSEntry->BeaconFrameSize = 0;
pBSSEntry->MaxBeaconFrameSize= 0;
}
if (pBSSEntry->pDot11ProbeFrame != NULL)
{
MP_FREE_MEMORY(pBSSEntry->pDot11ProbeFrame);
pBSSEntry->pDot11ProbeFrame = NULL;
pBSSEntry->ProbeFrameSize = 0;
pBSSEntry->MaxProbeFrameSize= 0;
}
pBSSEntry->pDot11InfoElemBlob = NULL;
pBSSEntry->InfoElemBlobSize = 0;
NdisReleaseSpinLock(&(pBSSEntry->Lock));
MP_FREE_MEMORY(pBSSEntry);
}
else
{
// Restore refcount and save for adding back to list
NdisInterlockedIncrement(&(pBSSEntry->RefCount));
InsertTailList(&TempList, pListEntry);
}
}
pDiscoveredBSSList->NumOfBSSEntries = 0;
//
// Restore entries that are in use
//
while (!IsListEmpty(&TempList))
{
pListEntry = RemoveHeadList(&TempList);
InsertTailList(&(pDiscoveredBSSList->List), pListEntry);
pDiscoveredBSSList->NumOfBSSEntries++;
}
// Since our scan list is flushed, also clear the last scan time
HelperPort->ScanContext.LastScanTime = 0;
MP_RELEASE_WRITE_LOCK(&(HelperPort->BSSList.ListLock), &LockState);
return NDIS_STATUS_SUCCESS;
示例6: EnumNetCards
/*
kd> dt ndis!_NDIS_PROTOCOL_BLOCK
+0x000 Header : _NDIS_OBJECT_HEADER
+0x004 ProtocolDriverContext : Ptr32 Void
+0x008 NextProtocol : Ptr32 _NDIS_PROTOCOL_BLOCK
+0x00c OpenQueue : Ptr32 _NDIS_OPEN_BLOCK
win7
*/
BOOLEAN EnumNetCards()
{
PNDIS_MINIPORT_BLOCK pMiniBlock=NULL;
PNDIS_COMMON_OPEN_BLOCK_2k3_early pOpenBlock=NULL;
ULONG MiniDriverBlockHeader ;
ULONG NetCardType = 0;
LIST_ENTRY *pListEntry=NULL;
NETCARDS_INFO *pNI=NULL;
NTSTATUS status = STATUS_SUCCESS;
ULONG uTmp=0;
ADAPTER_INFOEX *pAdapterInfoEx = NULL;
ADAPTER_INFO AI;
WCHAR *p1,*p2;
ULONG index=0;
UNICODE_STRING uniTmp;
DWORD dwVersion=0;
PKK_NDIS_PROTOCOL_BLOCK pProtocol = (PKK_NDIS_PROTOCOL_BLOCK)GetProtocolHeader();
dwVersion = GetWindowsVersion();
p1=p2=NULL;
//清空列表
if (!IsListEmpty(&g_NetCardsInfoHeader.Next))
{
ExInterlockedRemoveHeadList(&g_NetCardsInfoHeader.Next, &g_NetCardsInfoLock);
// LockResource(&g_NetCardsInfoLock, TRUE);
// pListEntry = RemoveHeadList(&g_NetCardsInfoHeader.Next);
// UnlockResource(&g_NetCardsInfoLock);
pNI = CONTAINING_RECORD(pListEntry, NETCARDS_INFO, Next);
if (NULL==pNI)
{
DbgBreakPoint();
}
RtlFreeAnsiString(&pNI->Name);
kfree(pNI);
}
status = GetAdapterInfo(NULL, &uTmp);
if (status==STATUS_BUFFER_TOO_SMALL)
{
pAdapterInfoEx = kmalloc(uTmp);
RtlZeroMemory(pAdapterInfoEx, uTmp);
if (NULL== pAdapterInfoEx)
{
return FALSE;
}
}
status = GetAdapterInfo(pAdapterInfoEx, &uTmp);
if (pAdapterInfoEx->uNumber==0)
{
kprintf("GetAdapterInfo() return pAdapterInfoEx->uNumber==0");
kfree(pAdapterInfoEx);
return FALSE;
}
while (pProtocol)
{
//search for the nic driver block
if (dwVersion==Windows_7||dwVersion==Windows_Vista)
{
if (((PNDIS_PROTOCOL_BLOCKWin7)pProtocol)->OpenQueue==0)
{
goto NextBlock;
}
}
else
{
if (pProtocol->OpenQueue==NULL)
{
goto NextBlock;
}
}
uTmp=0;
//现在使用了protocol链表,所以要防止一个miniport多次使用的情况
if (dwVersion==Windows_Vista||dwVersion==Windows_7)
{
PNDIS_OPEN_BLOCKWIN7 pOP7 = (PNDIS_OPEN_BLOCKWIN7)((PNDIS_PROTOCOL_BLOCKWin7)pProtocol)->OpenQueue;
pMiniBlock = pOP7->MiniportHandle;
}
else
{
pMiniBlock = pProtocol->OpenQueue->MiniportHandle;
}
pListEntry = g_NetCardsInfoHeader.Next.Flink;
//.........这里部分代码省略.........
示例7: NICHandleRecvInterrupt
VOID
NICHandleRecvInterrupt(
IN PFDO_DATA FdoData
)
/*++
Routine Description:
Interrupt handler for receive processing. Put the received packets
into an array and call NICServiceReadIrps. If we run low on
RFDs, allocate another one.
Assumption: This function is called with the Rcv SPINLOCK held.
Arguments:
FdoData Pointer to our FdoData
Return Value:
None
--*/
{
PMP_RFD pMpRfd = NULL;
PHW_RFD pHwRfd = NULL;
PMP_RFD PacketArray[NIC_DEF_RFDS];
PMP_RFD PacketFreeArray[NIC_DEF_RFDS];
UINT PacketArrayCount;
UINT PacketFreeCount;
UINT Index;
UINT LoopIndex = 0;
UINT LoopCount = NIC_MAX_RFDS / NIC_DEF_RFDS + 1; // avoid staying here too long
BOOLEAN bContinue = TRUE;
BOOLEAN bAllocNewRfd = FALSE;
USHORT PacketStatus;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_READ, "---> NICHandleRecvInterrupt\n");
ASSERT(FdoData->nReadyRecv >= NIC_MIN_RFDS);
while (LoopIndex++ < LoopCount && bContinue)
{
PacketArrayCount = 0;
PacketFreeCount = 0;
//
// Process up to the array size RFD's
//
while (PacketArrayCount < NIC_DEF_RFDS)
{
if (IsListEmpty(&FdoData->RecvList))
{
ASSERT(FdoData->nReadyRecv == 0);
bContinue = FALSE;
break;
}
//
// Get the next MP_RFD to process
//
pMpRfd = (PMP_RFD)GetListHeadEntry(&FdoData->RecvList);
//
// Get the associated HW_RFD
//
pHwRfd = pMpRfd->HwRfd;
//
// Is this packet completed?
//
PacketStatus = NIC_RFD_GET_STATUS(pHwRfd);
if (!NIC_RFD_STATUS_COMPLETED(PacketStatus))
{
bContinue = FALSE;
break;
}
//
// HW specific - check if actual count field has been updated
//
if (!NIC_RFD_VALID_ACTUALCOUNT(pHwRfd))
{
bContinue = FALSE;
break;
}
//
// Remove the RFD from the head of the List
//
RemoveEntryList((PLIST_ENTRY)pMpRfd);
FdoData->nReadyRecv--;
ASSERT(MP_TEST_FLAG(pMpRfd, fMP_RFD_RECV_READY));
MP_CLEAR_FLAG(pMpRfd, fMP_RFD_RECV_READY);
//
// A good packet? drop it if not.
//.........这里部分代码省略.........
示例8: KeUnstackDetachProcess
VOID
KeUnstackDetachProcess (
IN PRKAPC_STATE ApcState
)
/*++
Routine Description:
This function detaches a thread from another process' address space
and restores previous attach state.
Arguments:
ApcState - Supplies a pointer to an APC state structure that was returned
from a previous call to stack attach process.
Return Value:
None.
--*/
{
KIRQL OldIrql;
PKPROCESS Process;
PKTHREAD Thread;
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
//
// Raise IRQL to dispatcher level and lock dispatcher database.
//
Thread = KeGetCurrentThread();
KiLockDispatcherDatabase(&OldIrql);
//
// If the APC state has a distinguished process pointer value, then no
// attach was performed on the paired call to stack attach process.
//
if (ApcState->Process != (PRKPROCESS)1) {
//
// If the current thread is not attached to another process, a kernel
// APC is in progress, or either the kernel or user mode APC queues
// are not empty, then call bug check.
//
if ((Thread->ApcStateIndex == 0) ||
(Thread->ApcState.KernelApcInProgress) ||
(IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]) == FALSE) ||
(IsListEmpty(&Thread->ApcState.ApcListHead[UserMode]) == FALSE)) {
KeBugCheck(INVALID_PROCESS_DETACH_ATTEMPT);
}
//
// Unbias current process stack count and check if the process should
// be swapped out of memory.
//
Process = Thread->ApcState.Process;
Process->StackCount -= 1;
if ((Process->StackCount == 0) &&
(IsListEmpty(&Process->ThreadListHead) == FALSE)) {
Process->State = ProcessInTransition;
InsertTailList(&KiProcessOutSwapListHead, &Process->SwapListEntry);
KiSwapEvent.Header.SignalState = 1;
if (IsListEmpty(&KiSwapEvent.Header.WaitListHead) == FALSE) {
KiWaitTest(&KiSwapEvent, BALANCE_INCREMENT);
}
}
//
// Restore APC state and check whether the kernel APC queue contains
// an entry. If the kernel APC queue contains an entry then set kernel
// APC pending and request a software interrupt at APC_LEVEL.
//
if (ApcState->Process != NULL) {
KiMoveApcState(ApcState, &Thread->ApcState);
} else {
KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
Thread->SavedApcState.Process = (PKPROCESS)NULL;
Thread->ApcStatePointer[0] = &Thread->ApcState;
Thread->ApcStatePointer[1] = &Thread->SavedApcState;
Thread->ApcStateIndex = 0;
}
if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]) == FALSE) {
Thread->ApcState.KernelApcPending = TRUE;
KiRequestSoftwareInterrupt(APC_LEVEL);
}
//
// Swap the address space back to the parent process.
//
//.........这里部分代码省略.........
示例9: KeSetProcess
LONG
KeSetProcess (
IN PRKPROCESS Process,
IN KPRIORITY Increment,
IN BOOLEAN Wait
)
/*++
Routine Description:
This function sets the signal state of a proces object to Signaled
and attempts to satisfy as many Waits as possible. The previous
signal state of the process object is returned as the function value.
Arguments:
Process - Supplies a pointer to a dispatcher object of type process.
Increment - Supplies the priority increment that is to be applied
if setting the process causes a Wait to be satisfied.
Wait - Supplies a boolean value that signifies whether the call to
KeSetProcess will be immediately followed by a call to one of the
kernel Wait functions.
Return Value:
The previous signal state of the process object.
--*/
{
KIRQL OldIrql;
LONG OldState;
PRKTHREAD Thread;
ASSERT_PROCESS(Process);
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
//
// Raise IRQL to dispatcher level and lock dispatcher database.
//
KiLockDispatcherDatabase(&OldIrql);
//
// If the previous state of the process object is Not-Signaled and
// the wait queue is not empty, then satisfy as many Waits as
// possible.
//
OldState = Process->Header.SignalState;
Process->Header.SignalState = 1;
if ((OldState == 0) && (!IsListEmpty(&Process->Header.WaitListHead))) {
KiWaitTest(Process, Increment);
}
//
// If the value of the Wait argument is TRUE, then return to the
// caller with IRQL raised and the dispatcher database locked. Else
// release the dispatcher database lock and lower IRQL to its
// previous value.
//
if (Wait) {
Thread = KeGetCurrentThread();
Thread->WaitNext = Wait;
Thread->WaitIrql = OldIrql;
} else {
KiUnlockDispatcherDatabase(OldIrql);
}
//
// Return previous signal state of process object.
//
return OldState;
}
示例10: KiMoveApcState
VOID
KiMoveApcState (
IN PKAPC_STATE Source,
OUT PKAPC_STATE Destination
)
/*++
Routine Description:
This function moves the APC state from the source structure to the
destination structure and reinitializes list headers as appropriate.
Arguments:
Source - Supplies a pointer to the source APC state structure.
Destination - Supplies a pointer to the destination APC state structure.
Return Value:
None.
--*/
{
PLIST_ENTRY First;
PLIST_ENTRY Last;
//
// Copy the APC state from the source to the destination.
//
*Destination = *Source;
if (IsListEmpty(&Source->ApcListHead[KernelMode]) != FALSE) {
InitializeListHead(&Destination->ApcListHead[KernelMode]);
} else {
First = Source->ApcListHead[KernelMode].Flink;
Last = Source->ApcListHead[KernelMode].Blink;
Destination->ApcListHead[KernelMode].Flink = First;
Destination->ApcListHead[KernelMode].Blink = Last;
First->Blink = &Destination->ApcListHead[KernelMode];
Last->Flink = &Destination->ApcListHead[KernelMode];
}
if (IsListEmpty(&Source->ApcListHead[UserMode]) != FALSE) {
InitializeListHead(&Destination->ApcListHead[UserMode]);
} else {
First = Source->ApcListHead[UserMode].Flink;
Last = Source->ApcListHead[UserMode].Blink;
Destination->ApcListHead[UserMode].Flink = First;
Destination->ApcListHead[UserMode].Blink = Last;
First->Blink = &Destination->ApcListHead[UserMode];
Last->Flink = &Destination->ApcListHead[UserMode];
}
return;
}
示例11: KeDetachProcess
VOID
KeDetachProcess (
VOID
)
/*++
Routine Description:
This function detaches a thread from another process' address space.
Arguments:
None.
Return Value:
None.
--*/
{
KIRQL OldIrql;
PKPROCESS Process;
PKTHREAD Thread;
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
//
// Raise IRQL to dispatcher level and lock dispatcher database.
//
Thread = KeGetCurrentThread();
KiLockDispatcherDatabase(&OldIrql);
//
// If the current thread is attached to another process, then detach
// it.
//
if (Thread->ApcStateIndex != 0) {
//
// Check if a kernel APC is in progress, the kernel APC queue is
// not empty, or the user APC queue is not empty. If any of these
// conditions are true, then call bug check.
//
#if DBG
if ((Thread->ApcState.KernelApcInProgress) ||
(IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]) == FALSE) ||
(IsListEmpty(&Thread->ApcState.ApcListHead[UserMode]) == FALSE)) {
KeBugCheck(INVALID_PROCESS_DETACH_ATTEMPT);
}
#endif
//
// Unbias current process stack count and check if the process should
// be swapped out of memory.
//
Process = Thread->ApcState.Process;
Process->StackCount -= 1;
if ((Process->StackCount == 0) &&
(IsListEmpty(&Process->ThreadListHead) == FALSE)) {
Process->State = ProcessInTransition;
InsertTailList(&KiProcessOutSwapListHead, &Process->SwapListEntry);
KiSwapEvent.Header.SignalState = 1;
if (IsListEmpty(&KiSwapEvent.Header.WaitListHead) == FALSE) {
KiWaitTest(&KiSwapEvent, BALANCE_INCREMENT);
}
}
//
// Restore APC state and check whether the kernel APC queue contains
// an entry. If the kernel APC queue contains an entry then set kernel
// APC pending and request a software interrupt at APC_LEVEL.
//
KiMoveApcState(&Thread->SavedApcState, &Thread->ApcState);
Thread->SavedApcState.Process = (PKPROCESS)NULL;
Thread->ApcStatePointer[0] = &Thread->ApcState;
Thread->ApcStatePointer[1] = &Thread->SavedApcState;
Thread->ApcStateIndex = 0;
if (IsListEmpty(&Thread->ApcState.ApcListHead[KernelMode]) == FALSE) {
Thread->ApcState.KernelApcPending = TRUE;
KiRequestSoftwareInterrupt(APC_LEVEL);
}
//
// Swap the address space back to the parent process.
//
KiSwapProcess(Thread->ApcState.Process, Process);
}
//
//.........这里部分代码省略.........
示例12: WsAsyncThread
DWORD
WINAPI
WsAsyncThread(IN PWSASYNCCONTEXT Context)
{
PWSASYNCBLOCK AsyncBlock;
PLIST_ENTRY Entry;
HANDLE AsyncEvent = Context->AsyncEvent;
PLIST_ENTRY ListHead = &Context->AsyncQueue;
/* Set the blocking hook */
WSASetBlockingHook((FARPROC)WsAsyncThreadBlockingHook);
/* Loop */
while (TRUE)
{
/* Wait for the event */
WaitForSingleObject(AsyncEvent, INFINITE);
/* Get the lock */
WsAsyncLock();
/* Process the queue */
while (ListHead->Flink != ListHead)
{
/* Remove this entry and get the async block */
Entry = RemoveHeadList(ListHead);
AsyncBlock = CONTAINING_RECORD(Entry, WSASYNCBLOCK, AsyncQueue);
/* Save the current task handle */
WsAsyncCurrentTaskHandle = AsyncBlock->TaskHandle;
/* Release the lock */
WsAsyncUnlock();
/* Check which operation to do */
switch (AsyncBlock->Operation)
{
/* Get Host by Y */
case WsAsyncGetHostByAddr: case WsAsyncGetHostByName:
/* Call the handler */
WsAsyncGetHost(AsyncBlock->TaskHandle,
AsyncBlock->Operation,
AsyncBlock->GetHost.hWnd,
AsyncBlock->GetHost.wMsg,
AsyncBlock->GetHost.ByWhat,
AsyncBlock->GetHost.Length,
AsyncBlock->GetHost.Type,
AsyncBlock->GetHost.Buffer,
AsyncBlock->GetHost.BufferLength);
break;
/* Get Proto by Y */
case WsAsyncGetProtoByNumber: case WsAsyncGetProtoByName:
/* Call the handler */
WsAsyncGetProto(AsyncBlock->TaskHandle,
AsyncBlock->Operation,
AsyncBlock->GetProto.hWnd,
AsyncBlock->GetProto.wMsg,
AsyncBlock->GetHost.ByWhat,
AsyncBlock->GetProto.Buffer,
AsyncBlock->GetProto.BufferLength);
break;
/* Get Serv by Y */
case WsAsyncGetServByPort: case WsAsyncGetServByName:
/* Call the handler */
WsAsyncGetServ(AsyncBlock->TaskHandle,
AsyncBlock->Operation,
AsyncBlock->GetServ.hWnd,
AsyncBlock->GetServ.wMsg,
AsyncBlock->GetServ.ByWhat,
AsyncBlock->GetServ.Protocol,
AsyncBlock->GetServ.Buffer,
AsyncBlock->GetServ.BufferLength);
break;
/* Termination */
case WsAsyncTerminate:
/* Clean up the extra reference */
WSACleanup();
/* Free the context block */
WsAsyncFreeBlock(AsyncBlock);
/* Acquire the lock */
WsAsyncLock();
/* Loop the queue and flush it */
while (!IsListEmpty(ListHead))
{
Entry = RemoveHeadList(ListHead);
AsyncBlock = CONTAINING_RECORD(Entry,
WSASYNCBLOCK,
AsyncQueue);
WsAsyncFreeBlock(AsyncBlock);
}
//.........这里部分代码省略.........
示例13: Image
//.........这里部分代码省略.........
StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);
} else {
PrintCommandText = FALSE;
// ASSERT(SectionToGetHelpOn == NULL);
//
// Get the section name for the given command name
//
if (ShellCommandLineGetFlag(Package, L"-section")) {
StrnCatGrow(&SectionToGetHelpOn, NULL, ShellCommandLineGetValue(Package, L"-section"), 0);
} else if (ShellCommandLineGetFlag(Package, L"-usage")) {
StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS", 0);
} else if (ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v")) {
} else {
//
// The output of help <command> will display NAME, SYNOPSIS, OPTIONS, DESCRIPTION, and EXAMPLES sections.
//
StrnCatGrow (&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS,OPTIONS,DESCRIPTION,EXAMPLES", 0);
}
}
if (gUnicodeCollation->StriColl(gUnicodeCollation, CommandToGetHelpOn, L"special") == 0) {
//
// we need info on the special characters
//
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle);
HiiString = HiiGetString(gShellLevel3HiiHandle, STRING_TOKEN(STR_HELP_SC_DATA), NULL);
ShellPrintEx(-1, -1, L"%s", HiiString);
FreePool(HiiString);
Found = TRUE;
} else {
CommandList = ShellCommandGetCommandList(TRUE);
// ASSERT(CommandList != NULL);
for ( Node = (COMMAND_LIST*)GetFirstNode(&CommandList->Link)
; CommandList != NULL && !IsListEmpty(&CommandList->Link) && !IsNull(&CommandList->Link, &Node->Link)
; Node = (COMMAND_LIST*)GetNextNode(&CommandList->Link, &Node->Link)
) {
//
// Checking execution break flag when print multiple command help information.
//
if (ShellGetExecutionBreakFlag ()) {
break;
}
if ((gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, CommandToGetHelpOn)) ||
(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {
// Print(L"found node %s\n", Node->CommandString);
//
// We have a command to look for help on.
//
Status = ShellPrintHelp(Node->CommandString, SectionToGetHelpOn, PrintCommandText);
if (Status == EFI_DEVICE_ERROR) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, Node->CommandString);
} else if (EFI_ERROR(Status)) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, Node->CommandString);
} else {
Found = TRUE;
}
}
}
//
// now try to match against the dynamic command list and print help
//
Status = PrintDynamicCommandHelp (CommandToGetHelpOn, SectionToGetHelpOn,
PrintCommandText);
if (!EFI_ERROR(Status)) {
Found = TRUE;
示例14: DokanFindStreams
NTSTATUS
DokanFindStreams(PFILE_STREAM_INFORMATION StreamInfo, PDOKAN_FILE_INFO FileInfo,
PEVENT_CONTEXT EventContext, PDOKAN_INSTANCE DokanInstance,
PULONG RemainingLength) {
PDOKAN_OPEN_INFO openInfo =
(PDOKAN_OPEN_INFO)(UINT_PTR)FileInfo->DokanContext;
NTSTATUS status = STATUS_SUCCESS;
if (!DokanInstance->DokanOperations->FindStreams) {
return STATUS_NOT_IMPLEMENTED;
}
if (openInfo->StreamListHead == NULL) {
openInfo->StreamListHead = malloc(sizeof(LIST_ENTRY));
if (openInfo->StreamListHead != NULL) {
InitializeListHead(openInfo->StreamListHead);
} else {
status = STATUS_NO_MEMORY;
}
}
if (status == STATUS_SUCCESS && IsListEmpty(openInfo->StreamListHead)) {
status = DokanInstance->DokanOperations->FindStreams(
EventContext->Operation.File.FileName, DokanFillFindStreamData,
FileInfo);
}
if (status == STATUS_SUCCESS) {
PLIST_ENTRY listHead, entry;
ULONG entrySize;
listHead = openInfo->StreamListHead;
entrySize = 0;
for (entry = listHead->Flink; entry != listHead; entry = entry->Flink) {
PDOKAN_FIND_STREAM_DATA find =
CONTAINING_RECORD(entry, DOKAN_FIND_STREAM_DATA, ListEntry);
ULONG nextEntryOffset = entrySize;
ULONG streamNameLength =
(ULONG)wcslen(find->FindStreamData.cStreamName) * sizeof(WCHAR);
entrySize = sizeof(FILE_STREAM_INFORMATION) + streamNameLength;
// Must be align on a 8-byte boundary.
entrySize = QuadAlign(entrySize);
if (*RemainingLength < entrySize) {
status = STATUS_BUFFER_OVERFLOW;
break;
}
// Not the first entry, set the offset before filling the new entry
if (nextEntryOffset > 0) {
StreamInfo->NextEntryOffset = nextEntryOffset;
StreamInfo = (PFILE_STREAM_INFORMATION)((LPBYTE)StreamInfo +
StreamInfo->NextEntryOffset);
}
// Fill the new entry
StreamInfo->StreamNameLength = streamNameLength;
memcpy(StreamInfo->StreamName, find->FindStreamData.cStreamName,
streamNameLength);
StreamInfo->StreamSize = find->FindStreamData.StreamSize;
StreamInfo->StreamAllocationSize = find->FindStreamData.StreamSize;
StreamInfo->NextEntryOffset = 0;
ALIGN_ALLOCATION_SIZE(&StreamInfo->StreamAllocationSize);
*RemainingLength -= entrySize;
}
if (status != STATUS_BUFFER_OVERFLOW) {
ClearFindStreamData(openInfo->StreamListHead);
}
} else {
ClearFindStreamData(openInfo->StreamListHead);
}
return status;
}
示例15: VfatDismountVolume
static
NTSTATUS
VfatDismountVolume(
PVFAT_IRP_CONTEXT IrpContext)
{
PDEVICE_EXTENSION DeviceExt;
PLIST_ENTRY NextEntry;
PVFATFCB Fcb;
PFILE_OBJECT FileObject;
ULONG eocMark;
NTSTATUS Status;
DPRINT("VfatDismountVolume(%p)\n", IrpContext);
DeviceExt = IrpContext->DeviceExt;
FileObject = IrpContext->FileObject;
/* We HAVE to be locked. Windows also allows dismount with no lock
* but we're here mainly for 1st stage, so KISS
*/
if (!(DeviceExt->Flags & VCB_VOLUME_LOCKED))
{
return STATUS_ACCESS_DENIED;
}
/* Race condition? */
if (DeviceExt->Flags & VCB_DISMOUNT_PENDING)
{
return STATUS_VOLUME_DISMOUNTED;
}
/* Notify we'll dismount. Pass that point there's no reason we fail */
FsRtlNotifyVolumeEvent(IrpContext->Stack->FileObject, FSRTL_VOLUME_DISMOUNT);
ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
if (DeviceExt->VolumeFcb->Flags & VCB_CLEAR_DIRTY)
{
/* Set clean shutdown bit */
Status = GetNextCluster(DeviceExt, 1, &eocMark);
if (NT_SUCCESS(Status))
{
eocMark |= DeviceExt->CleanShutBitMask;
if (NT_SUCCESS(WriteCluster(DeviceExt, 1, eocMark)))
DeviceExt->VolumeFcb->Flags &= ~VCB_IS_DIRTY;
}
}
/* Flush volume & files */
VfatFlushVolume(DeviceExt, (PVFATFCB)FileObject->FsContext);
/* Rebrowse the FCB in order to free them now */
while (!IsListEmpty(&DeviceExt->FcbListHead))
{
NextEntry = RemoveHeadList(&DeviceExt->FcbListHead);
Fcb = CONTAINING_RECORD(NextEntry, VFATFCB, FcbListEntry);
vfatDestroyFCB(Fcb);
}
/* Mark we're being dismounted */
DeviceExt->Flags |= VCB_DISMOUNT_PENDING;
#ifndef ENABLE_SWAPOUT
IrpContext->DeviceObject->Vpb->Flags &= ~VPB_MOUNTED;
#endif
ExReleaseResourceLite(&DeviceExt->FatResource);
/* Release a few resources and quit, we're done */
ExDeleteResourceLite(&DeviceExt->DirResource);
ExDeleteResourceLite(&DeviceExt->FatResource);
ObDereferenceObject(DeviceExt->FATFileObject);
return STATUS_SUCCESS;
}