📄 exnames.c
字号:
Index++) { CharBuf[Index] = *AmlAddress++; ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "%c\n", CharBuf[Index])); } /* Valid name segment */ if (Index == 4) { /* Found 4 valid characters */ CharBuf[4] = '\0'; if (NameString) { ACPI_STRCAT (NameString, CharBuf); ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Appended to - %s\n", NameString)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "No Name string - %s\n", CharBuf)); } } else if (Index == 0) { /* * First character was not a valid name character, * so we are looking at something other than a name. */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Leading character is not alpha: %02Xh (not a name)\n", CharBuf[0])); Status = AE_CTRL_PENDING; } else { /* * Segment started with one or more valid characters, but fewer than * the required 4 */ Status = AE_AML_BAD_NAME; ACPI_ERROR ((AE_INFO, "Bad character %02x in name, at %p", *AmlAddress, AmlAddress)); } *InAmlAddress = ACPI_CAST_PTR (UINT8, AmlAddress); return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION: AcpiExGetNameString * * PARAMETERS: DataType - Object type to be associated with this * name * InAmlAddress - Pointer to the namestring in the AML code * OutNameString - Where the namestring is returned * OutNameLength - Length of the returned string * * RETURN: Status, namestring and length * * DESCRIPTION: Extract a full namepath from the AML byte stream, * including any prefixes. * ******************************************************************************/ACPI_STATUSAcpiExGetNameString ( ACPI_OBJECT_TYPE DataType, UINT8 *InAmlAddress, char **OutNameString, UINT32 *OutNameLength){ ACPI_STATUS Status = AE_OK; UINT8 *AmlAddress = InAmlAddress; char *NameString = NULL; UINT32 NumSegments; UINT32 PrefixCount = 0; BOOLEAN HasPrefix = FALSE; ACPI_FUNCTION_TRACE_PTR (ExGetNameString, AmlAddress); if (ACPI_TYPE_LOCAL_REGION_FIELD == DataType || ACPI_TYPE_LOCAL_BANK_FIELD == DataType || ACPI_TYPE_LOCAL_INDEX_FIELD == DataType) { /* Disallow prefixes for types associated with FieldUnit names */ NameString = AcpiExAllocateNameString (0, 1); if (!NameString) { Status = AE_NO_MEMORY; } else { Status = AcpiExNameSegment (&AmlAddress, NameString); } } else { /* * DataType is not a field name. * Examine first character of name for root or parent prefix operators */ switch (*AmlAddress) { case AML_ROOT_PREFIX: ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "RootPrefix(\\) at %p\n", AmlAddress)); /* * Remember that we have a RootPrefix -- * see comment in AcpiExAllocateNameString() */ AmlAddress++; PrefixCount = ACPI_UINT32_MAX; HasPrefix = TRUE; break; case AML_PARENT_PREFIX: /* Increment past possibly multiple parent prefixes */ do { ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "ParentPrefix (^) at %p\n", AmlAddress)); AmlAddress++; PrefixCount++; } while (*AmlAddress == AML_PARENT_PREFIX); HasPrefix = TRUE; break; default: /* Not a prefix character */ break; } /* Examine first character of name for name segment prefix operator */ switch (*AmlAddress) { case AML_DUAL_NAME_PREFIX: ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "DualNamePrefix at %p\n", AmlAddress)); AmlAddress++; NameString = AcpiExAllocateNameString (PrefixCount, 2); if (!NameString) { Status = AE_NO_MEMORY; break; } /* Indicate that we processed a prefix */ HasPrefix = TRUE; Status = AcpiExNameSegment (&AmlAddress, NameString); if (ACPI_SUCCESS (Status)) { Status = AcpiExNameSegment (&AmlAddress, NameString); } break; case AML_MULTI_NAME_PREFIX_OP: ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n", AmlAddress)); /* Fetch count of segments remaining in name path */ AmlAddress++; NumSegments = *AmlAddress; NameString = AcpiExAllocateNameString (PrefixCount, NumSegments); if (!NameString) { Status = AE_NO_MEMORY; break; } /* Indicate that we processed a prefix */ AmlAddress++; HasPrefix = TRUE; while (NumSegments && (Status = AcpiExNameSegment (&AmlAddress, NameString)) == AE_OK) { NumSegments--; } break; case 0: /* NullName valid as of 8-12-98 ASL/AML Grammar Update */ if (PrefixCount == ACPI_UINT32_MAX) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "NameSeg is \"\\\" followed by NULL\n")); } /* Consume the NULL byte */ AmlAddress++; NameString = AcpiExAllocateNameString (PrefixCount, 0); if (!NameString) { Status = AE_NO_MEMORY; break; } break; default: /* Name segment string */ NameString = AcpiExAllocateNameString (PrefixCount, 1); if (!NameString) { Status = AE_NO_MEMORY; break; } Status = AcpiExNameSegment (&AmlAddress, NameString); break; } } if (AE_CTRL_PENDING == Status && HasPrefix) { /* Ran out of segments after processing a prefix */ ACPI_ERROR ((AE_INFO, "Malformed Name at %p", NameString)); Status = AE_AML_BAD_NAME; } if (ACPI_FAILURE (Status)) { if (NameString) { ACPI_FREE (NameString); } return_ACPI_STATUS (Status); } *OutNameString = NameString; *OutNameLength = (UINT32) (AmlAddress - InAmlAddress); return_ACPI_STATUS (Status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -