include vmm.inc push flags VMMcall _Debug_Out_Service
Asserts various conditions. This is an asynchronous service.
flags
Specifies the debug flags. It can be a combination of the following values:
Value | Meaning |
DFS_NEVER_REENTER | VMM has not been re-entered (see below). |
DFS_TEST_REENTER | VMM has not been re-entered (see below). |
DFS_NOT_SWAPPING | The current thread is not in the middle of a paging operation. |
DFS_TEST_CLD | Assert that the processor direction flag is cleared. |
DFS_TEST_BLOCK | Asssert that NoBlock_Count is set to zero. |
DFS_LOG | Log this procedure (if requested). |
DFS_PROFILE | Increment profile count and validate the segment registers. |
DFS_ENTER_NOBLOCK | Increment the NoBlock_Count. |
DFS_EXIT_NOBLOCK | Decrement the NoBlock_Count. |
The DFS_NEVER_REENTER and DFS_TEST_REENTER bits differ in their interaction with the Begin_Reentrant_Execution service. When the Begin_Reentrant_Execution service is called, the VMM re-entry count is reset to zero, even though the VMM has mostly like actually been re-entered. The DFS_TEST_REENTER bit checks this fake re-entry count, whereas the DFS_NEVER_REENTER bit checks the true re-entry count (which is unaffected by Begin_Reentrant_Execution).
The DFS_ENTER_NOBLOCK and DFS_EXIT_NOBLOCK flags increment and decrement a counter which is checked by the DFS_TEST_BLOCK bit. If the DFS_TEST_BLOCK bit is set when this internal counter is nonzero, the debugger will be notified if it is installed.
The DFS_LOG bit calls the Log_Proc_Call service on behalf of the caller.
The DFS_PROFILE bit causes the service to increment a DWORD variable generated by the BeginProc macro. Do not set this bit manually; let the BeginProc macro do it for you.
This service has no effect in the retail version of Windows. It is intended to be used with the debugging version.
As a rule, you should never call this service directly. It is generated automatically by macros in vmm.h and debug.h.
The BeginProc macro automatically calls this service with the DFS_LOG bit, as well as the DFS_TEST_REENTER if the procedure being declared is not an asynchronous service, and the DFS_TEST_BLOCK flag if the procedure is in pageable code. In the case of an exported service, the BeginProc macro also generates a DWORD profiling count and sets the DFS_PROFILE bit.
The ENTER_NOBLOCK, EXIT_NOBLOCK, and ASSERT_MIGHT_BLOCK macros in debug.h should be used to manipulate the block-related DFS bits.