ReactOS  0.4.14-dev-342-gdc047f9
nsxfname.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
#include "acparser.h"
#include "amlcode.h"
Include dependency graph for nsxfname.c:

Go to the source code of this file.

Macros

#define EXPORT_ACPI_INTERFACES
 
#define _COMPONENT   ACPI_NAMESPACE
 

Functions

static charAcpiNsCopyDeviceId (ACPI_PNP_DEVICE_ID *Dest, ACPI_PNP_DEVICE_ID *Source, char *StringArea)
 
ACPI_STATUS AcpiGetHandle (ACPI_HANDLE Parent, ACPI_STRING Pathname, ACPI_HANDLE *RetHandle)
 
ACPI_STATUS AcpiGetName (ACPI_HANDLE Handle, UINT32 NameType, ACPI_BUFFER *Buffer)
 
ACPI_STATUS AcpiGetObjectInfo (ACPI_HANDLE Handle, ACPI_DEVICE_INFO **ReturnBuffer)
 
ACPI_STATUS AcpiInstallMethod (UINT8 *Buffer)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_NAMESPACE

Definition at line 54 of file nsxfname.c.

◆ EXPORT_ACPI_INTERFACES

#define EXPORT_ACPI_INTERFACES

Definition at line 45 of file nsxfname.c.

Function Documentation

◆ AcpiGetHandle()

ACPI_STATUS AcpiGetHandle ( ACPI_HANDLE  Parent,
ACPI_STRING  Pathname,
ACPI_HANDLE RetHandle 
)

Definition at line 85 of file nsxfname.c.

89 {
92  ACPI_NAMESPACE_NODE *PrefixNode = NULL;
93 
94 
96 
97 
98  /* Parameter Validation */
99 
100  if (!RetHandle || !Pathname)
101  {
102  return (AE_BAD_PARAMETER);
103  }
104 
105  /* Convert a parent handle to a prefix node */
106 
107  if (Parent)
108  {
109  PrefixNode = AcpiNsValidateHandle (Parent);
110  if (!PrefixNode)
111  {
112  return (AE_BAD_PARAMETER);
113  }
114  }
115 
116  /*
117  * Valid cases are:
118  * 1) Fully qualified pathname
119  * 2) Parent + Relative pathname
120  *
121  * Error for <null Parent + relative path>
122  */
123  if (ACPI_IS_ROOT_PREFIX (Pathname[0]))
124  {
125  /* Pathname is fully qualified (starts with '\') */
126 
127  /* Special case for root-only, since we can't search for it */
128 
130  {
131  *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, AcpiGbl_RootNode);
132  return (AE_OK);
133  }
134  }
135  else if (!PrefixNode)
136  {
137  /* Relative path with null prefix is disallowed */
138 
139  return (AE_BAD_PARAMETER);
140  }
141 
142  /* Find the Node and convert to a handle */
143 
145  if (ACPI_SUCCESS (Status))
146  {
147  *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
148  }
149 
150  return (Status);
151 }
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:728
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_STATUS AcpiNsGetNode(ACPI_NAMESPACE_NODE *PrefixNode, const char *ExternalPathname, UINT32 Flags, ACPI_NAMESPACE_NODE **OutNode)
Definition: nsutils.c:863
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_FUNCTION_ENTRY()
Definition: acoutput.h:484
Status
Definition: gdiplustypes.h:24
#define ACPI_NS_NO_UPSEARCH
Definition: acnamesp.h:62
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define ACPI_IS_ROOT_PREFIX(c)
Definition: acmacros.h:401
ACPI_NAMESPACE_NODE * AcpiNsValidateHandle(ACPI_HANDLE Handle)
Definition: nsutils.c:655
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define ACPI_NS_ROOT_PATH
Definition: acnames.h:94
#define AE_OK
Definition: acexcep.h:97
Definition: dlist.c:348
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING Pathname
Definition: acpixf.h:700

Referenced by acpi_bus_get_flags(), acpi_bus_get_power_flags(), AcpiEvaluateObjectTyped(), AcpiEvOrphanEcRegMethod(), AcpiNsInitializeDevices(), and AcpiUtGetMutexObject().

◆ AcpiGetName()

ACPI_STATUS AcpiGetName ( ACPI_HANDLE  Handle,
UINT32  NameType,
ACPI_BUFFER Buffer 
)

