--- trunk/reactos/drivers/fs/vfat/create.c 2005-11-04 00:07:47 UTC (rev 18980)
+++ trunk/reactos/drivers/fs/vfat/create.c 2005-11-04 00:10:39 UTC (rev 18981)
@@ -37,22 +37,22 @@
OEM_STRING StringA;
USHORT Length;
CHAR cString[12];
-
+
RtlCopyMemory(cString, pEntry->ShortName, 11);
cString[11] = 0;
if (cString[0] == 0x05)
{
cString[0] = 0xe5;
}
-
+
StringA.Buffer = cString;
for (StringA.Length = 0;
StringA.Length < 8 && StringA.Buffer[StringA.Length] != ' ';
StringA.Length++);
StringA.MaximumLength = StringA.Length;
-
+
RtlOemStringToUnicodeString(NameU, &StringA, FALSE);
-
+
if (pEntry->lCase & VFAT_CASE_LOWER_BASE)
{
RtlDowncaseUnicodeString(NameU, NameU, FALSE);
@@ -69,7 +69,7 @@
}
NameU->Length = 0;
NameU->MaximumLength -= Length;
-
+
StringA.Buffer = &cString[8];
for (StringA.Length = 0;
StringA.Length < 3 && StringA.Buffer[StringA.Length] != ' ';
@@ -103,13 +103,13 @@
ULONG SizeDirEntry;
ULONG EntriesPerPage;
OEM_STRING StringO;
-
+
NameU.Buffer = Vpb->VolumeLabel;
NameU.Length = 0;
NameU.MaximumLength = sizeof(Vpb->VolumeLabel);
*(Vpb->VolumeLabel) = 0;
Vpb->VolumeLabelLength = 0;
-
+
if (DeviceExt->Flags & VCB_IS_FATX)
{
SizeDirEntry = sizeof(FATX_DIR_ENTRY);
@@ -120,11 +120,11 @@
SizeDirEntry = sizeof(FAT_DIR_ENTRY);
EntriesPerPage = FAT_ENTRIES_PER_PAGE;
}
-
+
ExAcquireResourceExclusiveLite (&DeviceExt->DirResource, TRUE);
pFcb = vfatOpenRootFCB (DeviceExt);
ExReleaseResourceLite (&DeviceExt->DirResource);
-
+
FileOffset.QuadPart = 0;
if (CcMapData(pFcb->FileObject, &FileOffset, PAGE_SIZE, TRUE, &Context, (PVOID*)&Entry))
{
@@ -171,7 +171,7 @@
ExAcquireResourceExclusiveLite (&DeviceExt->DirResource, TRUE);
vfatReleaseFCB (DeviceExt, pFcb);
ExReleaseResourceLite (&DeviceExt->DirResource);
-
+
return STATUS_SUCCESS;
}
@@ -196,11 +196,11 @@
UNICODE_STRING PathNameU;
UNICODE_STRING FileToFindUpcase;
BOOLEAN WildCard;
-
+
DPRINT ("FindFile(Parent %x, FileToFind '%wZ', DirIndex: %d)\n",
Parent, FileToFindU, DirContext->DirIndex);
DPRINT ("FindFile: Path %wZ)\n",&Parent->PathNameU);
-
+
PathNameBufferLength = LONGNAME_MAX_LENGTH * sizeof(WCHAR);
PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameBufferLength + sizeof(WCHAR));
if (!PathNameBuffer)
@@ -208,16 +208,16 @@
CHECKPOINT1;
return STATUS_INSUFFICIENT_RESOURCES;
}
-
+
PathNameU.Buffer = PathNameBuffer;
PathNameU.Length = 0;
PathNameU.MaximumLength = PathNameBufferLength;
-
+
DirContext->LongNameU.Length = 0;
DirContext->ShortNameU.Length = 0;
-
+
WildCard = FsRtlDoesNameContainWildCards(FileToFindU);
-
+
if (WildCard == FALSE)
{
/* if there is no '*?' in the search name, than look first for an existing fcb */
@@ -258,7 +258,7 @@
return Status;
}
}
-
+
/* FsRtlIsNameInExpression need the searched string to be upcase,
* even if IgnoreCase is specified */
Status = RtlUpcaseUnicodeString(&FileToFindUpcase, FileToFindU, TRUE);
@@ -268,7 +268,7 @@
ExFreePool(PathNameBuffer);
return Status;
}
-
+
while(TRUE)
{
Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent, DirContext, First);
@@ -292,7 +292,7 @@
Found = FsRtlAreNamesEqual(&DirContext->LongNameU, FileToFindU, TRUE, NULL) ||
FsRtlAreNamesEqual(&DirContext->ShortNameU, FileToFindU, TRUE, NULL);
}
-
+
if (Found)
{
if (WildCard)
@@ -315,7 +315,7 @@
DPRINT("%d\n", DirContext->LongNameU.Length);
DPRINT("FindFile: new Name %wZ, DirIndex %d\n",
&DirContext->LongNameU, DirContext->DirIndex);
-
+
if (Context)
{
CcUnpinData(Context);
@@ -326,12 +326,12 @@
}
DirContext->DirIndex++;
}
-
+
if (Context)
{
CcUnpinData(Context);
}
-
+
RtlFreeUnicodeString(&FileToFindUpcase);
ExFreePool(PathNameBuffer);
return Status;
@@ -350,13 +350,13 @@
NTSTATUS Status;
UNICODE_STRING PathNameU;
WCHAR Buffer[260];
-
+
DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject, &FileObject->FileName);
-
+
if (FileObject->RelatedFileObject)
{
DPRINT ("'%wZ'\n", &FileObject->RelatedFileObject->FileName);
-
+
*ParentFcb = FileObject->RelatedFileObject->FsContext;
(*ParentFcb)->RefCount++;
}
@@ -364,7 +364,7 @@
{
*ParentFcb = NULL;
}
-
+
if (!DeviceExt->FatInfo.FixedMedia)
{
Status = VfatBlockDeviceIoControl (DeviceExt->StorageDevice,
@@ -374,17 +374,17 @@
NULL,
0,
FALSE);
-
+
if (Status == STATUS_VERIFY_REQUIRED)
-
+
{
PDEVICE_OBJECT DeviceToVerify;
-
+
DPRINT ("Media change detected!\n");
DPRINT ("Device %p\n", DeviceExt->StorageDevice);
-
+
DeviceToVerify = IoGetDeviceToVerify (PsGetCurrentThread ());
-
+
IoSetDeviceToVerify (PsGetCurrentThread (),
NULL);
Status = IoVerifyVolume (DeviceExt->StorageDevice,
@@ -397,12 +397,12 @@
return Status;
}
}
-
+
if (*ParentFcb)
{
(*ParentFcb)->RefCount++;
}
-
+
PathNameU.Buffer = Buffer;
PathNameU.Length = 0;
PathNameU.MaximumLength = sizeof(Buffer);
@@ -413,10 +413,10 @@
PathNameU.Length -= sizeof(WCHAR);
}
PathNameU.Buffer[PathNameU.Length / sizeof(WCHAR)] = 0;
-
+
/* try first to find an existing FCB in memory */
DPRINT ("Checking for existing FCB in memory\n");
-
+
Status = vfatGetFCBForFile (DeviceExt, ParentFcb, &Fcb, &PathNameU);
if (!NT_SUCCESS (Status))
{
@@ -449,14 +449,14 @@
PDEVICE_EXTENSION DeviceExt;
ULONG RequestedDisposition, RequestedOptions;
PVFATCCB pCcb;
- PVFATFCB pFcb;
+ PVFATFCB pFcb = NULL;
PVFATFCB ParentFcb;
PWCHAR c, last;
BOOLEAN PagingFileCreate = FALSE;
LARGE_INTEGER AllocationSize;
BOOLEAN Dots;
UNICODE_STRING FileNameU;
-
+
/* Unpack the various parameters. */
Stack = IoGetCurrentIrpStackLocation (Irp);
RequestedDisposition = ((Stack->Parameters.Create.Options >> 24) & 0xff);
@@ -465,14 +465,14 @@
PagingFileCreate = (Stack->Flags & SL_OPEN_PAGING_FILE) ? TRUE : FALSE;
FileObject = Stack->FileObject;
DeviceExt = DeviceObject->DeviceExtension;
-
+
/* Check their validity. */
if (RequestedOptions & FILE_DIRECTORY_FILE &&
RequestedDisposition == FILE_SUPERSEDE)
{
return(STATUS_INVALID_PARAMETER);
}
-
+
/* This a open operation for the volume itself */
if (FileObject->FileName.Length == 0 &&
FileObject->RelatedFileObject == NULL)
@@ -498,11 +498,11 @@
FileObject->FsContext = pFcb;
FileObject->FsContext2 = pCcb;
pFcb->RefCount++;
-
+
Irp->IoStatus.Information = FILE_OPENED;
return(STATUS_SUCCESS);
}
-
+
/*
* Check for illegal characters and illegale dot sequences in the file name
*/
@@ -524,16 +524,16 @@
{
Dots = FALSE;
}
-
+
if (*c != '\\' && vfatIsLongIllegal(*c))
{
return(STATUS_OBJECT_NAME_INVALID);
}
}
-
+
/* Try opening the file. */
Status = VfatOpenFile (DeviceExt, FileObject, &ParentFcb);
-
+
/*
* If the directory containing the file to open doesn't exist then
* fail immediately
@@ -548,7 +548,7 @@
}
return(Status);
}
-
+
/*
* If the file open failed then create the required file
*/
@@ -561,7 +561,7 @@
{
ULONG Attributes;
Attributes = Stack->Parameters.Create.FileAttributes;
-
+
vfatSplitPathName(&FileObject->FileName, NULL, &FileNameU);
Status = VfatAddEntry (DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions,
(UCHAR)(Attributes & FILE_ATTRIBUTE_VALID_FLAGS));
@@ -574,9 +574,9 @@
vfatReleaseFCB (DeviceExt, pFcb);
return Status;
}
-
+
Irp->IoStatus.Information = FILE_CREATED;
-
+
VfatSetAllocationSizeInformation(FileObject,
pFcb,
DeviceExt,
@@ -584,7 +584,7 @@
VfatSetExtendedAttributes(FileObject,
Irp->AssociatedIrp.SystemBuffer,
Stack->Parameters.Create.EaLength);
-
+
if (PagingFileCreate)
{
pFcb->Flags |= FCB_IS_PAGE_FILE;
@@ -614,9 +614,9 @@
VfatCloseFile (DeviceExt, FileObject);
return(STATUS_OBJECT_NAME_COLLISION);
}
-
+
pFcb = FileObject->FsContext;
-
+
if (pFcb->OpenHandleCount != 0)
{
Status = IoCheckShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess,
@@ -630,7 +630,7 @@
return(Status);
}
}
-
+
/*
* Check the file has the requested attributes
*/
@@ -646,7 +646,7 @@
VfatCloseFile (DeviceExt, FileObject);
return(STATUS_NOT_A_DIRECTORY);
}
-
+
if (PagingFileCreate)
{
/* FIXME:
@@ -678,8 +678,8 @@
return(STATUS_INVALID_PARAMETER);
}
}
-
-
+
+
if (RequestedDisposition == FILE_OVERWRITE ||
RequestedDisposition == FILE_OVERWRITE_IF)
{
@@ -694,8 +694,8 @@
return(Status);
}
}
-
-
+
+
/* Supersede the file */
if (RequestedDisposition == FILE_SUPERSEDE)
{
@@ -712,7 +712,7 @@
Irp->IoStatus.Information = FILE_OPENED;
}
}
-
+
if (pFcb->OpenHandleCount == 0)
{
IoSetShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess,
@@ -726,13 +726,13 @@
FileObject,
&pFcb->FCBShareAccess
);
-
+
}
-
+
pFcb->OpenHandleCount++;
-
+
/* FIXME : test write access if requested */
-
+
return(Status);
}
@@ -744,9 +744,9 @@
*/
{
NTSTATUS Status;
-
+
ASSERT(IrpContext);
-
+
if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
{
/* DeviceObject represents FileSystem instead of logical volume */
@@ -757,17 +757,17 @@
VfatFreeIrpContext(IrpContext);
return(STATUS_SUCCESS);
}
-
+
if (!(IrpContext->Flags & IRPCONTEXT_CANWAIT))
{
return(VfatQueueRequest (IrpContext));
}
-
+
IrpContext->Irp->IoStatus.Information = 0;
ExAcquireResourceExclusiveLite (&IrpContext->DeviceExt->DirResource, TRUE);
Status = VfatCreateFile (IrpContext->DeviceObject, IrpContext->Irp);
ExReleaseResourceLite (&IrpContext->DeviceExt->DirResource);
-
+
IrpContext->Irp->IoStatus.Status = Status;
IoCompleteRequest (IrpContext->Irp,
(CCHAR)(NT_SUCCESS(Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT));