LONG RegDeleteValue(FRLDRHKEY Key, PCWSTR ValueName) { PLIST_ENTRY Ptr; PVALUE Value = NULL; if ((ValueName == NULL) || (*ValueName == 0)) { /* delete default value */ if (Key->Data != NULL) MmFreeMemory(Key->Data); Key->Data = NULL; Key->DataSize = 0; Key->DataType = 0; } else { /* delete non-default value */ Ptr = Key->ValueList.Flink; while (Ptr != &Key->ValueList) { Value = CONTAINING_RECORD(Ptr, VALUE, ValueList); if (_wcsicmp(Value->Name, ValueName) == 0) break; Ptr = Ptr->Flink; } if (Ptr == &Key->ValueList) return ERROR_INVALID_PARAMETER; /* delete value */ Key->ValueCount--; if (Value->Name != NULL) MmFreeMemory(Value->Name); Value->Name = NULL; Value->NameSize = 0; if (Value->DataSize > sizeof(PUCHAR)) { if (Value->Data != NULL) MmFreeMemory(Value->Data); } Value->Data = NULL; Value->DataSize = 0; Value->DataType = 0; RemoveEntryList(&Value->ValueList); MmFreeMemory(Value); } return ERROR_SUCCESS; }
PVOID VideoAllocateOffScreenBuffer(VOID) { ULONG BufferSize; if (VideoOffScreenBuffer != NULL) { MmFreeMemory(VideoOffScreenBuffer); VideoOffScreenBuffer = NULL; } BufferSize = MachVideoGetBufferSize(); VideoOffScreenBuffer = MmAllocateMemoryWithType(BufferSize, LoaderFirmwareTemporary); return VideoOffScreenBuffer; }
/* * FatLookupFile() * This function searches the file system for the * specified filename and fills in an FAT_FILE_INFO structure * with info describing the file, etc. returns ARC error code */ LONG FatLookupFile(PFAT_VOLUME_INFO Volume, PCSTR FileName, ULONG DeviceId, PFAT_FILE_INFO FatFileInfoPointer) { UINT32 i; ULONG NumberOfPathParts; CHAR PathPart[261]; PVOID DirectoryBuffer; ULONG DirectoryStartCluster = 0; ULONG DirectorySize; FAT_FILE_INFO FatFileInfo; TRACE("FatLookupFile() FileName = %s\n", FileName); memset(FatFileInfoPointer, 0, sizeof(FAT_FILE_INFO)); // // Figure out how many sub-directories we are nested in // NumberOfPathParts = FsGetNumPathParts(FileName); // // Loop once for each part // for (i=0; i<NumberOfPathParts; i++) { // // Get first path part // FsGetFirstNameFromPath(PathPart, FileName); // // Advance to the next part of the path // for (; (*FileName != '\\') && (*FileName != '/') && (*FileName != '\0'); FileName++) { } FileName++; // // Buffer the directory contents // DirectoryBuffer = FatBufferDirectory(Volume, DirectoryStartCluster, &DirectorySize, (i == 0) ); if (DirectoryBuffer == NULL) { return ENOMEM; } // // Search for file name in directory // if (ISFATX(Volume->FatType)) { if (!FatXSearchDirectoryBufferForFile(Volume, DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo)) { MmFreeMemory(DirectoryBuffer); return ENOENT; } } else { if (!FatSearchDirectoryBufferForFile(Volume, DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo)) { MmFreeMemory(DirectoryBuffer); return ENOENT; } } MmFreeMemory(DirectoryBuffer); // // If we have another sub-directory to go then // grab the start cluster and free the fat chain array // if ((i+1) < NumberOfPathParts) { // // Check if current entry is a directory // if (!(FatFileInfo.Attributes & ATTR_DIRECTORY)) { MmFreeMemory(FatFileInfo.FileFatChain); return ENOTDIR; } DirectoryStartCluster = FatFileInfo.FileFatChain[0]; } MmFreeMemory(FatFileInfo.FileFatChain); } memcpy(FatFileInfoPointer, &FatFileInfo, sizeof(FAT_FILE_INFO)); return ESUCCESS; }
PVOID FatBufferDirectory(PFAT_VOLUME_INFO Volume, ULONG DirectoryStartCluster, ULONG *DirectorySize, BOOLEAN RootDirectory) { PVOID DirectoryBuffer; TRACE("FatBufferDirectory() DirectoryStartCluster = %d RootDirectory = %s\n", DirectoryStartCluster, (RootDirectory ? "TRUE" : "FALSE")); /* * For FAT32, the root directory is nothing special. We can treat it the same * as a subdirectory. */ if (RootDirectory && Volume->FatType == FAT32) { DirectoryStartCluster = Volume->RootDirStartCluster; RootDirectory = FALSE; } // // Calculate the size of the directory // if (RootDirectory) { *DirectorySize = Volume->RootDirSectors * Volume->BytesPerSector; } else { *DirectorySize = FatCountClustersInChain(Volume, DirectoryStartCluster) * Volume->SectorsPerCluster * Volume->BytesPerSector; } // // Attempt to allocate memory for directory buffer // TRACE("Trying to allocate (DirectorySize) %d bytes.\n", *DirectorySize); DirectoryBuffer = MmAllocateMemory(*DirectorySize); if (DirectoryBuffer == NULL) { return NULL; } // // Now read directory contents into DirectoryBuffer // if (RootDirectory) { if (!FatReadVolumeSectors(Volume, Volume->RootDirSectorStart, Volume->RootDirSectors, DirectoryBuffer)) { MmFreeMemory(DirectoryBuffer); return NULL; } } else { if (!FatReadClusterChain(Volume, DirectoryStartCluster, 0xFFFFFFFF, DirectoryBuffer)) { MmFreeMemory(DirectoryBuffer); return NULL; } } return DirectoryBuffer; }