Definition at line 173 of file nsxfname.c.

177 {
179 
180 
181  /* Parameter validation */
182 
184  {
185  return (AE_BAD_PARAMETER);
186  }
187 
189  if (ACPI_FAILURE (Status))
190  {
191  return (Status);
192  }
193 
194  /*
195  * Wants the single segment ACPI name.
196  * Validate handle and convert to a namespace Node
197  */
199  if (ACPI_FAILURE (Status))
200  {
201  return (Status);
202  }
203 
204  if (NameType == ACPI_FULL_PATHNAME ||
206  {
207  /* Get the full pathname (From the namespace root) */
208 
211  }
212  else
213  {
214  /* Get the single name */
215 
217  }
218 
220  return (Status);
221 }
#define TRUE
Definition: types.h:120
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
#define ACPI_FULL_PATHNAME_NO_TRAILING
Definition: actypes.h:1053
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
Definition: bufpool.h:45
ACPI_STATUS AcpiNsHandleToPathname(ACPI_HANDLE TargetHandle, ACPI_BUFFER *Buffer, BOOLEAN NoTrailing)
Definition: nsnames.c:193
_In_ HANDLE Handle
Definition: extypes.h:390
#define ACPI_NAME_TYPE_MAX
Definition: actypes.h:1054
#define ACPI_FULL_PATHNAME
Definition: actypes.h:1051
ACPI_STATUS AcpiNsHandleToName(ACPI_HANDLE TargetHandle, ACPI_BUFFER *Buffer)
Definition: nsnames.c:139
Status
Definition: gdiplustypes.h:24
ACPI_STATUS AcpiUtValidateBuffer(ACPI_BUFFER *Buffer)
Definition: utalloc.c:290
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 NameType
Definition: acpixf.h:654
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85

Referenced by acpi_bus_add(), acpi_power_get_state(), and acpi_util_eval_error().

◆ AcpiGetObjectInfo()

ACPI_STATUS AcpiGetObjectInfo ( ACPI_HANDLE  Handle,
ACPI_DEVICE_INFO **  ReturnBuffer 
)

Definition at line 287 of file nsxfname.c.

290 {
293  ACPI_PNP_DEVICE_ID_LIST *CidList = NULL;
294  ACPI_PNP_DEVICE_ID *Hid = NULL;
295  ACPI_PNP_DEVICE_ID *Uid = NULL;
296  ACPI_PNP_DEVICE_ID *Cls = NULL;
297  char *NextIdString;
299  ACPI_NAME Name;
300  UINT8 ParamCount= 0;
301  UINT16 Valid = 0;
302  UINT32 InfoSize;
303  UINT32 i;
305 
306 
307  /* Parameter validation */
308 
309  if (!Handle || !ReturnBuffer)
310  {
311  return (AE_BAD_PARAMETER);
312  }
313 
315  if (ACPI_FAILURE (Status))
316  {
317  return (Status);
318  }
319 
321  if (!Node)
322  {
324  return (AE_BAD_PARAMETER);
325  }
326 
327  /* Get the namespace node data while the namespace is locked */
328 
329  InfoSize = sizeof (ACPI_DEVICE_INFO);
330  Type = Node->Type;
331  Name = Node->Name.Integer;
332 
333  if (Node->Type == ACPI_TYPE_METHOD)
334  {
335  ParamCount = Node->Object->Method.ParamCount;
336  }
337 
339  if (ACPI_FAILURE (Status))
340  {
341  return (Status);
342  }
343 
344  if ((Type == ACPI_TYPE_DEVICE) ||
346  {
347  /*
348  * Get extra info for ACPI Device/Processor objects only:
349  * Run the Device _HID, _UID, _CLS, and _CID methods.
350  *
351  * Note: none of these methods are required, so they may or may
352  * not be present for this device. The Info->Valid bitfield is used
353  * to indicate which methods were found and run successfully.
354  */
355 
356  /* Execute the Device._HID method */
357 
358  Status = AcpiUtExecute_HID (Node, &Hid);
359  if (ACPI_SUCCESS (Status))
360  {
361  InfoSize += Hid->Length;
362  Valid |= ACPI_VALID_HID;
363  }
364 
365  /* Execute the Device._UID method */
366 
367  Status = AcpiUtExecute_UID (Node, &Uid);
368  if (ACPI_SUCCESS (Status))
369  {
370  InfoSize += Uid->Length;
371  Valid |= ACPI_VALID_UID;
372  }
373 
374  /* Execute the Device._CID method */
375 
376  Status = AcpiUtExecute_CID (Node, &CidList);
377  if (ACPI_SUCCESS (Status))
378  {
379  /* Add size of CID strings and CID pointer array */
380 
381  InfoSize += (CidList->ListSize - sizeof (ACPI_PNP_DEVICE_ID_LIST));
382  Valid |= ACPI_VALID_CID;
383  }
384 
385  /* Execute the Device._CLS method */
386 
387  Status = AcpiUtExecute_CLS (Node, &Cls);
388  if (ACPI_SUCCESS (Status))
389  {
390  InfoSize += Cls->Length;
391  Valid |= ACPI_VALID_CLS;
392  }
393  }
394 
395  /*
396  * Now that we have the variable-length data, we can allocate the
397  * return buffer
398  */
399  Info = ACPI_ALLOCATE_ZEROED (InfoSize);
400  if (!Info)
401  {
403  goto Cleanup;
404  }
405 
406  /* Get the fixed-length data */
407 
408  if ((Type == ACPI_TYPE_DEVICE) ||
410  {
411  /*
412  * Get extra info for ACPI Device/Processor objects only:
413  * Run the _ADR and, SxW, and _SxD methods.
414  *
415  * Notes: none of these methods are required, so they may or may
416  * not be present for this device. The Info->Valid bitfield is used
417  * to indicate which methods were found and run successfully.
418  */
419 
420  /* Execute the Device._ADR method */
421 
423  &Info->Address);
424  if (ACPI_SUCCESS (Status))
425  {
426  Valid |= ACPI_VALID_ADR;
427  }
428 
429  /* Execute the Device._SxW methods */
430 
433  Info->LowestDstates);
434  if (ACPI_SUCCESS (Status))
435  {
436  Valid |= ACPI_VALID_SXWS;
437  }
438 
439  /* Execute the Device._SxD methods */
440 
443  Info->HighestDstates);
444  if (ACPI_SUCCESS (Status))
445  {
446  Valid |= ACPI_VALID_SXDS;
447  }
448  }
449 
450  /*
451  * Create a pointer to the string area of the return buffer.
452  * Point to the end of the base ACPI_DEVICE_INFO structure.
453  */
454  NextIdString = ACPI_CAST_PTR (char, Info->CompatibleIdList.Ids);
455  if (CidList)
456  {
457  /* Point past the CID PNP_DEVICE_ID array */
458 
459  NextIdString += ((ACPI_SIZE) CidList->Count * sizeof (ACPI_PNP_DEVICE_ID));
460  }
461 
462  /*
463  * Copy the HID, UID, and CIDs to the return buffer. The variable-length
464  * strings are copied to the reserved area at the end of the buffer.
465  *
466  * For HID and CID, check if the ID is a PCI Root Bridge.
467  */
468  if (Hid)
469  {
470  NextIdString = AcpiNsCopyDeviceId (&Info->HardwareId,
471  Hid, NextIdString);
472 
473  if (AcpiUtIsPciRootBridge (Hid->String))
474  {
475  Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
476  }
477  }
478 
479  if (Uid)
480  {
481  NextIdString = AcpiNsCopyDeviceId (&Info->UniqueId,
482  Uid, NextIdString);
483  }
484 
485  if (CidList)
486  {
487  Info->CompatibleIdList.Count = CidList->Count;
488  Info->CompatibleIdList.ListSize = CidList->ListSize;
489 
490  /* Copy each CID */
491 
492  for (i = 0; i < CidList->Count; i++)
493  {
494  NextIdString = AcpiNsCopyDeviceId (&Info->CompatibleIdList.Ids[i],
495  &CidList->Ids[i], NextIdString);
496 
497  if (AcpiUtIsPciRootBridge (CidList->Ids[i].String))
498  {
499  Info->Flags |= ACPI_PCI_ROOT_BRIDGE;
500  }
501  }
502  }
503 
504  if (Cls)
505  {
506  (void) AcpiNsCopyDeviceId (&Info->ClassCode,
507  Cls, NextIdString);
508  }
509 
510  /* Copy the fixed-length data */
511 
512  Info->InfoSize = InfoSize;
513  Info->Type = Type;
514  Info->Name = Name;
515  Info->ParamCount = ParamCount;
516  Info->Valid = Valid;
517 
518  *ReturnBuffer = Info;
519  Status = AE_OK;
520 
521 
522 Cleanup:
523  if (Hid)
524  {
525  ACPI_FREE (Hid);
526  }
527  if (Uid)
528  {
529  ACPI_FREE (Uid);
530  }
531  if (CidList)
532  {
533  ACPI_FREE (CidList);
534  }
535  if (Cls)
536  {
537  ACPI_FREE (Cls);
538  }
539  return (Status);
540 }
#define ACPI_VALID_HID
Definition: actypes.h:1305
#define ACPI_FREE(a)
Definition: actypes.h:386
#define ACPI_VALID_SXWS
Definition: actypes.h:1310
#define ACPI_ALLOCATE_ZEROED(a)
Definition: actypes.h:385
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
Type
Definition: Type.h:6
#define METHOD_NAME__ADR
Definition: acnames.h:49
#define AE_NO_MEMORY
Definition: acexcep.h:112
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
struct acpi_pnp_device_id_list ACPI_PNP_DEVICE_ID_LIST
ACPI_PNP_DEVICE_ID Ids[1]
Definition: actypes.h:1272
#define ACPI_VALID_SXDS
Definition: actypes.h:1309
ACPI_STATUS AcpiUtEvaluateNumericObject(const char *ObjectName, ACPI_NAMESPACE_NODE *DeviceNode, UINT64 *Value)
Definition: uteval.c:221
BOOLEAN AcpiUtIsPciRootBridge(char *Id)
Definition: utmisc.c:66
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct TraceInfo Info
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
ACPI_STATUS AcpiUtExecute_CLS(ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId)
Definition: utids.c:406
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
unsigned int UINT32
union node Node
Definition: types.h:1255
struct NameRec_ * Name
Definition: cdprocs.h:464
#define ACPI_NUM_SxW_METHODS
Definition: acconfig.h:232
smooth NULL
Definition: ftsmooth.c:416
#define ACPI_VALID_CID
Definition: actypes.h:1307
#define ACPI_NUM_SxD_METHODS
Definition: acconfig.h:231
UINT32 ACPI_OBJECT_TYPE
Definition: actypes.h:676
ACPI_STATUS AcpiUtExecutePowerMethods(ACPI_NAMESPACE_NODE *DeviceNode, const char **MethodNames, UINT8 MethodCount, UINT8 *OutValues)
Definition: uteval.c:332
static char * AcpiNsCopyDeviceId(ACPI_PNP_DEVICE_ID *Dest, ACPI_PNP_DEVICE_ID *Source, char *StringArea)
Definition: nsxfname.c:241
_In_ HANDLE Handle
Definition: extypes.h:390
#define ACPI_TYPE_METHOD
Definition: actypes.h:686
#define ACPI_VALID_CLS
Definition: actypes.h:1308
ACPI_STATUS AcpiUtExecute_HID(ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId)
Definition: utids.c:72
UINT32 ACPI_NAME
Definition: actypes.h:461
#define ACPI_TYPE_DEVICE
Definition: actypes.h:684
#define ACPI_VALID_ADR
Definition: actypes.h:1304
static const WCHAR Cleanup[]
Definition: register.c:80
#define ACPI_TYPE_PROCESSOR
Definition: actypes.h:690
Status
Definition: gdiplustypes.h:24
#define ACPI_PCI_ROOT_BRIDGE
Definition: actypes.h:1300
struct acpi_device_info ACPI_DEVICE_INFO
const char * AcpiGbl_HighestDstateNames[ACPI_NUM_SxD_METHODS]
Definition: utglobal.c:81
unsigned short UINT16
#define ACPI_VALID_UID
Definition: actypes.h:1306
ACPI_STATUS AcpiUtExecute_CID(ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID_LIST **ReturnCidList)
Definition: utids.c:253
ACPI_NAMESPACE_NODE * AcpiNsValidateHandle(ACPI_HANDLE Handle)
Definition: nsutils.c:655
ACPI_STATUS AcpiUtExecute_UID(ACPI_NAMESPACE_NODE *DeviceNode, ACPI_PNP_DEVICE_ID **ReturnId)
Definition: utids.c:160
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
unsigned char UINT8
#define AE_OK
Definition: acexcep.h:97
const char * AcpiGbl_LowestDstateNames[ACPI_NUM_SxW_METHODS]
Definition: utglobal.c:72
Definition: dlist.c:348

