180 lines
2.7 KiB
C
180 lines
2.7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
function.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Functions which are OpCode specific
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Stephane Plante
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Any
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FunctionField(
|
|||
|
IN PSTACK *Stack
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is the handler for the AML term 'IfElse'
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Stack - The stack for the current thread
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
PUNASM_SCOPE localScope;
|
|||
|
PUNASM_SCOPE rootScope;
|
|||
|
UCHAR action;
|
|||
|
|
|||
|
ASSERT( Stack != NULL && *Stack != NULL );
|
|||
|
|
|||
|
//
|
|||
|
//
|
|||
|
// Step 1: Push a new scope
|
|||
|
//
|
|||
|
status = ParsePush( Stack );
|
|||
|
if (!NT_SUCCESS( status )) {
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Step 2: Find the current scopes
|
|||
|
//
|
|||
|
ScopeFindLocalScope( Stack, &localScope, &rootScope, status );
|
|||
|
|
|||
|
//
|
|||
|
// Step 3: Program the parameters for the new scope
|
|||
|
//
|
|||
|
localScope->IndentLevel += 2;
|
|||
|
|
|||
|
//
|
|||
|
// Step 4: Remember to pop this scope
|
|||
|
//
|
|||
|
action = SC_PARSE_POP;
|
|||
|
StringStackPush( &(rootScope->ParseStack), 1, &action );
|
|||
|
|
|||
|
//
|
|||
|
// Step 5: Schedule a call to the field handler
|
|||
|
//
|
|||
|
action = SC_PARSE_FIELD;
|
|||
|
StringStackPush( &(rootScope->ParseStack), 1, &action );
|
|||
|
|
|||
|
//
|
|||
|
// Step 6:
|
|||
|
//
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FunctionScope(
|
|||
|
IN PSTACK *Stack
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is the handler for the AML Term 'Scope'
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Stack - The stack for the current thread
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
PUNASM_SCOPE localScope;
|
|||
|
PUNASM_SCOPE rootScope;
|
|||
|
UCHAR action;
|
|||
|
|
|||
|
ASSERT( Stack != NULL && *Stack != NULL);
|
|||
|
|
|||
|
//
|
|||
|
// Step 1: Push a new scope
|
|||
|
//
|
|||
|
status = ParsePush( Stack );
|
|||
|
if (!NT_SUCCESS( status )) {
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Step 2: Find the current scopes
|
|||
|
//
|
|||
|
ScopeFindLocalScope( Stack, &localScope, &rootScope, status );
|
|||
|
|
|||
|
//
|
|||
|
// Step 3: Program the parameters for the new scope
|
|||
|
//
|
|||
|
localScope->IndentLevel += 2;
|
|||
|
|
|||
|
//
|
|||
|
// Step 4: Remember to pop this scope
|
|||
|
//
|
|||
|
action = SC_PARSE_POP;
|
|||
|
StringStackPush( &(rootScope->ParseStack), 1, &action );
|
|||
|
|
|||
|
//
|
|||
|
// Step 5: Next action is to parse an opcode...
|
|||
|
//
|
|||
|
action = SC_PARSE_OPCODE;
|
|||
|
StringStackPush( &(rootScope->ParseStack), 1, &action );
|
|||
|
|
|||
|
//
|
|||
|
// Step 6: Done
|
|||
|
//
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FunctionTest(
|
|||
|
IN PSTACK *Stack
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is the handler for the AML Term 'Scope'
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Stack - The stack for the current thread
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return FunctionScope( Stack );
|
|||
|
}
|
|||
|
|