示例#1
0
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;
}
示例#2
0
文件: video.c 项目: GYGit/reactos
PVOID VideoAllocateOffScreenBuffer(VOID)
{
    ULONG        BufferSize;

    if (VideoOffScreenBuffer != NULL)
    {
        MmFreeMemory(VideoOffScreenBuffer);
        VideoOffScreenBuffer = NULL;
    }

    BufferSize = MachVideoGetBufferSize();

    VideoOffScreenBuffer = MmAllocateMemoryWithType(BufferSize, LoaderFirmwareTemporary);

    return VideoOffScreenBuffer;
}
示例#3
0
/*
 * 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;
}
示例#4
0
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;
}