Referenced by acpi_bus_add().

◆ AcpiInstallMethod()

ACPI_STATUS AcpiInstallMethod ( UINT8 Buffer)

Definition at line 561 of file nsxfname.c.

563 {
565  UINT8 *AmlBuffer;
566  UINT8 *AmlStart;
567  char *Path;
569  ACPI_OPERAND_OBJECT *MethodObj;
570  ACPI_PARSE_STATE ParserState;
571  UINT32 AmlLength;
572  UINT16 Opcode;
573  UINT8 MethodFlags;
575 
576 
577  /* Parameter validation */
578 
579  if (!Buffer)
580  {
581  return (AE_BAD_PARAMETER);
582  }
583 
584  /* Table must be a DSDT or SSDT */
585 
586  if (!ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_DSDT) &&
588  {
589  return (AE_BAD_HEADER);
590  }
591 
592  /* First AML opcode in the table must be a control method */
593 
594  ParserState.Aml = Buffer + sizeof (ACPI_TABLE_HEADER);
595  Opcode = AcpiPsPeekOpcode (&ParserState);
596  if (Opcode != AML_METHOD_OP)
597  {
598  return (AE_BAD_PARAMETER);
599  }
600 
601  /* Extract method information from the raw AML */
602 
603  ParserState.Aml += AcpiPsGetOpcodeSize (Opcode);
604  ParserState.PkgEnd = AcpiPsGetNextPackageEnd (&ParserState);
605  Path = AcpiPsGetNextNamestring (&ParserState);
606 
607  MethodFlags = *ParserState.Aml++;
608  AmlStart = ParserState.Aml;
609  AmlLength = ACPI_PTR_DIFF (ParserState.PkgEnd, AmlStart);
610 
611  /*
612  * Allocate resources up-front. We don't want to have to delete a new
613  * node from the namespace if we cannot allocate memory.
614  */
615  AmlBuffer = ACPI_ALLOCATE (AmlLength);
616  if (!AmlBuffer)
617  {
618  return (AE_NO_MEMORY);
619  }
620 
622  if (!MethodObj)
623  {
624  ACPI_FREE (AmlBuffer);
625  return (AE_NO_MEMORY);
626  }
627 
628  /* Lock namespace for AcpiNsLookup, we may be creating a new node */
629 
631  if (ACPI_FAILURE (Status))
632  {
633  goto ErrorExit;
634  }
635 
636  /* The lookup either returns an existing node or creates a new one */
637 
640 
642 
643  if (ACPI_FAILURE (Status)) /* NsLookup */
644  {
645  if (Status != AE_ALREADY_EXISTS)
646  {
647  goto ErrorExit;
648  }
649 
650  /* Node existed previously, make sure it is a method node */
651 
652  if (Node->Type != ACPI_TYPE_METHOD)
653  {
654  Status = AE_TYPE;
655  goto ErrorExit;
656  }
657  }
658 
659  /* Copy the method AML to the local buffer */
660 
661  memcpy (AmlBuffer, AmlStart, AmlLength);
662 
663  /* Initialize the method object with the new method's information */
664 
665  MethodObj->Method.AmlStart = AmlBuffer;
666  MethodObj->Method.AmlLength = AmlLength;
667 
668  MethodObj->Method.ParamCount = (UINT8)
669  (MethodFlags & AML_METHOD_ARG_COUNT);
670 
671  if (MethodFlags & AML_METHOD_SERIALIZED)
672  {
674 
675  MethodObj->Method.SyncLevel = (UINT8)
676  ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4);
677  }
678 
679  /*
680  * Now that it is complete, we can attach the new method object to
681  * the method Node (detaches/deletes any existing object)
682  */
684 
685  /*
686  * Flag indicates AML buffer is dynamic, must be deleted later.
687  * Must be set only after attach above.
688  */
689  Node->Flags |= ANOBJ_ALLOCATED_BUFFER;
690 
691  /* Remove local reference to the method object */
692 
693  AcpiUtRemoveReference (MethodObj);
694  return (Status);
695 
696 
697 ErrorExit:
698 
699  ACPI_FREE (AmlBuffer);
700  ACPI_FREE (MethodObj);
701  return (Status);
702 }
#define ACPI_FREE(a)
Definition: actypes.h:386
UINT8 * AmlStart
Definition: acobject.h:220
ASMGENDATA Table[]
Definition: genincdata.c:61
UINT8 * PkgEnd
Definition: aclocal.h:1105
_In_ PVOID _In_ ULONG Opcode
Definition: hubbusif.h:330
ACPI_STATUS AcpiNsLookup(ACPI_GENERIC_STATE *ScopeInfo, char *Name, ACPI_OBJECT_TYPE Type, ACPI_INTERPRETER_MODE InterpreterMode, UINT32 Flags, ACPI_WALK_STATE *WalkState, ACPI_NAMESPACE_NODE **RetNode)
Definition: nsaccess.c:329
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define AE_NO_MEMORY
Definition: acexcep.h:112
#define ACPI_METHOD_SERIALIZED
Definition: acobject.h:237
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
ACPI_OBJECT_COMMON_HEADER UINT8 InfoFlags
Definition: acobject.h:215
#define ACPI_PTR_DIFF(a, b)
Definition: actypes.h:548
#define ACPI_NS_ERROR_IF_FOUND
Definition: acnamesp.h:66
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct acpi_table_header ACPI_TABLE_HEADER
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
char * AcpiPsGetNextNamestring(ACPI_PARSE_STATE *ParserState)
Definition: psargs.c:172
#define ACPI_ALLOCATE(a)
Definition: actypes.h:384
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
#define AML_METHOD_SERIALIZED
Definition: amlcode.h:506
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
unsigned int UINT32
union node Node
Definition: types.h:1255
#define ACPI_NS_DONT_OPEN_SCOPE
Definition: acnamesp.h:64
smooth NULL
Definition: ftsmooth.c:416
#define AML_METHOD_ARG_COUNT
Definition: amlcode.h:505
Definition: bufpool.h:45
UINT16 AcpiPsPeekOpcode(ACPI_PARSE_STATE *state)
Definition: psparse.c:108
#define ACPI_SIG_DSDT
Definition: actbl.h:67
#define AML_METHOD_SYNC_LEVEL
Definition: amlcode.h:507
#define ACPI_TYPE_METHOD
Definition: actypes.h:686
#define AE_ALREADY_EXISTS
Definition: acexcep.h:115
UINT8 * AcpiPsGetNextPackageEnd(ACPI_PARSE_STATE *ParserState)
Definition: psargs.c:138
#define ACPI_COMPARE_NAMESEG(a, b)
Definition: actypes.h:561
#define ACPI_SIG_SSDT
Definition: actbl.h:75
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define AML_METHOD_OP
Definition: amlcode.h:64
#define AE_TYPE
Definition: acexcep.h:116
Status
Definition: gdiplustypes.h:24
ACPI_OBJECT_METHOD Method
Definition: acobject.h:522
#define AE_BAD_HEADER
Definition: acexcep.h:168
ACPI_STATUS AcpiNsAttachObject(ACPI_NAMESPACE_NODE *Node, ACPI_OPERAND_OBJECT *Object, ACPI_OBJECT_TYPE Type)
Definition: nsobject.c:76
PRTL_UNICODE_STRING_BUFFER Path
static VOID ErrorExit(LPTSTR lpszMessage)
Definition: telnetd.c:647
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:784
unsigned short UINT16
#define AcpiUtCreateInternalObject(t)
Definition: acutils.h:655
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85
#define ANOBJ_ALLOCATED_BUFFER
Definition: aclocal.h:221
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
unsigned char UINT8
UINT32 AcpiPsGetOpcodeSize(UINT32 Opcode)
Definition: psparse.c:78
Definition: dlist.c:348

◆ AcpiNsCopyDeviceId()

static char * AcpiNsCopyDeviceId ( ACPI_PNP_DEVICE_ID Dest,
ACPI_PNP_DEVICE_ID Source,
char StringArea 
)
static

Definition at line 241 of file nsxfname.c.

245 {
246  /* Create the destination PNP_DEVICE_ID */
247 
248  Dest->String = StringArea;
249  Dest->Length = Source->Length;
250 
251  /* Copy actual string and return a pointer to the next string area */
252 
253  memcpy (StringArea, Source->String, Source->Length);
254  return (StringArea + Source->Length);
255 }
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167

Referenced by AcpiGetObjectInfo().