Source code of Windows XP (NT5)
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.

835 lines
15 KiB

  1. /*++
  2. Copyright (c) 1991-1998 Microsoft Corporation
  3. Module Name:
  4. amlitest
  5. Abstract:
  6. Environment:
  7. kernel mode only
  8. Notes:
  9. --*/
  10. /*
  11. #include "wdm.h"
  12. #include "stdarg.h"
  13. #include "stdio.h" */
  14. #include "pch.h"
  15. //#include "amlihook.h"
  16. //#include "amlitest.h"
  17. #define AMLIHOOK_DEBUG_ASYNC_AMLI ((ULONG)0x1)
  18. #ifdef DBG
  19. ULONG AmliTestDebugFlags=0x00;
  20. #define AmliTest_DebugPrint(x) AmliTestDebugPrintFunc x
  21. CHAR AmliTestDebugBuffer[200];
  22. //
  23. // Internal functions.
  24. //
  25. VOID
  26. AmliTestDebugPrintFunc(
  27. ULONG DebugPrintLevel,
  28. PCCHAR DebugMessage,
  29. ...)
  30. {
  31. va_list ap;
  32. va_start(ap, DebugMessage);
  33. if(DebugPrintLevel & AmliTestDebugFlags)
  34. {
  35. if(_vsnprintf(AmliTestDebugBuffer,
  36. 200,
  37. DebugMessage,
  38. ap) == -1)
  39. {
  40. AmliTestDebugBuffer[199] = '\0';
  41. }
  42. DbgPrint(AmliTestDebugBuffer);
  43. }
  44. }
  45. #endif
  46. //
  47. // AMLITest_Post_Generic
  48. //
  49. NTSTATUS
  50. AMLITest_Post_Generic(
  51. PAMLIHOOK_DATA * ppData,
  52. NTSTATUS _Status)
  53. {
  54. //
  55. //--- Notify test driver off call status
  56. //
  57. NTSTATUS Status =
  58. AmliHook_TestNotifyRet(
  59. *ppData,
  60. _Status);
  61. ExFreePool(*ppData);
  62. *ppData = NULL;
  63. return(Status);
  64. }
  65. //
  66. // Exported functions.
  67. //
  68. //
  69. // Pre/Post GetNameSpaceObject
  70. //
  71. NTSTATUS
  72. AMLITest_Pre_GetNameSpaceObject(
  73. IN PSZ pszObjPath,
  74. IN PNSOBJ pnsScope,
  75. OUT PPNSOBJ ppns,
  76. IN ULONG dwfFlags,
  77. PAMLIHOOK_DATA * ppData)
  78. {
  79. //
  80. // Alocate and init AMLIHOOK_DATA
  81. //
  82. *ppData =
  83. AmliHook_AllocAndInitTestData();
  84. if(!(*ppData))
  85. {
  86. AmliHook_ProcessInternalError();
  87. return(STATUS_INSUFFICIENT_RESOURCES);
  88. }
  89. //
  90. //--- Notify test driver off call
  91. //
  92. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  93. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_GET_NAME_SPACE_OBJECT;
  94. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  95. (*ppData)->Arg1 = (ULONG_PTR)pszObjPath;
  96. (*ppData)->Arg2 = (ULONG_PTR)pnsScope;
  97. (*ppData)->Arg3 = (ULONG_PTR)ppns;
  98. (*ppData)->Arg4 = (ULONG_PTR)dwfFlags;
  99. return(AmliHook_TestNotify(*ppData));
  100. }
  101. NTSTATUS
  102. AMLITest_Post_GetNameSpaceObject(
  103. PAMLIHOOK_DATA * ppData,
  104. NTSTATUS Status)
  105. {
  106. return(AMLITest_Post_Generic(ppData,Status));
  107. }
  108. //
  109. // Pre/Post GetFieldUnitRegionObj
  110. //
  111. NTSTATUS
  112. AMLITest_Pre_GetFieldUnitRegionObj(
  113. IN PFIELDUNITOBJ pfu,
  114. OUT PPNSOBJ ppns,
  115. PAMLIHOOK_DATA * ppData)
  116. {
  117. //
  118. // Allocate and init AMLIHOOK_DATA
  119. //
  120. *ppData =
  121. AmliHook_AllocAndInitTestData();
  122. if(!(*ppData))
  123. return(STATUS_INSUFFICIENT_RESOURCES);
  124. //
  125. //--- Notify test driver off call
  126. //
  127. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  128. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_GET_FIELD_UNIT_REGION_OP;
  129. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  130. (*ppData)->Arg1 = (ULONG_PTR)pfu;
  131. (*ppData)->Arg2 = (ULONG_PTR)ppns;
  132. return(AmliHook_TestNotify(*ppData));
  133. }
  134. NTSTATUS
  135. AMLITest_Post_GetFieldUnitRegionObj(
  136. PAMLIHOOK_DATA * ppData,
  137. NTSTATUS _Status)
  138. {
  139. return(AMLITest_Post_Generic(ppData,_Status));
  140. }
  141. //
  142. // Pre/Post EvalNameSpaceObject
  143. //
  144. NTSTATUS
  145. AMLITest_Pre_EvalNameSpaceObject(
  146. IN PNSOBJ pns,
  147. OUT POBJDATA pdataResult,
  148. IN int icArgs,
  149. IN POBJDATA pdataArgs,
  150. PAMLIHOOK_DATA * ppData)
  151. {
  152. //
  153. // Alocate and init AMLIHOOK_DATA
  154. //
  155. *ppData =
  156. AmliHook_AllocAndInitTestData();
  157. if(!(*ppData))
  158. return(STATUS_INSUFFICIENT_RESOURCES);
  159. //
  160. //--- Notify test driver off call
  161. //
  162. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  163. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_EVAL_NAME_SPACE_OBJECT;
  164. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  165. (*ppData)->Arg1 = (ULONG_PTR)pns;
  166. (*ppData)->Arg2 = (ULONG_PTR)pdataResult;
  167. (*ppData)->Arg3 = (ULONG_PTR)icArgs;
  168. (*ppData)->Arg4 = (ULONG_PTR)pdataArgs;
  169. return(AmliHook_TestNotify(*ppData));
  170. }
  171. NTSTATUS
  172. AMLITest_Post_EvalNameSpaceObject(
  173. PAMLIHOOK_DATA * Data,
  174. NTSTATUS _Status)
  175. {
  176. return(AMLITest_Post_Generic(Data,_Status));
  177. }
  178. //
  179. // CallBack Pre/Post AsyncEvalObject
  180. //
  181. VOID EXPORT
  182. AMLITest_AsyncEvalObjectCallBack(
  183. IN PNSOBJ pns,
  184. IN NTSTATUS status,
  185. IN POBJDATA pdataResult,
  186. IN PVOID Context)
  187. {
  188. PAMLIHOOK_DATA pData = (PAMLIHOOK_DATA)Context;
  189. NTSTATUS RetStatus ;
  190. PFNACB AcpiAsyncCallBack;
  191. PVOID AcpiContext;
  192. AcpiAsyncCallBack = (PFNACB)pData->Arg5;
  193. AcpiContext = (PVOID)pData->Arg6;
  194. if( (VOID*)(pData->Arg2) != (VOID*)pdataResult)
  195. AmliHook_ProcessInternalError();
  196. //
  197. //--- Notify test driver off call status
  198. //
  199. RetStatus = AmliHook_TestNotifyRet(
  200. pData,
  201. status);
  202. AmliTest_DebugPrint((
  203. AMLIHOOK_DEBUG_ASYNC_AMLI,
  204. "DEBUG: AMLITest_AsyncEvalObjectCallBack Data=%lx\n",
  205. pData));
  206. ExFreePool(pData);
  207. if(AcpiAsyncCallBack)
  208. {
  209. AcpiAsyncCallBack(
  210. pns,
  211. RetStatus,
  212. pdataResult,
  213. AcpiContext);
  214. }
  215. }
  216. NTSTATUS
  217. AMLITest_Pre_AsyncEvalObject(
  218. IN PNSOBJ pns,
  219. OUT POBJDATA pdataResult,
  220. IN int icArgs,
  221. IN POBJDATA pdataArgs,
  222. IN PFNACB * pfnAsyncCallBack,
  223. IN PVOID * pvContext,
  224. PAMLIHOOK_DATA * Data)
  225. {
  226. //
  227. // Alocate and init AMLIHOOK_DATA
  228. //
  229. *Data =
  230. AmliHook_AllocAndInitTestData();
  231. if(!Data)
  232. return(STATUS_INSUFFICIENT_RESOURCES);
  233. //
  234. //--- Notify test driver off call
  235. //
  236. (*Data)->Type = ACPIVER_DATA_TYPE_AMLI;
  237. (*Data)->SubType = ACPIVER_DATA_SUBTYPE_ASYNC_EVAL_OBJECT;
  238. (*Data)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  239. (*Data)->Arg1 = (ULONG_PTR)pns;
  240. (*Data)->Arg2 = (ULONG_PTR)pdataResult;
  241. (*Data)->Arg3 = (ULONG_PTR)icArgs;
  242. (*Data)->Arg4 = (ULONG_PTR)pdataArgs;
  243. (*Data)->Arg5 = (ULONG_PTR)*pfnAsyncCallBack;
  244. (*Data)->Arg6 = (ULONG_PTR)*pvContext;
  245. //
  246. // Hook my callback function , and conext.
  247. //
  248. *pfnAsyncCallBack = AMLITest_AsyncEvalObjectCallBack;
  249. *pvContext = *Data;
  250. return(AmliHook_TestNotify(*Data));
  251. }
  252. NTSTATUS
  253. AMLITest_Post_AsyncEvalObject(
  254. PAMLIHOOK_DATA * ppData,
  255. NTSTATUS Status)
  256. {
  257. AmliTest_DebugPrint((
  258. AMLIHOOK_DEBUG_ASYNC_AMLI,
  259. "DEBUG: AMLITest_Post_AsyncEvalObject Data=%lx Pending=%s\n",
  260. *ppData,
  261. (Status == STATUS_PENDING)? "TRUE" : "FALSE"));
  262. if(Status == STATUS_PENDING)
  263. return(Status);
  264. //
  265. //--- Call back will not be called.
  266. //
  267. return(AMLITest_Post_Generic(ppData,Status));
  268. }
  269. //
  270. // Pre/Post NestAsyncEvalObject
  271. //
  272. NTSTATUS
  273. AMLITest_Pre_NestAsyncEvalObject(
  274. PNSOBJ pns,
  275. POBJDATA pdataResult,
  276. int icArgs,
  277. POBJDATA pdataArgs,
  278. PFNACB * pfnAsyncCallBack,
  279. PVOID * pvContext,
  280. PAMLIHOOK_DATA * ppData)
  281. {
  282. //
  283. // Alocate and init AMLIHOOK_DATA
  284. //
  285. *ppData =
  286. AmliHook_AllocAndInitTestData();
  287. if(!(*ppData))
  288. return(STATUS_INSUFFICIENT_RESOURCES);
  289. //
  290. //--- Notify test driver off call
  291. //
  292. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  293. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_NEST_ASYNC_EVAL_OBJECT;
  294. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  295. (*ppData)->Arg1 = (ULONG_PTR)pns;
  296. (*ppData)->Arg2 = (ULONG_PTR)pdataResult;
  297. (*ppData)->Arg3 = (ULONG_PTR)icArgs;
  298. (*ppData)->Arg4 = (ULONG_PTR)pdataArgs;
  299. (*ppData)->Arg5 = (ULONG_PTR)pfnAsyncCallBack;
  300. (*ppData)->Arg6 = (ULONG_PTR)pvContext;
  301. //
  302. // Hook my callback function , and conext.
  303. //
  304. *pfnAsyncCallBack = AMLITest_AsyncEvalObjectCallBack;
  305. *pvContext = *ppData;
  306. return(AmliHook_TestNotify(*ppData));
  307. }
  308. NTSTATUS
  309. AMLITest_Post_NestAsyncEvalObject(
  310. PAMLIHOOK_DATA * ppData,
  311. NTSTATUS Status)
  312. {
  313. if(Status == STATUS_PENDING)
  314. return(Status);
  315. //
  316. //--- Work is done.
  317. //--- AMLITest_AsyncEvalObjectCallBack will not be called.
  318. //
  319. return(AMLITest_Post_Generic(ppData,Status));
  320. }
  321. //
  322. // Pre/Post EvalPackageElement
  323. //
  324. NTSTATUS
  325. AMLITest_Pre_EvalPackageElement(
  326. PNSOBJ pns,
  327. int iPkgIndex,
  328. POBJDATA pdataResult,
  329. PAMLIHOOK_DATA * ppData)
  330. {
  331. //
  332. // Alocate and init AMLIHOOK_DATA
  333. //
  334. *ppData =
  335. AmliHook_AllocAndInitTestData();
  336. if(!(*ppData))
  337. return(STATUS_INSUFFICIENT_RESOURCES);
  338. //
  339. //--- Notify test driver off call
  340. //
  341. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  342. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_EVAL_PACKAGE_ELEMENT;
  343. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  344. (*ppData)->Arg1 = (ULONG_PTR)pns;
  345. (*ppData)->Arg2 = (ULONG_PTR)iPkgIndex;
  346. (*ppData)->Arg3 = (ULONG_PTR)pdataResult;
  347. return(AmliHook_TestNotify(*ppData));
  348. }
  349. NTSTATUS
  350. AMLITest_Post_EvalPackageElement(
  351. PAMLIHOOK_DATA * Data,
  352. NTSTATUS Status)
  353. {
  354. return(AMLITest_Post_Generic(Data,Status));
  355. }
  356. //
  357. // Pre/Post EvalPkgDataElement
  358. //
  359. NTSTATUS
  360. AMLITest_Pre_EvalPkgDataElement(
  361. POBJDATA pdataPkg,
  362. int iPkgIndex,
  363. POBJDATA pdataResult,
  364. PAMLIHOOK_DATA * ppData)
  365. {
  366. //
  367. // Alocate and init AMLIHOOK_DATA
  368. //
  369. *ppData =
  370. AmliHook_AllocAndInitTestData();
  371. if(!(*ppData))
  372. return(STATUS_INSUFFICIENT_RESOURCES);
  373. //
  374. //--- Notify test driver off call
  375. //
  376. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  377. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_EVAL_PKG_DATA_ELEMENT;
  378. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  379. (*ppData)->Arg1 = (ULONG_PTR)pdataPkg;
  380. (*ppData)->Arg2 = (ULONG_PTR)iPkgIndex;
  381. (*ppData)->Arg3 = (ULONG_PTR)pdataResult;
  382. return(AmliHook_TestNotify(*ppData));
  383. }
  384. NTSTATUS
  385. AMLITest_Post_EvalPkgDataElement(
  386. PAMLIHOOK_DATA * ppData,
  387. NTSTATUS Status)
  388. {
  389. return(AMLITest_Post_Generic(ppData,Status));
  390. }
  391. //
  392. // Pre/Post FreeDataBuffs
  393. //
  394. NTSTATUS
  395. AMLITest_Pre_FreeDataBuffs(
  396. POBJDATA pdata,
  397. int icData,
  398. PAMLIHOOK_DATA * ppData)
  399. {
  400. //
  401. // Alocate and init AMLIHOOK_DATA
  402. //
  403. *ppData =
  404. AmliHook_AllocAndInitTestData();
  405. if(!(*ppData))
  406. return(STATUS_INSUFFICIENT_RESOURCES);
  407. //
  408. //--- Notify test driver off call
  409. //
  410. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  411. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_FREE_DATA_BUFFS;
  412. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  413. (*ppData)->Arg1 = (ULONG_PTR)pdata;
  414. (*ppData)->Arg2 = (ULONG_PTR)icData;
  415. return(AmliHook_TestNotify(*ppData));
  416. }
  417. NTSTATUS
  418. AMLITest_Post_FreeDataBuffs(
  419. PAMLIHOOK_DATA * ppData,
  420. NTSTATUS Status)
  421. {
  422. return(AMLITest_Post_Generic(ppData,Status));
  423. }
  424. //
  425. // Pre/Post RegEventHandler.
  426. //
  427. NTSTATUS
  428. AMLIHook_Pre_RegEventHandler(
  429. ULONG dwEventType,
  430. ULONG_PTR uipEventData,
  431. PFNHND * pfnHandler,
  432. ULONG_PTR * uipParam,
  433. PAMLIHOOK_DATA * ppData)
  434. {
  435. NTSTATUS Status;
  436. PFNHND EventHandler;
  437. ULONG_PTR EventParam;
  438. //
  439. // Alocate and init AMLIHOOK_DATA
  440. //
  441. *ppData =
  442. AmliHook_AllocAndInitTestData();
  443. if(!(*ppData))
  444. return(STATUS_INSUFFICIENT_RESOURCES);
  445. //
  446. //--- Querry the test driver for Event handler to
  447. //--- register.
  448. //
  449. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  450. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_REG_EVENT_HANDLER;
  451. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_QUERY;
  452. (*ppData)->Arg1 = (ULONG_PTR)dwEventType;
  453. (*ppData)->Arg2 = (ULONG_PTR)uipEventData;
  454. (*ppData)->Arg3 = (ULONG_PTR)*pfnHandler;
  455. (*ppData)->Arg4 = (ULONG_PTR)*uipParam;
  456. AmliHook_TestNotify(*ppData);
  457. if((*ppData)->Ret != STATUS_SUCCESS)
  458. DbgBreakPoint();
  459. EventHandler = (PFNHND)(*ppData)->Arg3;
  460. EventParam = (ULONG_PTR)(*ppData)->Arg4;
  461. if(EventHandler != *pfnHandler)
  462. {
  463. //
  464. // Test driver will hook this call
  465. // I will need values for both
  466. // params.
  467. //
  468. if(!EventHandler)
  469. AmliHook_ProcessInternalError();
  470. if(!EventParam)
  471. AmliHook_ProcessInternalError();
  472. *pfnHandler = EventHandler;
  473. *uipParam = EventParam;
  474. }
  475. //
  476. //--- Notify test driver off call
  477. //
  478. AmliHook_InitTestData(*ppData);
  479. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  480. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_REG_EVENT_HANDLER;
  481. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  482. (*ppData)->Arg1 = (ULONG_PTR)dwEventType;
  483. (*ppData)->Arg2 = (ULONG_PTR)uipEventData;
  484. return(AmliHook_TestNotify(*ppData));
  485. }
  486. NTSTATUS
  487. AMLIHook_Post_RegEventHandler(
  488. PAMLIHOOK_DATA * ppData,
  489. NTSTATUS Status)
  490. {
  491. return(AMLITest_Post_Generic(ppData,Status));
  492. }
  493. //
  494. // CallBack , Pre/Post PauseInterpreter
  495. //
  496. VOID EXPORT
  497. AMLITest_PauseInterpreterCallBack(
  498. PVOID Context)
  499. {
  500. NTSTATUS Status;
  501. PFNAA AcpiCallBack=NULL;
  502. PVOID AcpiContext=NULL;
  503. PAMLIHOOK_DATA Data = (PAMLIHOOK_DATA)Context;
  504. //
  505. //--- Notify test driver off call status
  506. //
  507. Status = AmliHook_TestNotifyRet(
  508. Data,
  509. STATUS_SUCCESS);
  510. AcpiCallBack = (PFNAA)Data->Arg1;
  511. AcpiContext = (PVOID)Data->Arg2;
  512. ExFreePool(Data);
  513. if(AcpiCallBack)
  514. {
  515. AcpiCallBack(AcpiContext);
  516. }
  517. }
  518. NTSTATUS
  519. AMLITest_Pre_PauseInterpreter(
  520. PFNAA * pfnCallBack,
  521. PVOID * Context,
  522. PAMLIHOOK_DATA * ppData)
  523. {
  524. //
  525. // Alocate and init AMLIHOOK_DATA
  526. //
  527. *ppData =
  528. AmliHook_AllocAndInitTestData();
  529. if(!(*ppData))
  530. return(STATUS_INSUFFICIENT_RESOURCES);
  531. //
  532. //--- Notify test driver off call
  533. //
  534. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  535. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_PAUSE_INTERPRETER;
  536. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  537. (*ppData)->Arg1 = (ULONG_PTR)*pfnCallBack;
  538. (*ppData)->Arg2 = (ULONG_PTR)*Context;
  539. //
  540. // Hook my Callback context
  541. //
  542. *pfnCallBack = AMLITest_PauseInterpreterCallBack;
  543. *Context = *ppData;
  544. return(AmliHook_TestNotify(*ppData));
  545. }
  546. NTSTATUS
  547. AMLITest_Post_PauseInterpreter(
  548. PAMLIHOOK_DATA * ppData,
  549. NTSTATUS Status)
  550. {
  551. if(Status == STATUS_PENDING)
  552. return(Status);
  553. //
  554. //--- Call back will not be called.
  555. //
  556. Status = AmliHook_TestNotifyRet(
  557. *ppData,
  558. Status);
  559. ExFreePool(*ppData);
  560. *ppData = NULL;
  561. return(Status);
  562. }
  563. //
  564. // Pre/Post ResumeInterpreter
  565. //
  566. NTSTATUS
  567. AMLITest_Pre_ResumeInterpreter(
  568. PAMLIHOOK_DATA * ppData)
  569. {
  570. //
  571. // Alocate and init AMLIHOOK_DATA
  572. //
  573. *ppData =
  574. AmliHook_AllocAndInitTestData();
  575. if(!(*ppData))
  576. return(STATUS_INSUFFICIENT_RESOURCES);
  577. //
  578. //--- Notify test driver off call
  579. //
  580. (*ppData)->Type = ACPIVER_DATA_TYPE_AMLI;
  581. (*ppData)->SubType = ACPIVER_DATA_SUBTYPE_RESUME_INTERPRETER;
  582. (*ppData)->State = AMLIHOOK_TEST_DATA_STATE_CALL;
  583. return(AmliHook_TestNotify(*ppData));
  584. }
  585. NTSTATUS
  586. AMLITest_Post_ResumeInterpreter(
  587. PAMLIHOOK_DATA * ppData,
  588. NTSTATUS Status)
  589. {
  590. return(AMLITest_Post_Generic(ppData,Status));
  591. }