ReactOS 0.4.16-dev-1946-g52006dd
ramdisk.c File Reference
#include <freeldr.h>
#include "../ntldr/ntldropts.h"
#include <debug.h>
Include dependency graph for ramdisk.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (DISK)
 
static ARC_STATUS RamDiskClose (ULONG FileId)
 
static ARC_STATUS RamDiskGetFileInformation (ULONG FileId, FILEINFORMATION *Information)
 
static ARC_STATUS RamDiskOpen (CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
 
static ARC_STATUS RamDiskRead (ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
 
static ARC_STATUS RamDiskSeek (ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
 
static ARC_STATUS RamDiskLoadVirtualFile (IN PCSTR FileName, IN PCSTR DefaultPath OPTIONAL)
 
ARC_STATUS RamDiskInitialize (IN BOOLEAN InitRamDisk, IN PCSTR LoadOptions OPTIONAL, IN PCSTR DefaultPath OPTIONAL)
 

Variables

PVOID gInitRamDiskBase = NULL
 
ULONG gInitRamDiskSize = 0
 
static BOOLEAN RamDiskDeviceRegistered = FALSE
 
static PVOID RamDiskBase
 
static ULONGLONG RamDiskFileSize
 
static ULONGLONG RamDiskImageLength
 
static ULONG RamDiskImageOffset
 
static ULONGLONG RamDiskOffset
 
static const DEVVTBL RamDiskVtbl
 

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( DISK  )

◆ RamDiskClose()

static ARC_STATUS RamDiskClose ( ULONG  FileId)
static

Definition at line 32 of file ramdisk.c.

33{
34 /* Nothing to do */
35 return ESUCCESS;
36}
@ ESUCCESS
Definition: arc.h:32

◆ RamDiskGetFileInformation()

static ARC_STATUS RamDiskGetFileInformation ( ULONG  FileId,
FILEINFORMATION Information 
)
static

Definition at line 38 of file ramdisk.c.

39{
41 Information->EndingAddress.QuadPart = RamDiskImageLength;
42 Information->CurrentAddress.QuadPart = RamDiskOffset;
44
45 return ESUCCESS;
46}
static ULONGLONG RamDiskOffset
Definition: ramdisk.c:28
static ULONGLONG RamDiskImageLength
Definition: ramdisk.c:26
@ DiskPeripheral
Definition: arc.h:138
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1049

◆ RamDiskInitialize()

ARC_STATUS RamDiskInitialize ( IN BOOLEAN  InitRamDisk,
IN PCSTR LoadOptions  OPTIONAL,
IN PCSTR DefaultPath  OPTIONAL 
)

Definition at line 229 of file ramdisk.c.

233{
234 TRACE("RamDiskInitialize(%s, '%s', '%s')\n",
235 InitRamDisk ? "INIT" : "REGULAR",
236 LoadOptions ? LoadOptions : "n/a",
237 DefaultPath ? DefaultPath : "n/a");
238
239 /* Reset the RAMDISK device */
240 if ((RamDiskBase != gInitRamDiskBase) &&
242 (gInitRamDiskSize != 0))
243 {
244 /* This is not the initial Ramdisk, so we can free the allocated memory */
246 }
248 RamDiskFileSize = 0;
251 RamDiskOffset = 0;
252
253 if (InitRamDisk)
254 {
255 /* We initialize the initial Ramdisk: it should be present in memory */
257 return ENODEV;
258
259 // TODO: Handle SDI image.
260
263 ASSERT(RamDiskFileSize < 0x100000000); // See FIXME about 4GB support in RamDiskLoadVirtualFile().
264 }
265 else
266 {
267 /* We initialize the Ramdisk from the load options */
269 CHAR FileName[MAX_PATH] = "";
270
271 /* If we don't have any load options, initialize an empty Ramdisk */
272 if (LoadOptions)
273 {
274 PCSTR Option;
276
277 /* Ramdisk image file name */
278 Option = NtLdrGetOptionEx(LoadOptions, "RDPATH=", &FileNameLength);
279 if (Option && (FileNameLength > 7))
280 {
281 /* Copy the file name */
282 Option += 7; FileNameLength -= 7;
284 Option, FileNameLength * sizeof(CHAR));
285 }
286
287 /* Ramdisk image length */
288 Option = NtLdrGetOption(LoadOptions, "RDIMAGELENGTH=");
289 if (Option)
290 {
291 RamDiskImageLength = _atoi64(Option + 14);
292 }
293
294 /* Ramdisk image offset */
295 Option = NtLdrGetOption(LoadOptions, "RDIMAGEOFFSET=");
296 if (Option)
297 {
298 RamDiskImageOffset = atol(Option + 14);
299 }
300 }
301
302 if (*FileName)
303 Status = RamDiskLoadVirtualFile(FileName, DefaultPath);
304 else
305 Status = RamDiskLoadVirtualFile(DefaultPath, NULL);
306 if (Status != ESUCCESS)
307 return Status;
308 }
309
310 /* Adjust the Ramdisk image length if needed */
313
314 /* Register the RAMDISK device */
316 {
317 FsRegisterDevice("ramdisk(0)", &RamDiskVtbl);
319 }
320
321 return ESUCCESS;
322}
#define ENODEV
Definition: acclib.h:89
static BOOLEAN RamDiskDeviceRegistered
Definition: ramdisk.c:23
static ULONGLONG RamDiskFileSize
Definition: ramdisk.c:25
static PVOID RamDiskBase
Definition: ramdisk.c:24
static ULONG RamDiskImageOffset
Definition: ramdisk.c:27
static ARC_STATUS RamDiskLoadVirtualFile(IN PCSTR FileName, IN PCSTR DefaultPath OPTIONAL)
Definition: ramdisk.c:110
static const DEVVTBL RamDiskVtbl
Definition: ramdisk.c:100
PVOID gInitRamDiskBase
Definition: ramdisk.c:20
ULONG gInitRamDiskSize
Definition: ramdisk.c:21
VOID FsRegisterDevice(_In_ PCSTR DeviceName, _In_ const DEVVTBL *FuncTable)
Definition: fs.c:673
VOID MmFreeMemory(PVOID MemoryPointer)
Definition: mm.c:215
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define MAX_PATH
Definition: compat.h:34
_Must_inspect_result_ _In_ PFILE_OBJECT _In_opt_ HANDLE _In_ ULONG FileNameLength
Definition: fltkernel.h:1129
Status
Definition: gdiplustypes.h:25
#define ASSERT(a)
Definition: mode.c:44
PCSTR NtLdrGetOption(IN PCSTR Options, IN PCSTR OptionName)
Definition: ntldropts.c:128
PCSTR NtLdrGetOptionEx(IN PCSTR Options, IN PCSTR OptionName, OUT PULONG OptionLength OPTIONAL)
Definition: ntldropts.c:117
NTSTRSAFEAPI RtlStringCbCopyNA(_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, _In_ size_t cbToCopy)
Definition: ntstrsafe.h:395
_Check_return_ long __cdecl atol(_In_z_ const char *_Str)
ULONG ARC_STATUS
Definition: arc.h:4
_Check_return_ _ACRTIMP __int64 __cdecl _atoi64(_In_z_ char const *_String)
#define TRACE(s)
Definition: solgame.cpp:4
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
char CHAR
Definition: xmlstorage.h:175

Referenced by ArmHwDetect(), LoadAndBootWindows(), and LoadReactOSSetup().

◆ RamDiskLoadVirtualFile()

static ARC_STATUS RamDiskLoadVirtualFile ( IN PCSTR  FileName,
IN PCSTR DefaultPath  OPTIONAL 
)
static

Definition at line 110 of file ramdisk.c.

113{
115 ULONG RamFileId;
117 ULONGLONG TotalRead;
118 ULONG PercentPerChunk, Percent;
121
122 /* Display progress */
123 UiDrawProgressBarCenter("Loading RamDisk...");
124
125 /* Try opening the Ramdisk file */
126 TRACE("RamDiskLoadVirtualFile: Opening '%s', '%s'\n",
127 FileName, DefaultPath ? DefaultPath : "n/a");
128 Status = FsOpenFile(FileName, DefaultPath, OpenReadOnly, &RamFileId);
129 if (Status != ESUCCESS)
130 return Status;
131
132 /* Get the file or device size */
134 if (Status != ESUCCESS)
135 {
136 ArcClose(RamFileId);
137 return Status;
138 }
139 /* NOTE: For partitions, StartingAddress/EndingAddress are the start/end
140 * positions of the partition as byte offsets from the start of the disk */
141 Information.EndingAddress.QuadPart -= Information.StartingAddress.QuadPart;
142 Information.StartingAddress.QuadPart = 0ULL;
143
144 /* If we are actually opening a RAW device, retrieve instead its usable volume size */
145 if (Information.FileNameLength == 0 && Information.FileName[0] == ANSI_NULL &&
147 {
148 ULONGLONG VolumeSize;
149 Status = FsGetVolumeSize(RamFileId, &VolumeSize);
150 if (Status != ESUCCESS)
151 ERR("Couldn't retrieve volume size on device '%s', falling back to RAW size\n", FileName);
152 else
153 Information.EndingAddress.QuadPart = VolumeSize;
154 }
155
156 TRACE("RAMDISK size: %I64u (High: %lu ; Low: %lu)\n",
157 Information.EndingAddress.QuadPart,
158 Information.EndingAddress.HighPart,
159 Information.EndingAddress.LowPart);
160
161 /* FIXME: For now, limit RAM disks to 4GB */
162 if (Information.EndingAddress.HighPart != 0) // (RamDiskFileSize >= 0x100000000ULL)
163 {
164 ArcClose(RamFileId);
165 UiMessageBox("RAM disk too big.");
166 return ENOMEM;
167 }
168 RamDiskFileSize = Information.EndingAddress.QuadPart;
169
170 /* Allocate memory for it */
171 ChunkSize = 8 * 1024 * 1024;
173 PercentPerChunk = 0;
174 else
175 PercentPerChunk = 100 * ChunkSize / RamDiskFileSize;
177 if (!RamDiskBase)
178 {
179 RamDiskFileSize = 0;
180 ArcClose(RamFileId);
181 UiMessageBox("Failed to allocate memory for RAM disk.");
182 return ENOMEM;
183 }
184
185 /*
186 * Read it in chunks, starting at the beginning
187 */
188 Position.QuadPart = 0;
189 Status = ArcSeek(RamFileId, &Position, SeekAbsolute);
190 if (Status != ESUCCESS)
191 goto ReadFailure;
192
193 for (TotalRead = 0, Percent = 0;
194 TotalRead < RamDiskFileSize;
195 TotalRead += ChunkSize, Percent += PercentPerChunk)
196 {
197 /* If we are at the last chunk, read only what's remaining */
198 if ((RamDiskFileSize - TotalRead) < ChunkSize)
199 ChunkSize = (ULONG)(RamDiskFileSize - TotalRead);
200
201 /* Update progress */
202 UiUpdateProgressBar(Percent, NULL);
203
204 /* Copy the data */
205 Status = ArcRead(RamFileId,
206 (PVOID)((ULONG_PTR)RamDiskBase + (ULONG_PTR)TotalRead),
207 ChunkSize,
208 &Count);
209 if ((Status != ESUCCESS) || (Count != ChunkSize))
210 {
211 Status = ((Status != ESUCCESS) ? Status : EIO);
212 goto ReadFailure;
213 }
214 }
216 ArcClose(RamFileId);
217 return ESUCCESS;
218
219ReadFailure:
222 RamDiskFileSize = 0;
223 ArcClose(RamFileId);
224 UiMessageBox("Failed to read RAM disk.");
225 return Status;
226}
#define ENOMEM
Definition: acclib.h:84
#define EIO
Definition: acclib.h:81
#define ERR(fmt,...)
Definition: precomp.h:57
ARC_STATUS ArcGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
Definition: fs.c:462
ARC_STATUS ArcSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
Definition: fs.c:455
ARC_STATUS FsOpenFile(IN PCSTR FileName, IN PCSTR DefaultPath OPTIONAL, IN OPENMODE OpenMode, OUT PULONG FileId)
Definition: fs.c:478
ARC_STATUS ArcClose(_In_ ULONG FileId)
Definition: fs.c:409
ARC_STATUS FsGetVolumeSize(_In_ ULONG DeviceId, _Out_ PULONGLONG VolumeSize)
Returns the (useful) size of a file-system volume laid on the storage media device opened via DeviceI...
Definition: fs.c:541
ARC_STATUS ArcRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
Definition: fs.c:448
PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType)
Definition: mm.c:31
VOID UiUpdateProgressBar(_In_ ULONG Percentage, _In_opt_ PCSTR ProgressText)
Definition: ui.c:454
VOID UiDrawProgressBarCenter(_In_ PCSTR ProgressText)
Definition: ui.c:487
VOID UiMessageBox(_In_ PCSTR Format,...)
Definition: ui.c:359
#define ULL(a, b)
Definition: format_msg.c:27
int Count
Definition: noreturn.cpp:7
#define ANSI_NULL
@ LoaderXIPRom
Definition: arc.h:318
@ FloppyDiskPeripheral
Definition: arc.h:139
@ SeekAbsolute
Definition: arc.h:59
@ OpenReadOnly
Definition: arc.h:65
static COORD Position
Definition: mouse.c:34
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint64_t ULONGLONG
Definition: typedefs.h:67
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
Definition: rtlfuncs.h:2294

Referenced by RamDiskInitialize().

◆ RamDiskOpen()

static ARC_STATUS RamDiskOpen ( CHAR Path,
OPENMODE  OpenMode,
ULONG FileId 
)
static

Definition at line 48 of file ramdisk.c.

49{
50 /* Always return success, as contents are already in memory */
51 return ESUCCESS;
52}

◆ RamDiskRead()

static ARC_STATUS RamDiskRead ( ULONG  FileId,
VOID Buffer,
ULONG  N,
ULONG Count 
)
static

Definition at line 54 of file ramdisk.c.

55{
56 PVOID StartAddress;
57
58 /* Don't allow reads past our image */
60 {
61 *Count = 0;
62 return EIO;
63 }
64 // N = min(N, RamdiskImageLength - RamDiskOffset);
65
66 /* Get actual pointer */
68
69 /* Do the read */
70 RtlCopyMemory(Buffer, StartAddress, N);
72 *Count = N;
73
74 return ESUCCESS;
75}
#define N
Definition: crc32.c:57
Definition: bufpool.h:45
#define ULONG_PTR
Definition: config.h:101
void * PVOID
Definition: typedefs.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

◆ RamDiskSeek()

static ARC_STATUS RamDiskSeek ( ULONG  FileId,
LARGE_INTEGER Position,
SEEKMODE  SeekMode 
)
static

Definition at line 77 of file ramdisk.c.

78{
79 LARGE_INTEGER NewPosition = *Position;
80
81 switch (SeekMode)
82 {
83 case SeekAbsolute:
84 break;
85 case SeekRelative:
86 NewPosition.QuadPart += RamDiskOffset;
87 break;
88 default:
90 return EINVAL;
91 }
92
93 if (NewPosition.QuadPart >= RamDiskImageLength)
94 return EINVAL;
95
96 RamDiskOffset = NewPosition.QuadPart;
97 return ESUCCESS;
98}
#define EINVAL
Definition: acclib.h:90
#define FALSE
Definition: types.h:117
@ SeekRelative
Definition: arc.h:60
LONGLONG QuadPart
Definition: typedefs.h:114

Variable Documentation

◆ gInitRamDiskBase

PVOID gInitRamDiskBase = NULL

Definition at line 20 of file ramdisk.c.

Referenced by CmdLineParse(), and RamDiskInitialize().

◆ gInitRamDiskSize

ULONG gInitRamDiskSize = 0

Definition at line 21 of file ramdisk.c.

Referenced by CmdLineParse(), and RamDiskInitialize().

◆ RamDiskBase

PVOID RamDiskBase
static

Definition at line 24 of file ramdisk.c.

Referenced by RamDiskInitialize(), RamDiskLoadVirtualFile(), and RamDiskRead().

◆ RamDiskDeviceRegistered

BOOLEAN RamDiskDeviceRegistered = FALSE
static

Definition at line 23 of file ramdisk.c.

Referenced by RamDiskInitialize().

◆ RamDiskFileSize

ULONGLONG RamDiskFileSize
static

Definition at line 25 of file ramdisk.c.

Referenced by RamDiskInitialize(), and RamDiskLoadVirtualFile().

◆ RamDiskImageLength

ULONGLONG RamDiskImageLength
static

Definition at line 26 of file ramdisk.c.

Referenced by RamDiskGetFileInformation(), RamDiskInitialize(), RamDiskRead(), and RamDiskSeek().

◆ RamDiskImageOffset

ULONG RamDiskImageOffset
static

Definition at line 27 of file ramdisk.c.

Referenced by RamDiskInitialize(), and RamDiskRead().

◆ RamDiskOffset

ULONGLONG RamDiskOffset
static

Definition at line 28 of file ramdisk.c.

Referenced by RamDiskGetFileInformation(), RamDiskInitialize(), RamDiskRead(), and RamDiskSeek().

◆ RamDiskVtbl

const DEVVTBL RamDiskVtbl
static
Initial value:
=
{
}
static ARC_STATUS RamDiskOpen(CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
Definition: ramdisk.c:48
static ARC_STATUS RamDiskRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
Definition: ramdisk.c:54
static ARC_STATUS RamDiskSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
Definition: ramdisk.c:77
static ARC_STATUS RamDiskClose(ULONG FileId)
Definition: ramdisk.c:32
static ARC_STATUS RamDiskGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
Definition: ramdisk.c:38

Definition at line 100 of file ramdisk.c.

Referenced by RamDiskInitialize().