cmdline.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "lib.h"
  2. #ifndef MAX_ARGV_CONTENTS_SIZE
  3. # define MAX_CMDLINE_SIZE 1024
  4. #endif
  5. #ifndef MAX_ARGC
  6. # define MAX_CMDLINE_ARGC 32
  7. #endif
  8. INTN
  9. GetShellArgcArgv(
  10. EFI_HANDLE ImageHandle,
  11. CHAR16 **ResultArgv[]
  12. )
  13. {
  14. EFI_STATUS Status;
  15. EFI_LOADED_IMAGE *LoadedImage = NULL;
  16. static CHAR16 ArgvContents[MAX_CMDLINE_SIZE];
  17. static CHAR16 *Argv[MAX_CMDLINE_ARGC], *ArgStart, *c;
  18. UINTN Argc = 0, BufLen;
  19. Status = uefi_call_wrapper(BS->OpenProtocol, 6,
  20. ImageHandle,
  21. &LoadedImageProtocol,
  22. &LoadedImage,
  23. ImageHandle,
  24. NULL,
  25. EFI_OPEN_PROTOCOL_GET_PROTOCOL
  26. );
  27. if (EFI_ERROR(Status))
  28. return -1;
  29. BufLen = LoadedImage->LoadOptionsSize;
  30. if (BufLen < 2) /* We are expecting at least a \0 */
  31. return -1;
  32. else if (BufLen > sizeof(ArgvContents))
  33. BufLen = sizeof(ArgvContents);
  34. CopyMem(ArgvContents, LoadedImage->LoadOptions, BufLen);
  35. ArgvContents[MAX_CMDLINE_SIZE - 1] = L'\0';
  36. for (c = ArgStart = ArgvContents ; *c != L'\0' ; ++c) {
  37. if (*c == L' ') {
  38. *c = L'\0';
  39. if (Argc < MAX_CMDLINE_ARGC) Argv[Argc++] = ArgStart;
  40. ArgStart = c + 1;
  41. }
  42. }
  43. if ((*ArgStart != L'\0') && (Argc < MAX_CMDLINE_ARGC))
  44. Argv[Argc++] = ArgStart;
  45. *ResultArgv = Argv;
  46. return Argc;
  47. }