mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
2.7 KiB
179 lines
2.7 KiB
/*++
|
|
|
|
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 );
|
|
}
|
|
|