Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 1477 of file fat.c.
Referenced by ArcOpen().
{ PFAT_VOLUME_INFO Volume; UCHAR Buffer[512]; PFAT_BOOTSECTOR BootSector = (PFAT_BOOTSECTOR)Buffer; PFAT32_BOOTSECTOR BootSector32 = (PFAT32_BOOTSECTOR)Buffer; PFATX_BOOTSECTOR BootSectorX = (PFATX_BOOTSECTOR)Buffer; FILEINFORMATION FileInformation; LARGE_INTEGER Position; ULONG Count; ULARGE_INTEGER SectorCount; LONG ret; // // Allocate data for volume information // Volume = MmHeapAlloc(sizeof(FAT_VOLUME_INFO)); if (!Volume) return NULL; RtlZeroMemory(Volume, sizeof(FAT_VOLUME_INFO)); // // Read the BootSector // Position.HighPart = 0; Position.LowPart = 0; ret = ArcSeek(DeviceId, &Position, SeekAbsolute); if (ret != ESUCCESS) { MmHeapFree(Volume); return NULL; } ret = ArcRead(DeviceId, Buffer, sizeof(Buffer), &Count); if (ret != ESUCCESS || Count != sizeof(Buffer)) { MmHeapFree(Volume); return NULL; } // // Check if BootSector is valid. If no, return early // if (!RtlEqualMemory(BootSector->FileSystemType, "FAT12 ", 8) && !RtlEqualMemory(BootSector->FileSystemType, "FAT16 ", 8) && !RtlEqualMemory(BootSector32->FileSystemType, "FAT32 ", 8) && !RtlEqualMemory(BootSectorX->FileSystemType, "FATX", 4)) { MmHeapFree(Volume); return NULL; } // // Determine sector count // ret = ArcGetFileInformation(DeviceId, &FileInformation); if (ret != ESUCCESS) { MmHeapFree(Volume); return NULL; } SectorCount.HighPart = FileInformation.EndingAddress.HighPart; SectorCount.LowPart = FileInformation.EndingAddress.LowPart; SectorCount.QuadPart /= SECTOR_SIZE; // // Keep device id // Volume->DeviceId = DeviceId; // // Really open the volume // if (!FatOpenVolume(Volume, BootSector, SectorCount.QuadPart)) { MmHeapFree(Volume); return NULL; } // // Remember FAT volume information // FatVolumes[DeviceId] = Volume; // // Return success // return &FatFuncTable; }