/* -------------------------------------------------------------------------- * * * Copyright 2011 Shao Miller - All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, Inc., 53 Temple Place Ste 330, * Boston MA 02111-1307, USA; either version 2 of the License, or * (at your option) any later version; incorporated herein by reference. * * ------------------------------------------------------------------------- */ #ifndef M_NTFSSECT_H_ /**** * ntfssect.h * * Fetch NTFS file cluster & sector information via Windows * * With special thanks to Mark Roddy for his article: * http://www.wd-3.com/archive/luserland.htm */ /*** Macros */ #define M_NTFSSECT_H_ #define M_NTFSSECT_API /*** Object types */ /* An "extent;" a contiguous range of file data */ typedef struct S_NTFSSECT_EXTENT_ S_NTFSSECT_EXTENT; /* Volume info relevant to file cluster & sector info */ typedef struct S_NTFSSECT_VOLINFO_ S_NTFSSECT_VOLINFO; /* Stores function pointers to some Windows functions */ typedef struct S_NTFSSECT_XPFUNCS_ S_NTFSSECT_XPFUNCS; /*** Function types */ /* The function type for Kernel32.dll's GetDiskFreeSpace() */ typedef BOOL WINAPI F_KERNEL32_GETDISKFREESPACE( LPCTSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD ); /* The function type for Kernel32.dll's GetVolumePathName() */ typedef BOOL WINAPI F_KERNEL32_GETVOLUMEPATHNAME(LPCTSTR, LPCTSTR, DWORD); /*** Function declarations */ /** * Fetch the extent containing a particular VCN * * @v File * @v Vcn * @v Extent * @ret DWORD */ DWORD M_NTFSSECT_API NtfsSectGetFileVcnExtent( HANDLE File, LARGE_INTEGER * Vcn, S_NTFSSECT_EXTENT * Extent ); /** * Populate a volume info object * * @v VolumeName * @v VolumeInfo * @ret DWORD */ DWORD M_NTFSSECT_API NtfsSectGetVolumeInfo( CHAR * VolumeName, S_NTFSSECT_VOLINFO * VolumeInfo ); /** * Populate a volume info object * * @v FileName * @v VolumeInfo * @ret DWORD */ DWORD M_NTFSSECT_API NtfsSectGetVolumeInfoFromFileName( CHAR * FileName, S_NTFSSECT_VOLINFO * VolumeInfo ); /** * Convert a volume LCN to an absolute disk LBA * * @v VolumeInfo * @v Lcn * @v Lba * @ret DWORD */ DWORD M_NTFSSECT_API NtfsSectLcnToLba( const S_NTFSSECT_VOLINFO * VolumeInfo, const LARGE_INTEGER * Lcn, LARGE_INTEGER * Lba ); /** * Load some helper XP functions * * @v XpFuncs * @ret DWORD */ DWORD M_NTFSSECT_API NtfsSectLoadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs); /** * Unload some helper XP functions * * @v XpFuncs * @ret DWORD */ VOID M_NTFSSECT_API NtfsSectUnloadXpFuncs(S_NTFSSECT_XPFUNCS * XpFuncs); /*** Object declarations */ /** * The last error message set by one of our functions. * Obviously not per-thread */ extern CHAR * NtfsSectLastErrorMessage; /*** Struct/union definitions */ struct S_NTFSSECT_EXTENT_ { LARGE_INTEGER FirstVcn; LARGE_INTEGER NextVcn; LARGE_INTEGER FirstLcn; }; struct S_NTFSSECT_VOLINFO_ { DWORD Size; HANDLE Handle; DWORD BytesPerSector; DWORD SectorsPerCluster; LARGE_INTEGER PartitionLba; }; struct S_NTFSSECT_XPFUNCS_ { DWORD Size; HMODULE Kernel32; F_KERNEL32_GETVOLUMEPATHNAME * GetVolumePathName; F_KERNEL32_GETDISKFREESPACE * GetDiskFreeSpace; }; #endif /* M_NTFSSECT_H_ */