bool DoWriteToFlashBlocks(CMD_TBL *cptr, int argc, char **argv) { long dest=0, src=0, len, wsize; switch (argc){ case 2 : if (!StrCmp(argv[1], "kernel")){ dest = (long)KERNEL_SRAM_BASE; src = (long)KERNEL_DRAM_BASE; len = (long)KERNEL_MAX_SIZE; printf("Saving kernel to flash...\n"); } else if (!StrCmp(argv[1], "root")){ dest = (long)ROOT_SRAM_BASE; src = (long)ROOT_DRAM_BASE; len = (long)ROOT_MAX_SIZE; printf("Saving root to flash...\n"); } else if (!StrCmp(argv[1], "loader")){ dest = (long)LOADER_SRAM_BASE; src = (long)LOADER_DRAM_BASE; len = (long)LOADER_MAX_SIZE; printf("Saving bootloader to flash...\n"); } else { printf(cptr->usage); return false; } break; // "flash [dest] [src] [len]". case 4 : if (!HexToInt(argv[1], &dest, 32) || !HexToInt(argv[2], &src, 32) || !HexToInt(argv[3], &len, 32)){ printf(cptr->usage); return false; } if (dest % FLASH_BLOCK_SIZE){ printf("dest is not Flash Block Base.\n"); return false; } break; default : printf(cptr->usage); return false; break; } // erase flash blocks. printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", dest, (long)dest+len-1); if (!EraseFlashBlocks((FUNIT *)dest, len)) return false; printf("\tDone.\n"); // write to flash. printf("Write to flash...\n"); wsize = FLASH_BLOCK_SIZE; do{ printf("\tWriting at 0x%08lx...", (ulong)dest); if (!WriteToFlashBuffer((FUNIT *)dest, (FUNIT *)src)) break; dest += FLASH_BLOCK_SIZE; src += FLASH_BLOCK_SIZE; ClearLine(); } while((len -= FLASH_BLOCK_SIZE) >0); printf("\tWriting at 0x%08lx\r\n", (ulong)dest); printf("\tDone\n"); IT(dest) = FlashCMD(READ_ARRAY); return true; } // DoWriteToFlashBlocks.
/** Worker function that asks for a boot option to be selected and returns a pointer to the structure describing the selected boot option. @param[in] BootOptionsList List of the boot options @retval EFI_SUCCESS Selection succeeded @retval !EFI_SUCCESS Input error or input cancelled **/ STATIC EFI_STATUS SelectBootOption ( IN LIST_ENTRY* BootOptionsList, IN CONST CHAR16* InputStatement, OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry ) { EFI_STATUS Status; UINTN BootOptionCount; UINT16 *BootOrder; LIST_ENTRY* Entry; UINTN BootOptionSelected; UINTN Index; // Get the number of boot options Status = GetGlobalEnvironmentVariable ( L"BootOrder", NULL, &BootOptionCount, (VOID**)&BootOrder ); if (EFI_ERROR (Status)) { goto ErrorExit; } FreePool (BootOrder); BootOptionCount /= sizeof (UINT16); // Check if a valid boot option(s) is found if (BootOptionCount == 0) { if (StrCmp (InputStatement, DELETE_BOOT_ENTRY) == 0) { Print (L"Nothing to remove!\n"); } else if (StrCmp (InputStatement, UPDATE_BOOT_ENTRY) == 0) { Print (L"Nothing to update!\n"); } else if (StrCmp (InputStatement, MOVE_BOOT_ENTRY) == 0) { Print (L"Nothing to move!\n"); } else { Print (L"No supported Boot Entry.\n"); } return EFI_NOT_FOUND; } // Get the index of the boot device to delete BootOptionSelected = 0; while (BootOptionSelected == 0) { Print (InputStatement); Status = GetHIInputInteger (&BootOptionSelected); if (EFI_ERROR (Status)) { Print (L"\n"); goto ErrorExit; } else if ((BootOptionSelected == 0) || (BootOptionSelected > BootOptionCount)) { Print (L"Invalid input (max %d)\n", BootOptionCount); BootOptionSelected = 0; } } // Get the structure of the Boot device to delete Index = 1; for (Entry = GetFirstNode (BootOptionsList); !IsNull (BootOptionsList, Entry); Entry = GetNextNode (BootOptionsList,Entry) ) { if (Index == BootOptionSelected) { *BdsLoadOptionEntry = LOAD_OPTION_ENTRY_FROM_LINK (Entry); break; } Index++; } ErrorExit: return Status; }
bool DoEraseFlashBlocks(CMD_TBL *cptr, int argc, char **argv) { ulong addr=0, len, end; switch (argc){ case 2 : if (!StrCmp(argv[1], "kernel")){ addr = (long)KERNEL_SRAM_BASE; len = (long)KERNEL_MAX_SIZE; } else if (!StrCmp(argv[1], "root")){ addr = (long)ROOT_SRAM_BASE; len = (long)ROOT_MAX_SIZE; } else if (!StrCmp(argv[1], "loader")){ addr = (long)LOADER_SRAM_BASE; len = (long)LOADER_MAX_SIZE; } else { printf(cptr->usage); return false; } if ((long)addr%FLASH_BLOCK_SIZE){ printf("addr is not flash block base.\n"); return false; } // erase flash blocks. printf("Erase flash blocks from 0x%08lx to 0x%08lx.\n", addr, (long)addr+len-1); if (!EraseFlashBlocks((FUNIT *)addr, len)) return false; printf("\tDone.\n"); break; // "erase [addr] [len]". case 3 : // error. if (!HexToInt(argv[2], &len, 32)){ printf(cptr->usage); return false; } if ((long)addr%FLASH_BLOCK_SIZE){ printf("addr is not flash block base.\n"); return false; } // erase flash blocks. end = addr + len; for (; addr<end; addr+=FLASH_BLOCK_SIZE){ if (!EraseOneFlashBlock((FUNIT *)addr)) return false; } break; // error. default : printf(cptr->usage); return false; break; } return true; } // DoEraseOneFlashBlock.
EFI_STATUS GetProtocolAssertion ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CHAR16 *FilePath, OUT UINT32 *PassNumber, OUT UINT32 *WarnNumber, OUT UINT32 *FailNumber ) /*++ Routine Description: Get the assertion number of a protocol or service. Arguments: DevicePath - Device path of the key files. FilePath - Path of the key files. PassNumber - The number of passed assertions. WarnNumber - The number of warning assertions. FailNumber - The number of failed assertions. Returns: EFI_SUCCESS - Get instance assertion number successfully. --*/ { EFI_STATUS Status; EFI_HANDLE DeviceHandle; EFI_FILE_HANDLE RootDir; EFI_FILE_HANDLE LogDir; UINTN FileInfoSize; EFI_FILE_INFO *FileInfo; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; UINTN BufferSize; CHAR16 *Buffer; CHAR16 *FileName; CHAR16 *LogName; CHAR16 *TempName; CHAR16 *CaseIndexStr; CHAR16 *CaseIterationStr; // // Check parameters // if ((DevicePath == NULL) || (FilePath == NULL) || (PassNumber == NULL) || (WarnNumber == NULL) || (FailNumber == NULL)) { return EFI_INVALID_PARAMETER; } // // Locate the device handle // RemainingDevicePath = DevicePath; Status = BS->LocateDevicePath ( &gEfiSimpleFileSystemProtocolGuid, &RemainingDevicePath, &DeviceHandle ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Locate device path - %r", Status)); return Status; } // // Locate the simple file system // Status = BS->HandleProtocol ( DeviceHandle, &gEfiSimpleFileSystemProtocolGuid, &Vol ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Handle protocol - %r", Status)); return Status; } // // Open the root directory // Status = Vol->OpenVolume (Vol, &RootDir); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Open volume - %r", Status)); return Status; } // // Open the log directory // Status = RootDir->Open ( RootDir, &LogDir, FilePath, EFI_FILE_MODE_READ, EFI_FILE_DIRECTORY ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Open directory - %r", Status)); RootDir->Close (RootDir); return Status; } RootDir->Close (RootDir); // // Allocate memory for the entries in the directory // FileInfoSize = sizeof(EFI_FILE_INFO) + 1024; Status = BS->AllocatePool ( EfiBootServicesData, FileInfoSize, &FileInfo ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"Allocate pool - %r", Status)); LogDir->Close (LogDir); return Status; } // // Walk through each file in the directory // while (TRUE) { // // Read a file entry // FileInfoSize = sizeof(EFI_FILE_INFO) + 1024; Status = LogDir->Read ( LogDir, &FileInfoSize, FileInfo ); if (EFI_ERROR (Status) || (FileInfoSize == 0)) { break; } if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) { // // This is a file // // // Only deal with the EFI key file // if (!SctStrEndWith (FileInfo->FileName, L".ekl")) { continue; } // // Read the file to a buffer // FileName = PoolPrint (L"%s\\%s", FilePath, FileInfo->FileName); if (FileName == NULL) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"PoolPrint: Out of resources")); return EFI_OUT_OF_RESOURCES; } Status = ReadFileToBuffer ( DevicePath, FileName, &BufferSize, &Buffer ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_DEBUG, L"Read file to buffer - %r", Status)); BS->FreePool (FileName); continue; } BS->FreePool (FileName); // // Get the index and iteration from the file name // TempName = StrDuplicate (FileInfo->FileName); // // The following function didn't allocate memory for CaseIndexStr and // CaseIterationStr. So DON'T free the TempName before these two strings // are still used. // Status = GetIndexFromFileName ( TempName, &CaseIndexStr, &CaseIterationStr ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_DEBUG, L"Get index from file name - %r", Status)); BS->FreePool (TempName); continue; } // // Load the buffer to the report information structure // LogName = SctStrEndReplace (FileInfo->FileName, L"log"); Status = LoadReportInfor ( CaseIndexStr, CaseIterationStr, Buffer, LogName ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_DEBUG, L"Load report infor - %r", Status)); BS->FreePool (TempName); BS->FreePool (LogName); BS->FreePool (Buffer); continue; } BS->FreePool (TempName); BS->FreePool (LogName); BS->FreePool (Buffer); // // Get the assertion number (free the GUID assertion table) // Status = GetAssertionNumber (PassNumber, WarnNumber, FailNumber); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_DEBUG, L"Get assertion number - %r", Status)); continue; } } else { // // This is a directory // // // Skip the '.' and '..' dir // if ((StrCmp (FileInfo->FileName, L".") == 0) || (StrCmp (FileInfo->FileName, L"..") == 0)) { continue; } // // Get the report information from the sub directories // FileName = PoolPrint (L"%s\\%s", FilePath, FileInfo->FileName); if (FileName == NULL) { EFI_SCT_DEBUG ((EFI_SCT_D_ERROR, L"PoolPrint: Out of resources")); return EFI_OUT_OF_RESOURCES; } Status = GetProtocolAssertion ( DevicePath, FileName, PassNumber, WarnNumber, FailNumber ); if (EFI_ERROR (Status)) { EFI_SCT_DEBUG ((EFI_SCT_D_DEBUG, L"Get protocol assertion - %r", Status)); BS->FreePool (FileName); continue; } BS->FreePool (FileName); } } // // Free resources // BS->FreePool (FileInfo); LogDir->Close (LogDir); // // Done // return EFI_SUCCESS; }
BOOL NtQueryObject_ObjectAllTypesInformation() { //NOTE this check is unreliable, a debugger present on the system doesn't mean it's attached to you // Function Pointer Typedef for NtQueryObject typedef NTSTATUS(WINAPI *pNtQueryObject)(IN HANDLE, IN UINT, OUT PVOID, IN ULONG, OUT PULONG); // Function pointer Typedef for NtCreateDebugObject typedef NTSTATUS(WINAPI *pNtCreateDebugObject)(OUT PHANDLE, IN ACCESS_MASK, IN POBJECT_ATTRIBUTES, IN ULONG); // We have to import the function pNtQueryObject NtQueryObject = NULL; pNtCreateDebugObject NtCreateDebugObject = NULL; // Some vars ULONG size; PVOID pMemory = NULL; POBJECT_ALL_INFORMATION pObjectAllInfo = NULL; NTSTATUS Status; HMODULE hNtdll = LoadLibrary(_T("ntdll.dll")); if (hNtdll == NULL) { // Handle however.. chances of this failing // is essentially 0 however since // ntdll.dll is a vital system resource } NtQueryObject = (pNtQueryObject)GetProcAddress(hNtdll, "NtQueryObject"); if (NtQueryObject == NULL) { // Handle however it fits your needs but as before, // if this is missing there are some SERIOUS issues with the OS } // Get the size of the information needed Status = NtQueryObject(NULL, 3, &size, sizeof(ULONG), &size); // Alocate memory for the list pMemory = VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (pMemory == NULL) return FALSE; // Now we can actually retrieve the list Status = NtQueryObject((HANDLE)-1, 3, pMemory, size, NULL); // Status != STATUS_SUCCESS if (Status != 0x00000000) { VirtualFree(pMemory, 0, MEM_RELEASE); return FALSE; } // We have the information we need pObjectAllInfo = (POBJECT_ALL_INFORMATION)pMemory; UCHAR *pObjInfoLocation = (UCHAR*)pObjectAllInfo->ObjectTypeInformation; ULONG NumObjects = pObjectAllInfo->NumberOfObjects; for (UINT i = 0; i < NumObjects; i++) { POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)pObjInfoLocation; // The debug object will always be present if (StrCmp(_T("DebugObject"), pObjectTypeInfo->TypeName.Buffer) == 0) { // Are there any objects? if (pObjectTypeInfo->TotalNumberOfObjects > 0) { VirtualFree(pMemory, 0, MEM_RELEASE); return TRUE; } else { VirtualFree(pMemory, 0, MEM_RELEASE); return FALSE; } } // Get the address of the current entries // string so we can find the end pObjInfoLocation = (unsigned char*)pObjectTypeInfo->TypeName.Buffer; // Add the size pObjInfoLocation += pObjectTypeInfo->TypeName.MaximumLength; // Skip the trailing null and alignment bytes ULONG_PTR tmp = ((ULONG_PTR)pObjInfoLocation) & -(int)sizeof(void*); // Not pretty but it works if ((ULONG_PTR)tmp != (ULONG_PTR)pObjInfoLocation) tmp += sizeof(void*); pObjInfoLocation = ((unsigned char*)tmp); } VirtualFree(pMemory, 0, MEM_RELEASE); return FALSE; }
EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; int argc, i, esl_mode = 0, hash_mode = 0; CHAR16 **ARGV, *var, *name, *progname, *owner_guid; EFI_FILE *file; void *buf; UINTN size, options = 0; EFI_GUID *owner; CHAR16 *variables[] = { L"PK", L"KEK", L"db", L"dbx", L"MokList" }; EFI_GUID *owners[] = { &GV_GUID, &GV_GUID, &SIG_DB, &SIG_DB, &MOK_OWNER }; InitializeLib(image, systab); status = argsplit(image, &argc, &ARGV); if (status != EFI_SUCCESS) { Print(L"Failed to parse arguments: %d\n", status); return status; } progname = ARGV[0]; while (argc > 1 && ARGV[1][0] == L'-') { if (StrCmp(ARGV[1], L"-a") == 0) { options |= EFI_VARIABLE_APPEND_WRITE; ARGV += 1; argc -= 1; } else if (StrCmp(ARGV[1], L"-g") == 0) { owner_guid = ARGV[2]; ARGV += 2; argc -= 2; } else if (StrCmp(ARGV[1], L"-e") == 0) { esl_mode = 1; ARGV += 1; argc -= 1; } else if (StrCmp(ARGV[1], L"-b") == 0) { esl_mode = 1; hash_mode = 1; ARGV += 1; argc -= 1; } else { /* unrecognised option */ break; } } if (argc != 3 ) { Print(L"Usage: %s: [-g guid] [-a] [-e] [-b] var file\n", progname); return EFI_INVALID_PARAMETER; } var = ARGV[1]; name = ARGV[2]; for(i = 0; i < ARRAY_SIZE(variables); i++) { if (StrCmp(var, variables[i]) == 0) { owner = owners[i]; break; } } if (i == ARRAY_SIZE(variables)) { Print(L"Invalid Variable %s\nVariable must be one of: ", var); for (i = 0; i < ARRAY_SIZE(variables); i++) Print(L"%s ", variables[i]); Print(L"\n"); return EFI_INVALID_PARAMETER; } if (owner == &MOK_OWNER) { if (!esl_mode) { Print(L"MoK variables can only be updated in ESL mode\n"); return EFI_INVALID_PARAMETER; } /* hack: esl goes directly into MoK variables, so we now * pretend we have a direct .auth update */ esl_mode = 0; } else { /* non MoK variables have runtime access and time based * authentication, MoK ones don't */ options |= EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS; } status = simple_file_open(image, name, &file, EFI_FILE_MODE_READ); if (status != EFI_SUCCESS) { Print(L"Failed to open file %s\n", name); return status; } status = simple_file_read_all(file, &size, &buf); if (status != EFI_SUCCESS) { Print(L"Failed to read file %s\n", name); return status; } simple_file_close(file); if (hash_mode) { UINT8 hash[SHA256_DIGEST_SIZE]; status = sha256_get_pecoff_digest_mem(buf, size, hash); if (status != EFI_SUCCESS) { Print(L"Failed to get hash of %s\n", name); return status; } status = variable_enroll_hash(var, *owner, hash); } else if (esl_mode) { status = SetSecureVariable(var, buf, size, *owner, options, 0); } else { status = uefi_call_wrapper(RT->SetVariable, 5, var, owner, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | options, size, buf); } if (status != EFI_SUCCESS) { Print(L"Failed to update variable %s: %d\n", var, status); return status; } return EFI_SUCCESS; }
/** Function for 'setvar' command. @param[in] ImageHandle Handle to the Image (NULL if Internal). @param[in] SystemTable Pointer to the System Table (NULL if Internal). **/ SHELL_STATUS EFIAPI ShellCommandRunSetVar ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; LIST_ENTRY *Package; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CONST CHAR16 *VariableName; CONST CHAR16 *Data; EFI_GUID Guid; CONST CHAR16 *StringGuid; UINT32 Attributes; VOID *Buffer; UINTN Size; UINTN LoopVar; EFI_DEVICE_PATH_PROTOCOL *DevPath; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; Buffer = NULL; Size = 0; Attributes = 0; DevPath = NULL; // // initialize the shell lib (we must be in non-auto-init...) // Status = ShellInitialize(); ASSERT_EFI_ERROR(Status); Status = CommandInit(); ASSERT_EFI_ERROR(Status); // // parse the command line // Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT(FALSE); } } else { if (ShellCommandLineGetCount(Package) < 2) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount(Package) > 3) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; } else { VariableName = ShellCommandLineGetRawValue(Package, 1); Data = ShellCommandLineGetRawValue(Package, 2); if (!ShellCommandLineGetFlag(Package, L"-guid")){ CopyGuid(&Guid, &gEfiGlobalVariableGuid); } else { StringGuid = ShellCommandLineGetValue(Package, L"-guid"); Status = ConvertStringToGuid(StringGuid, &Guid); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, StringGuid); ShellStatus = SHELL_INVALID_PARAMETER; } } if (Data == NULL || Data[0] != L'=') { // // Display what's there // Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool(Size); Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); } if (!EFI_ERROR(Status)&& Buffer != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size); for (LoopVar = 0 ; LoopVar < Size ; LoopVar++) { ShellPrintEx(-1, -1, L"%02x ", ((UINT8*)Buffer)[LoopVar]); } ShellPrintEx(-1, -1, L"\r\n"); } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } } else if (StrCmp(Data, L"=") == 0) { // // Delete what's there! // Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, 0, NULL); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } else { // // Change what's there or create a new one. // ASSERT(Data[0] == L'='); Data++; // // Determine if the variable exists and get the attributes // Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool(Size); Status = gRT->GetVariable((CHAR16*)VariableName, &Guid, &Attributes, &Size, Buffer); } if (EFI_ERROR(Status) || Buffer == NULL) { // // Creating a new variable. determine attributes from command line. // Attributes = 0; if (ShellCommandLineGetFlag(Package, L"-bs")) { Attributes |= EFI_VARIABLE_BOOTSERVICE_ACCESS; } if (ShellCommandLineGetFlag(Package, L"-rt")) { Attributes |= EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; } if (ShellCommandLineGetFlag(Package, L"-nv")) { Attributes |= EFI_VARIABLE_NON_VOLATILE; } } SHELL_FREE_NON_NULL(Buffer); // // What type is the new data. // if (ShellIsHexOrDecimalNumber(Data, TRUE, FALSE)) { if (StrLen(Data) % 2 != 0) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, Data); ShellStatus = SHELL_INVALID_PARAMETER; } else { // // arbitrary buffer // Buffer = AllocateZeroPool((StrLen(Data) / 2)); if (Buffer == NULL) { Status = EFI_OUT_OF_RESOURCES; } else { for (LoopVar = 0 ; LoopVar < (StrLen(Data) / 2) ; LoopVar++) { ((UINT8*)Buffer)[LoopVar] = (UINT8)(HexCharToUintn(Data[LoopVar*2]) * 16); ((UINT8*)Buffer)[LoopVar] = (UINT8)(((UINT8*)Buffer)[LoopVar] + HexCharToUintn(Data[LoopVar*2+1])); } Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrLen(Data) / 2, Buffer); } if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } } else if (StrnCmp(Data, L"\"", 1) == 0) { // // ascii text // Data++; Buffer = AllocateZeroPool(StrSize(Data) / 2); if (Buffer == NULL) { Status = EFI_OUT_OF_RESOURCES; } else { AsciiSPrint(Buffer, StrSize(Data) / 2, "%s", Data); ((CHAR8*)Buffer)[AsciiStrLen(Buffer)-1] = CHAR_NULL; Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, AsciiStrSize(Buffer)-sizeof(CHAR8), Buffer); } if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } else if (StrnCmp(Data, L"L\"", 2) == 0) { // // ucs2 text // Data++; Data++; Buffer = AllocateZeroPool(StrSize(Data)); if (Buffer == NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle); ShellStatus = SHELL_OUT_OF_RESOURCES; } else { UnicodeSPrint(Buffer, StrSize(Data), L"%s", Data); ((CHAR16*)Buffer)[StrLen(Buffer)-1] = CHAR_NULL; Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, StrSize(Buffer)-sizeof(CHAR16), Buffer); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } } else if (StrnCmp(Data, L"--", 2) == 0) { // // device path in text format // Data++; Data++; DevPath = ConvertTextToDevicePath(Data); if (DevPath == NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, Status); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = gRT->SetVariable((CHAR16*)VariableName, &Guid, Attributes, GetDevicePathSize(DevPath), DevPath); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, &Guid, VariableName, Status); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT(ShellStatus == SHELL_SUCCESS); } } } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Data); ShellStatus = SHELL_INVALID_PARAMETER; } } } ShellCommandLineFreeVarList (Package); } if (Buffer != NULL) { FreePool(Buffer); } if (DevPath != NULL) { FreePool(DevPath); } return (ShellStatus); }
static LRESULT CALLBACK WndProc(HWND Hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_CLOSE: DestroyWindow(Hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_DEVICECHANGE: { //bool Arrival=false; switch(wParam) { case DBT_DEVICEARRIVAL: //Arrival=true; case DBT_DEVICEREMOVECOMPLETE: { auto Pbh = reinterpret_cast<PDEV_BROADCAST_HDR>(lParam); if(Pbh->dbch_devicetype==DBT_DEVTYP_VOLUME) { // currently we don't care what actually happened, "just a notification" is OK //auto Pdv=reinterpret_cast<PDEV_BROADCAST_VOLUME>(Pbh); //bool Media = Pdv->dbcv_flags & DBTF_MEDIA != 0; Notifier().at(devices_notify).notify(std::make_unique<payload>()); } } break; } } break; case WM_SETTINGCHANGE: if(lParam) { if (!StrCmp(reinterpret_cast<LPCWSTR>(lParam),L"Environment")) { if (Global->Opt->UpdateEnvironment) { Notifier().at(environment_notify).notify(std::make_unique<payload>()); } } else if (!StrCmp(reinterpret_cast<LPCWSTR>(lParam),L"intl")) { Notifier().at(intl_notify).notify(std::make_unique<payload>()); } } break; case WM_POWERBROADCAST: switch(wParam) { case PBT_APMPOWERSTATUSCHANGE: // change status case PBT_POWERSETTINGCHANGE: // change percent Notifier().at(power_notify).notify(std::make_unique<payload>()); break; // TODO: // PBT_APMSUSPEND & PBT_APMRESUMEAUTOMATIC handlers } break; } return DefWindowProc(Hwnd, Msg, wParam, lParam); }
static void WriteXML( void ) { TEXTCHAR tmpname[256]; FILE *file; if( !ffl.writer.w ) InitGenX(); snprintf( tmpname, 256, "%s/Crack the Code Game State.xml", ffl.path ); file = fopen( tmpname, "wt" ); genxStartDocFile( ffl.writer.w, file ); genxPI( ffl.writer.w, "xml", "version=\"1.0\" encoding=\"utf-8\"" ); //genxAddText(ffl.writer.w, (constUtf8)"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" ); genxStartElement( ffl.writer.game ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prizeGroups ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prizeGroup ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prizes ); { INDEX idx; struct loaded_prize *prize; LIST_FORALL( ffl.loaded_prizes, idx, struct loaded_prize *, prize ) { genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prize ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.remaining ); genxAddText(ffl.writer.w, (constUtf8)prize->remaining); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.value ); genxAddText(ffl.writer.w, (constUtf8)prize->value); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.desc ); //genxAddText(ffl.writer.w, (constUtf8)); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); Release( prize->remaining ); Release( prize->value ); if( prize->desc ) Release( prize->desc ); Release( prize ); } DeleteList( &ffl.loaded_prizes ); } genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.extraPrizes ); genxAddText(ffl.writer.w, (constUtf8)"0"); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.playerLog ); { INDEX idx; LOGICAL big_prize_claimed = FALSE; struct loaded_player *player; LIST_FORALL( ffl.xml_players, idx, struct loaded_player *, player ) { if( !player->timestamp || big_prize_claimed || StrCmp( player->prizeNum, "1000000" ) != 0 ) { Release( player->cardNum ); Release( player->playerName ); Release( player->prizeDesc ); Release( player->prizeNum ); Release( player->timestamp ); Release( player ); continue; } big_prize_claimed = TRUE; genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.player ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.timestamp ); genxAddText(ffl.writer.w, (constUtf8)player->timestamp); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.cardNum ); genxAddText(ffl.writer.w, (constUtf8)player->cardNum); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.playerName ); genxAddText(ffl.writer.w, (constUtf8)player->playerName); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prizeNum ); genxAddText(ffl.writer.w, (constUtf8)player->prizeNum); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxStartElement( ffl.writer.prizeDesc ); genxAddText(ffl.writer.w, (constUtf8)player->prizeDesc); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); Release( player->cardNum ); Release( player->playerName ); Release( player->prizeDesc ); Release( player->prizeNum ); Release( player->timestamp ); Release( player ); } DeleteList( &ffl.xml_players ); } genxAddText(ffl.writer.w, (constUtf8)"\n "); genxEndElement( ffl.writer.w ); genxAddText(ffl.writer.w, (constUtf8)"\n"); genxEndElement( ffl.writer.w ); genxEndDocument( ffl.writer.w ); fclose( file ); }
// Processing of the interrupt void EtherIPProcInterrupts(ETHERIP_SERVER *s) { // Validate arguments if (s == NULL) { return; } // If EtherIP settings have been changed, and the change may effect to this connection, disconnect if (s->Ipc != NULL) { if (s->Ike->IPsec->EtherIPIdListSettingVerNo != s->LastEtherIPSettingVerNo) { ETHERIP_ID id; bool ok = true; s->LastEtherIPSettingVerNo = s->Ike->IPsec->EtherIPIdListSettingVerNo; if (SearchEtherIPId(s->IPsec, &id, s->ClientId) == false && SearchEtherIPId(s->IPsec, &id, "*") == false) { ok = false; } else { if (StrCmpi(s->CurrentEtherIPIdSetting.HubName, id.HubName) != 0 || StrCmpi(s->CurrentEtherIPIdSetting.UserName, id.UserName) != 0 || StrCmp(s->CurrentEtherIPIdSetting.Password, id.Password) != 0) { ok = false; } } if (ok == false) { // Disconnect immediately since setting of EtherIP seems to have been changed FreeIPC(s->Ipc); s->Ipc = NULL; EtherIPLog(s, "LE_RECONNECT"); } } } // Connect if IPC connection is not completed Lock(s->Lock); { if (s->Ipc == NULL) { if (s->IpcConnectThread == NULL) { if ((s->LastConnectFailedTick == 0) || ((s->LastConnectFailedTick + (UINT64)ETHERIP_VPN_CONNECT_RETRY_INTERVAL) <= s->Now)) { Lock(s->IPsec->LockSettings); { Copy(&s->CurrentIPSecServiceSetting, &s->IPsec->Services, sizeof(IPSEC_SERVICES)); } Unlock(s->IPsec->LockSettings); s->IpcConnectThread = NewThread(EtherIPIpcConnectThread, s); AddThreadToThreadList(s->Ike->ThreadList, s->IpcConnectThread); AddRef(s->Ref); } } } } Unlock(s->Lock); if (s->Ipc != NULL) { // Set to get hit the SockEvent when a packet arrives via the IPC IPCSetSockEventWhenRecvL2Packet(s->Ipc, s->SockEvent); // IPC interrupt processing IPCProcessInterrupts(s->Ipc); // Receive the MAC frame which arrived via the IPC while (true) { BLOCK *b = IPCRecvL2(s->Ipc); UCHAR *dst; UINT dst_size; if (b == NULL) { break; } if (b->Size >= 14) { BLOCK *block; // Store the arrived MAC frame by adding an EtherIP header to the reception packet queue if (s->L2TPv3 == false) { dst_size = b->Size + 2; dst = Malloc(dst_size); dst[0] = 0x30; dst[1] = 0x00; Copy(dst + 2, b->Buf, b->Size); } else { dst = Clone(b->Buf, b->Size); dst_size = b->Size; } block = NewBlock(dst, dst_size, 0); Add(s->SendPacketList, block); } FreeBlock(b); } if (IsIPCConnected(s->Ipc) == false) { // IPC connection is disconnected FreeIPC(s->Ipc); s->Ipc = NULL; } } }
/** The get current status of all handles. @param[in] ImageHandle The handle of ImageHandle. @param[in] IfName The pointer of IfName(interface name). @param[in] IfList The pointer of IfList(interface list). @retval EFI_SUCCESS The get status processed successfully. @retval others The get status process failed. **/ EFI_STATUS IfConfig6GetInterfaceInfo ( IN EFI_HANDLE ImageHandle, IN CHAR16 *IfName, IN LIST_ENTRY *IfList ) { EFI_STATUS Status; UINTN HandleIndex; UINTN HandleNum; EFI_HANDLE *HandleBuffer; EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo; IFCONFIG6_INTERFACE_CB *IfCb; UINTN DataSize; HandleBuffer = NULL; HandleNum = 0; IfInfo = NULL; IfCb = NULL; // // Locate all the handles with ip6 service binding protocol. // Status = gBS->LocateHandleBuffer ( ByProtocol, &gEfiIp6ServiceBindingProtocolGuid, NULL, &HandleNum, &HandleBuffer ); if (EFI_ERROR (Status) || (HandleNum == 0)) { return EFI_ABORTED; } // // Enumerate all handles that installed with ip6 service binding protocol. // for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) { IfCb = NULL; IfInfo = NULL; DataSize = 0; // // Ip6config protocol and ip6 service binding protocol are installed // on the same handle. // ASSERT (HandleBuffer != NULL); Status = gBS->HandleProtocol ( HandleBuffer[HandleIndex], &gEfiIp6ConfigProtocolGuid, (VOID **) &Ip6Cfg ); if (EFI_ERROR (Status)) { goto ON_ERROR; } // // Get the interface information size. // Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeInterfaceInfo, &DataSize, NULL ); if (Status != EFI_BUFFER_TOO_SMALL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } IfInfo = AllocateZeroPool (DataSize); if (IfInfo == NULL) { Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } // // Get the interface info. // Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeInterfaceInfo, &DataSize, IfInfo ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } // // Check the interface name if required. // if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) { FreePool (IfInfo); continue; } DataSize = 0; // // Get the size of dns server list. // Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeDnsServer, &DataSize, NULL ); if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } IfCb = AllocateZeroPool (sizeof (IFCONFIG6_INTERFACE_CB) + DataSize); if (IfCb == NULL) { Status = EFI_OUT_OF_RESOURCES; goto ON_ERROR; } IfCb->NicHandle = HandleBuffer[HandleIndex]; IfCb->IfInfo = IfInfo; IfCb->IfCfg = Ip6Cfg; IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv6_ADDRESS)); // // Get the dns server list if has. // if (DataSize > 0) { Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeDnsServer, &DataSize, IfCb->DnsAddr ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } } // // Get the interface id if has. // DataSize = sizeof (EFI_IP6_CONFIG_INTERFACE_ID); IfCb->IfId = AllocateZeroPool (DataSize); if (IfCb->IfId == NULL) { goto ON_ERROR; } Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeAltInterfaceId, &DataSize, IfCb->IfId ); if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } if (Status == EFI_NOT_FOUND) { FreePool (IfCb->IfId); IfCb->IfId = NULL; } // // Get the config policy. // DataSize = sizeof (EFI_IP6_CONFIG_POLICY); Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypePolicy, &DataSize, &IfCb->Policy ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } // // Get the dad transmits. // DataSize = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS); Status = Ip6Cfg->GetData ( Ip6Cfg, Ip6ConfigDataTypeDupAddrDetectTransmits, &DataSize, &IfCb->Xmits ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_ERROR; } InsertTailList (IfList, &IfCb->Link); if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) { // // Only need the appointed interface, keep the allocated buffer. // IfCb = NULL; IfInfo = NULL; break; } } if (HandleBuffer != NULL) { FreePool (HandleBuffer); } return EFI_SUCCESS; ON_ERROR: if (IfInfo != NULL) { FreePool (IfInfo); } if (IfCb != NULL) { if (IfCb->IfId != NULL) { FreePool (IfCb->IfId); } FreePool (IfCb); } return Status; }
/** The set process of the IfConfig6 application. @param[in] IfList The pointer of IfList(interface list). @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option). @retval EFI_SUCCESS The IfConfig6 set processed successfully. @retval others The IfConfig6 set process failed. **/ EFI_STATUS IfConfig6SetInterfaceInfo ( IN LIST_ENTRY *IfList, IN ARG_LIST *VarArg ) { EFI_STATUS Status; IFCONFIG6_INTERFACE_CB *IfCb; EFI_IP6_CONFIG_MANUAL_ADDRESS *CfgManAddr; EFI_IPv6_ADDRESS *CfgAddr; UINTN AddrSize; EFI_IP6_CONFIG_INTERFACE_ID *InterfaceId; UINT32 DadXmits; UINT32 CurDadXmits; UINTN CurDadXmitsLen; EFI_IP6_CONFIG_POLICY Policy; VAR_CHECK_CODE CheckCode; EFI_EVENT TimeOutEvt; EFI_EVENT MappedEvt; BOOLEAN IsAddressOk; UINTN DataSize; UINT32 Index; UINT32 Index2; BOOLEAN IsAddressSet; EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo; CfgManAddr = NULL; CfgAddr = NULL; TimeOutEvt = NULL; MappedEvt = NULL; IfInfo = NULL; InterfaceId = NULL; CurDadXmits = 0; if (IsListEmpty (IfList)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), mHiiHandle); return EFI_INVALID_PARAMETER; } // // Make sure to set only one interface each time. // IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG6_INTERFACE_CB, Link); Status = EFI_SUCCESS; // // Initialize check list mechanism. // CheckCode = IfConfig6RetriveCheckListByName( NULL, NULL, TRUE ); // // Create events & timers for asynchronous settings. // Status = gBS->CreateEvent ( EVT_TIMER, TPL_CALLBACK, NULL, NULL, &TimeOutEvt ); if (EFI_ERROR (Status)) { goto ON_EXIT; } Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, TPL_NOTIFY, IfConfig6ManualAddressNotify, &IsAddressOk, &MappedEvt ); if (EFI_ERROR (Status)) { goto ON_EXIT; } // // Parse the setting variables. // while (VarArg != NULL) { // // Check invalid parameters (duplication & unknown & conflict). // CheckCode = IfConfig6RetriveCheckListByName( mSetCheckList, VarArg->Arg, FALSE ); if (VarCheckOk != CheckCode) { switch (CheckCode) { case VarCheckDuplicate: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_DUPLICATE_COMMAND), mHiiHandle, VarArg->Arg); break; case VarCheckConflict: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_CONFLICT_COMMAND), mHiiHandle, VarArg->Arg); break; case VarCheckUnknown: ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_UNKNOWN_COMMAND), mHiiHandle, VarArg->Arg); break; default: break; } VarArg = VarArg->Next; continue; } // // Process valid variables. // if (StrCmp(VarArg->Arg, L"auto") == 0) { // // Set automaic config policy // Policy = Ip6ConfigPolicyAutomatic; Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypePolicy, sizeof (EFI_IP6_CONFIG_POLICY), &Policy ); if (EFI_ERROR(Status)) { goto ON_EXIT; } VarArg= VarArg->Next; } else if (StrCmp (VarArg->Arg, L"man") == 0) { // // Set manual config policy. // Policy = Ip6ConfigPolicyManual; Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypePolicy, sizeof (EFI_IP6_CONFIG_POLICY), &Policy ); if (EFI_ERROR(Status)) { goto ON_EXIT; } VarArg= VarArg->Next; } else if (StrCmp (VarArg->Arg, L"host") == 0) { // // Parse till the next tag or the end of command line. // VarArg = VarArg->Next; Status = IfConfig6ParseManualAddressList ( &VarArg, &CfgManAddr, &AddrSize ); if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), mHiiHandle, L"host"); continue; } else { goto ON_EXIT; } } // // Set static host ip6 address list. // This is a asynchronous process. // IsAddressOk = FALSE; Status = IfCb->IfCfg->RegisterDataNotify ( IfCb->IfCfg, Ip6ConfigDataTypeManualAddress, MappedEvt ); if (EFI_ERROR (Status)) { goto ON_EXIT; } Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypeManualAddress, AddrSize, CfgManAddr ); if (Status == EFI_NOT_READY) { // // Get current dad transmits count. // CurDadXmitsLen = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS); IfCb->IfCfg->GetData ( IfCb->IfCfg, Ip6ConfigDataTypeDupAddrDetectTransmits, &CurDadXmitsLen, &CurDadXmits ); gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000 + 10000000 * CurDadXmits); while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) { if (IsAddressOk) { Status = EFI_SUCCESS; break; } } } IfCb->IfCfg->UnregisterDataNotify ( IfCb->IfCfg, Ip6ConfigDataTypeManualAddress, MappedEvt ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_HOST), mHiiHandle, Status); goto ON_EXIT; } // // Check whether the address is set successfully. // DataSize = 0; Status = IfCb->IfCfg->GetData ( IfCb->IfCfg, Ip6ConfigDataTypeInterfaceInfo, &DataSize, NULL ); if (Status != EFI_BUFFER_TOO_SMALL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_EXIT; } IfInfo = AllocateZeroPool (DataSize); if (IfInfo == NULL) { Status = EFI_OUT_OF_RESOURCES; goto ON_EXIT; } Status = IfCb->IfCfg->GetData ( IfCb->IfCfg, Ip6ConfigDataTypeInterfaceInfo, &DataSize, IfInfo ); if (EFI_ERROR (Status)) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), mHiiHandle, Status); goto ON_EXIT; } for ( Index = 0; Index < (UINTN) (AddrSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)); Index++) { IsAddressSet = FALSE; // // By default, the prefix length 0 is regarded as 64. // if (CfgManAddr[Index].PrefixLength == 0) { CfgManAddr[Index].PrefixLength = 64; } for (Index2 = 0; Index2 < IfInfo->AddressInfoCount; Index2++) { if (EFI_IP6_EQUAL (&IfInfo->AddressInfo[Index2].Address, &CfgManAddr[Index].Address) && (IfInfo->AddressInfo[Index2].PrefixLength == CfgManAddr[Index].PrefixLength)) { IsAddressSet = TRUE; break; } } if (!IsAddressSet) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_ADDRESS_FAILED), mHiiHandle); IfConfig6PrintIpAddr ( &CfgManAddr[Index].Address, &CfgManAddr[Index].PrefixLength ); } } } else if (StrCmp (VarArg->Arg, L"gw") == 0) { // // Parse till the next tag or the end of command line. // VarArg = VarArg->Next; Status = IfConfig6ParseGwDnsAddressList ( &VarArg, &CfgAddr, &AddrSize ); if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), mHiiHandle, L"gw"); continue; } else { goto ON_EXIT; } } // // Set static gateway ip6 address list. // Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypeGateway, AddrSize, CfgAddr ); if (EFI_ERROR (Status)) { goto ON_EXIT; } } else if (StrCmp (VarArg->Arg, L"dns") == 0) { // // Parse till the next tag or the end of command line. // VarArg = VarArg->Next; Status = IfConfig6ParseGwDnsAddressList ( &VarArg, &CfgAddr, &AddrSize ); if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), mHiiHandle, L"dns"); continue; } else { goto ON_EXIT; } } // // Set static dhs server ip6 address list. // Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypeDnsServer, AddrSize, CfgAddr ); if (EFI_ERROR (Status)) { goto ON_EXIT; } } else if (StrCmp (VarArg->Arg, L"id") == 0) { // // Parse till the next tag or the end of command line. // VarArg = VarArg->Next; Status = IfConfig6ParseInterfaceId (&VarArg, &InterfaceId); if (EFI_ERROR (Status)) { goto ON_EXIT; } // // Set alternative interface id. // Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypeAltInterfaceId, sizeof (EFI_IP6_CONFIG_INTERFACE_ID), InterfaceId ); if (EFI_ERROR (Status)) { goto ON_EXIT; } } else if (StrCmp (VarArg->Arg, L"dad") == 0) { // // Parse till the next tag or the end of command line. // VarArg = VarArg->Next; Status = IfConfig6ParseDadXmits (&VarArg, &DadXmits); if (EFI_ERROR (Status)) { goto ON_EXIT; } // // Set dad transmits count. // Status = IfCb->IfCfg->SetData ( IfCb->IfCfg, Ip6ConfigDataTypeDupAddrDetectTransmits, sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS), &DadXmits ); if (EFI_ERROR(Status)) { goto ON_EXIT; } } } ON_EXIT: if (CfgManAddr != NULL) { FreePool (CfgManAddr); } if (CfgAddr != NULL) { FreePool (CfgAddr); } if (MappedEvt != NULL) { gBS->CloseEvent (MappedEvt); } if (TimeOutEvt != NULL) { gBS->CloseEvent (TimeOutEvt); } if (IfInfo != NULL) { FreePool (IfInfo); } return Status; }
void CCmd_SendSpec::OnOutputInfo(char level, LPCTSTR data, LPCTSTR msg) { //i18n: completion message in data BOOL processedMessage=FALSE; switch(m_SpecType) { case P4BRANCH_SPEC: if(StrNCmp(data, _T("Branch "), 7) == 0) { TheApp()->StatusAdd(msg, SV_COMPLETION); processedMessage=TRUE; } break; case P4CLIENT_SPEC: if(StrNCmp(data, _T("Client "), 7) == 0) { TheApp()->StatusAdd(msg, SV_COMPLETION); processedMessage=TRUE; } break; case P4JOB_SPEC: if(StrNCmp(data, _T("Job "), 4) == 0) { // Extract the new job name LPCTSTR pRest = StrChr(data+4, _T(' ')); if(pRest && (!StrCmp(pRest+1, _T("saved.")) || !StrCmp(pRest+1, _T("not changed.")))) { CString temp(data + 4); temp=temp.Left(temp.Find(_T(' '))); m_NewJobName= temp; } TheApp()->StatusAdd(msg, SV_COMPLETION); processedMessage=TRUE; } break; case P4LABEL_SPEC: if(StrNCmp(data, _T("Label "), 6) == 0) { TheApp()->StatusAdd(msg, SV_COMPLETION); processedMessage=TRUE; } break; case P4USER_SPEC: if(StrNCmp(data, _T("User "), 5) == 0) { TheApp()->StatusAdd(msg, SV_COMPLETION); processedMessage=TRUE; } break; case P4CHANGE_SPEC: if(!m_Submit) { if(StrNCmp(data, _T("Change"), 6) ==0 ) { m_NewChangeNum= _ttol(data+7); ASSERT(m_NewChangeNum); processedMessage=TRUE; } break; } else { // Typically many lines are returned - The only thing we need is the new // change number static TCHAR rc[] = _T("renamed change "); static TCHAR sc[] = _T("Submitting change "); if(!StrNCmp(data, _T("Change"), 6) && !StrStr(data, _T("updated"))) { // Its either 'Change n1 renamed change n2 and submitted' // or 'Change n1 submitted' m_NewChangeNum = _ttol(data+7); LPCTSTR pRenamed = StrStr(data+7, rc); if(pRenamed) m_NewChangeNum = _ttol(pRenamed + StrLen(rc)); ASSERT(m_NewChangeNum); } else if(!StrNCmp(data, sc, StrLen(sc))) { // It's 'Submitting change n1' m_NewChangeNum = _ttol(data+StrLen(sc)); ASSERT(m_NewChangeNum); } else if(StrStr(data, _T(" - must get")) || StrStr(data, _T(" - must resolve"))) TheApp()->StatusAdd(msg, SV_WARNING); else if(StrCmp(data, _T("Specification not corrected -- giving up.")) == 0) TheApp()->StatusAdd(msg, SV_WARNING); else TheApp()->StatusAdd(msg); processedMessage=TRUE; break; } default: ASSERT(0); } if(!processedMessage) CP4Command::OnOutputInfo( level, data, msg); }
void bmerge_r(int xlowIn, int xuppIn, int ilowIn, int iuppIn, int col, int lowmax, int uppmax) // col is >0 and <=ncol-1 if this range of [xlow,xupp] and [ilow,iupp] match up to but not including that column // lowmax=1 if xlowIn is the lower bound of this group (needed for roll) // uppmax=1 if xuppIn is the upper bound of this group (needed for roll) { int xlow=xlowIn, xupp=xuppIn, ilow=ilowIn, iupp=iuppIn, j, k, ir, lir, tmp; SEXP class; ir = lir = ilow + (iupp-ilow)/2; // lir = logical i row. if (o) ir = o[lir]-1; // ir = the actual i row if i were ordered ic = VECTOR_ELT(i,icols[col]-1); // ic = i column xc = VECTOR_ELT(x,xcols[col]-1); // xc = x column // it was checked in bmerge() that the types are equal switch (TYPEOF(xc)) { case LGLSXP : case INTSXP : // including factors ival.i = INTEGER(ic)[ir]; while(xlow < xupp-1) { mid = xlow + (xupp-xlow)/2; // Same as (xlow+xupp)/2 but without risk of overflow xval.i = INTEGER(xc)[XIND(mid)]; if (xval.i<ival.i) { // relies on NA_INTEGER == INT_MIN, tested in init.c xlow=mid; } else if (xval.i>ival.i) { // TO DO: is *(&xlow, &xupp)[0|1]=mid more efficient than branch? xupp=mid; } else { // xval.i == ival.i including NA_INTEGER==NA_INTEGER // branch mid to find start and end of this group in this column // TO DO?: not if mult=first|last and col<ncol-1 tmplow = mid; tmpupp = mid; while(tmplow<xupp-1) { mid = tmplow + (xupp-tmplow)/2; xval.i = INTEGER(xc)[XIND(mid)]; if (xval.i == ival.i) tmplow=mid; else xupp=mid; } while(xlow<tmpupp-1) { mid = xlow + (tmpupp-xlow)/2; xval.i = INTEGER(xc)[XIND(mid)]; if (xval.i == ival.i) tmpupp=mid; else xlow=mid; } // xlow and xupp now surround the group in xc, we only need this range for the next column break; } } tmplow = lir; tmpupp = lir; while(tmplow<iupp-1) { // TO DO: could double up from lir rather than halving from iupp mid = tmplow + (iupp-tmplow)/2; xval.i = INTEGER(ic)[ o ? o[mid]-1 : mid ]; // reuse xval to search in i if (xval.i == ival.i) tmplow=mid; else iupp=mid; } while(ilow<tmpupp-1) { mid = ilow + (tmpupp-ilow)/2; xval.i = INTEGER(ic)[ o ? o[mid]-1 : mid ]; if (xval.i == ival.i) tmpupp=mid; else ilow=mid; } // ilow and iupp now surround the group in ic, too break; case STRSXP : ival.s = STRING_ELT(ic,ir); while(xlow < xupp-1) { mid = xlow + (xupp-xlow)/2; xval.s = STRING_ELT(xc, XIND(mid)); if (enc_warn && (ENC_KNOWN(ival.s) || ENC_KNOWN(xval.s))) { // The || is only done here to avoid the warning message being repeating in this code. warning("A known encoding (latin1 or UTF-8) was detected in a join column. data.table compares the bytes currently, so doesn't support *mixed* encodings well; i.e., using both latin1 and UTF-8, or if any unknown encodings are non-ascii and some of those are marked known and others not. But if either latin1 or UTF-8 is used exclusively, and all unknown encodings are ascii, then the result should be ok. In future we will check for you and avoid this warning if everything is ok. The tricky part is doing this without impacting performance for ascii-only cases."); // TO DO: check and warn in forder whether any strings are non-ascii (>127) but unknown encoding // check in forder whether both latin1 and UTF-8 have been used // See bugs #5159 and #5266 and related #5295 to revisit enc_warn = FALSE; // just warn once } tmp = StrCmp(xval.s, ival.s); // uses pointer equality first, NA_STRING are allowed and joined to, then uses strcmp on CHAR(). if (tmp == 0) { // TO DO: deal with mixed encodings and locale optionally tmplow = mid; tmpupp = mid; while(tmplow<xupp-1) { mid = tmplow + (xupp-tmplow)/2; xval.s = STRING_ELT(xc, XIND(mid)); if (ival.s == xval.s) tmplow=mid; else xupp=mid; // the == here assumes (within this column) no mixing of latin1 and UTF-8, and no unknown non-ascii } // TO DO: add checks to forder, see above. while(xlow<tmpupp-1) { mid = xlow + (tmpupp-xlow)/2; xval.s = STRING_ELT(xc, XIND(mid)); if (ival.s == xval.s) tmpupp=mid; else xlow=mid; // see above re == } break; } else if (tmp < 0) { xlow=mid; } else { xupp=mid; } } tmplow = lir; tmpupp = lir; while(tmplow<iupp-1) { mid = tmplow + (iupp-tmplow)/2; xval.s = STRING_ELT(ic, o ? o[mid]-1 : mid); if (xval.s == ival.s) tmplow=mid; else iupp=mid; // see above re == } while(ilow<tmpupp-1) { mid = ilow + (tmpupp-ilow)/2; xval.s = STRING_ELT(ic, o ? o[mid]-1 : mid); if (xval.s == ival.s) tmpupp=mid; else ilow=mid; // see above re == } break; case REALSXP : class = getAttrib(xc, R_ClassSymbol); twiddle = (isString(class) && STRING_ELT(class, 0)==char_integer64) ? &i64twiddle : &dtwiddle; ival.ll = twiddle(DATAPTR(ic), ir, 1); while(xlow < xupp-1) { mid = xlow + (xupp-xlow)/2; xval.ll = twiddle(DATAPTR(xc), XIND(mid), 1); if (xval.ll<ival.ll) { xlow=mid; } else if (xval.ll>ival.ll) { xupp=mid; } else { // xval.ll == ival.ll) tmplow = mid; tmpupp = mid; while(tmplow<xupp-1) { mid = tmplow + (xupp-tmplow)/2; xval.ll = twiddle(DATAPTR(xc), XIND(mid), 1); if (xval.ll == ival.ll) tmplow=mid; else xupp=mid; } while(xlow<tmpupp-1) { mid = xlow + (tmpupp-xlow)/2; xval.ll = twiddle(DATAPTR(xc), XIND(mid), 1); if (xval.ll == ival.ll) tmpupp=mid; else xlow=mid; } break; } } tmplow = lir; tmpupp = lir; while(tmplow<iupp-1) { mid = tmplow + (iupp-tmplow)/2; xval.ll = twiddle(DATAPTR(ic), o ? o[mid]-1 : mid, 1 ); if (xval.ll == ival.ll) tmplow=mid; else iupp=mid; } while(ilow<tmpupp-1) { mid = ilow + (tmpupp-ilow)/2; xval.ll = twiddle(DATAPTR(ic), o ? o[mid]-1 : mid, 1 ); if (xval.ll == ival.ll) tmpupp=mid; else ilow=mid; } break; default: error("Type '%s' not supported as key column", type2char(TYPEOF(xc))); } if (xlow<xupp-1) { // if value found, low and upp surround it, unlike standard binary search where low falls on it if (col<ncol-1) bmerge_r(xlow, xupp, ilow, iupp, col+1, 1, 1); // final two 1's are lowmax and uppmax else { int len = xupp-xlow-1; if (len>1) allLen1[0] = FALSE; for (j=ilow+1; j<iupp; j++) { // usually iterates once only for j=ir k = o ? o[j]-1 : j; retFirst[k] = xlow+2; // extra +1 for 1-based indexing at R level retLength[k]= len; } } } else if (roll!=0.0 && col==ncol-1) { // runs once per i row (not each search test), so not hugely time critical if (xlow != xupp-1 || xlow<xlowIn || xupp>xuppIn) error("Internal error: xlow!=xupp-1 || xlow<xlowIn || xupp>xuppIn"); if (rollToNearest) { // value of roll ignored currently when nearest if ( (!lowmax || xlow>xlowIn) && (!uppmax || xupp<xuppIn) ) { if ( ( TYPEOF(ic)==REALSXP && REAL(ic)[ir]-REAL(xc)[XIND(xlow)] <= REAL(xc)[XIND(xupp)]-REAL(ic)[ir] ) || ( TYPEOF(ic)<=INTSXP && INTEGER(ic)[ir]-INTEGER(xc)[XIND(xlow)] <= INTEGER(xc)[XIND(xupp)]-INTEGER(ic)[ir] )) { retFirst[ir] = xlow+1; retLength[ir] = 1; } else { retFirst[ir] = xupp+1; retLength[ir] = 1; } } else if (uppmax && xupp==xuppIn && rollends[1]) { retFirst[ir] = xlow+1; retLength[ir] = 1; } else if (lowmax && xlow==xlowIn && rollends[0]) { retFirst[ir] = xupp+1; retLength[ir] = 1; } } else { if ( ( (roll>0.0 && (!lowmax || xlow>xlowIn) && (xupp<xuppIn || !uppmax || rollends[1])) || (roll<0.0 && xupp==xuppIn && uppmax && rollends[1]) ) && ( (TYPEOF(ic)==REALSXP && (REAL(ic)[ir]-REAL(xc)[XIND(xlow)]-rollabs<1e-6 || REAL(ic)[ir]-REAL(xc)[XIND(xlow)] == rollabs)) // #1007 fix || (TYPEOF(ic)<=INTSXP && (double)(INTEGER(ic)[ir]-INTEGER(xc)[XIND(xlow)])-rollabs<1e-6 ) || (TYPEOF(ic)==STRSXP) )) { retFirst[ir] = xlow+1; retLength[ir] = 1; } else if ( ( (roll<0.0 && (!uppmax || xupp<xuppIn) && (xlow>xlowIn || !lowmax || rollends[0])) || (roll>0.0 && xlow==xlowIn && lowmax && rollends[0]) ) && ( (TYPEOF(ic)==REALSXP && (REAL(xc)[XIND(xupp)]-REAL(ic)[ir]-rollabs<1e-6 || REAL(xc)[XIND(xupp)]-REAL(ic)[ir] == rollabs)) // 1007 fix || (TYPEOF(ic)<=INTSXP && (double)(INTEGER(xc)[XIND(xupp)]-INTEGER(ic)[ir])-rollabs<1e-6 ) || (TYPEOF(ic)==STRSXP) )) { retFirst[ir] = xupp+1; // == xlow+2 retLength[ir] = 1; } } if (iupp-ilow > 2 && retFirst[ir]!=NA_INTEGER) { // >=2 equal values in the last column being rolling to the same point. for (j=ilow+1; j<iupp; j++) { // will rewrite retFirst[ir] to itself, but that's ok if (o) k=o[j]-1; else k=j; retFirst[k] = retFirst[ir]; retLength[k]= retLength[ir]; } } } if (ilow>ilowIn && (xlow>xlowIn || (roll!=0.0 && col==ncol-1))) bmerge_r(xlowIn, xlow+1, ilowIn, ilow+1, col, lowmax, uppmax && xlow+1==xuppIn); if (iupp<iuppIn && (xupp<xuppIn || (roll!=0.0 && col==ncol-1))) bmerge_r(xupp-1, xuppIn, iupp-1, iuppIn, col, lowmax && xupp-1==xlowIn, uppmax); }