Guest User

Untitled

a guest
Mar 22nd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. # EFI_TCP4_SERVICE_BINDING_PROTOCOLとEFI_TCP4_PROTOCOLに関するメモ
  2.  
  3. ## 結論
  4.  
  5. EFI_TCP4_PROTOCOLはEFI_TCP4_SERVICE_BINDING_PROTOCOLのCreateChildで作ったEFI_HANDLEから呼び出す。
  6.  
  7. ## メモ
  8.  
  9. Env: gnu-efi-3.0.6
  10.  
  11. EFI_TCP4_PROTOCOLのGUIDからLocateHandleBufferでハンドラを探し、そのハンドラからプロトコルを呼び出して使うという方法でEFI_TCP4_PROTOCOLの関数(GetModeDataなど)を使うと、EFI_NOT_STARTED(19)が帰ってくる。
  12.  
  13. EFI_TCP4_SERVICE_BINDING_PROTOCOLはLocateHandleBufferで呼び出す。
  14. コード例は以下。
  15.  
  16. ```c
  17. EFI_STATUS
  18. find_tcp4_service_binding_handlers (
  19. EFI_HANDLE **handlers,
  20. UINTN *nohandlers
  21. )
  22. {
  23. EFI_STATUS efi_status;
  24. // load handler
  25. EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
  26. efi_status = uefi_call_wrapper(
  27. BS->LocateHandleBuffer,
  28. 5,
  29. ByProtocol,
  30. &tcp4_service_binding_protocol_guid,
  31. NULL, /* SearchKey is ignored */
  32. (UINTN *)nohandlers,
  33. (EFI_HANDLE **)handlers
  34. );
  35. return efi_status;
  36. }
  37. ```
  38.  
  39. EFI_TCP4_SERVICE_BINDING_PROTOCOLのハンドラを取得したら、プロトコルを取得する。
  40. プロトコルの型はEFI_SERVICE_BINDING、定義は `inc/efiprot.h ` にある。
  41.  
  42. ```c
  43. EFI_STATUS
  44. load_tcp4_service_binding_protocol(
  45. EFI_SERVICE_BINDING **protocol,
  46. EFI_HANDLE *handlers,
  47. UINTN port
  48. )
  49. {
  50. EFI_STATUS efi_status;
  51. EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
  52. efi_status = uefi_call_wrapper(
  53. BS->HandleProtocol,
  54. 3,
  55. handlers[port],
  56. &tcp4_service_binding_protocol_guid,
  57. (VOID **)protocol
  58. );
  59. return efi_status;
  60. }
  61. ```
  62.  
  63. CreateChild関数の定義も `inc/efiprot.h ` にある。EFI_TCP4_PROTOCOLのハンドラを作るコード例は以下。
  64.  
  65. ```c
  66. EFI_SERVICE_BINDING *tcp4_service_binding_protocol;
  67.  
  68. /* tcp4_service_binding_protocolを取得 */
  69.  
  70. EFI_HANDLE tcp4_handlers;
  71. efi_status = uefi_call_wrapper(
  72. tcp4_service_binding_protocol->CreateChild,
  73. 2,
  74. tcp4_service_binding_protocol,
  75. &tcp4_handlers
  76. );
  77. ```
  78.  
  79. 以上。
Add Comment
Please, Sign In to add comment