Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
amdf committed May 15, 2011
0 parents commit 58d1654
Show file tree
Hide file tree
Showing 10 changed files with 572 additions and 0 deletions.
Empty file added README
Empty file.
19 changes: 19 additions & 0 deletions dllmain.cpp
@@ -0,0 +1,19 @@
// dllmain.cpp: îďđĺäĺë˙ĺň ňî÷ęó âőîäŕ äë˙ ďđčëîćĺíč˙ DLL.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

214 changes: 214 additions & 0 deletions ntfs.h
@@ -0,0 +1,214 @@
typedef struct {
ULONG Type;
USHORT UsaOffset;
USHORT UsaCount;
USN Usn;
} NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;

typedef struct {
NTFS_RECORD_HEADER Ntfs;
USHORT SequenceNumber;
USHORT LinkCount;
USHORT AttributesOffset;
USHORT Flags; // 0x0001 = InUse, 0x0002 = Directory
ULONG BytesInUse;
ULONG BytesAllocated;
ULONGLONG BaseFileRecord;
USHORT NextAttributeNumber;
} FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;

typedef enum {
AttributeStandardInformation = 0x10,
AttributeAttributeList = 0x20,
AttributeFileName = 0x30,
AttributeObjectId = 0x40,
AttributeSecurityDescriptor = 0x50,
AttributeVolumeName = 0x60,
AttributeVolumeInformation = 0x70,
AttributeData = 0x80,
AttributeIndexRoot = 0x90,
AttributeIndexAllocation = 0xA0,
AttributeBitmap = 0xB0,
AttributeReparsePoint = 0xC0,
AttributeEAInformation = 0xD0,
AttributeEA = 0xE0,
AttributePropertySet = 0xF0,
AttributeLoggedUtilityStream = 0x100
} ATTRIBUTE_TYPE, *PATTRIBUTE_TYPE;

typedef struct {
ATTRIBUTE_TYPE AttributeType;
ULONG Length;
BOOLEAN Nonresident;
UCHAR NameLength;
USHORT NameOffset;
USHORT Flags; // 0x0001 = Compressed
USHORT AttributeNumber;
} ATTRIBUTE, *PATTRIBUTE;

typedef struct {
ATTRIBUTE Attribute;
ULONG ValueLength;
USHORT ValueOffset;
USHORT Flags; // 0x0001 = Indexed
} RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;

typedef struct {
ATTRIBUTE Attribute;
ULONGLONG LowVcn;
ULONGLONG HighVcn;
USHORT RunArrayOffset;
UCHAR CompressionUnit;
UCHAR AlignmentOrReserved[5];
ULONGLONG AllocatedSize;
ULONGLONG DataSize;
ULONGLONG InitializedSize;
ULONGLONG CompressedSize; // Only when compressed
} NONRESIDENT_ATTRIBUTE, *PNONRESIDENT_ATTRIBUTE;

typedef struct {
ULONGLONG CreationTime;
ULONGLONG ChangeTime;
ULONGLONG LastWriteTime;
ULONGLONG LastAccessTime;
ULONG FileAttributes;
ULONG AlignmentOrReservedOrUnknown[3];
ULONG QuotaId; // NTFS 3.0 only
ULONG SecurityId; // NTFS 3.0 only
ULONGLONG QuotaCharge; // NTFS 3.0 only
USN Usn; // NTFS 3.0 only
} STANDARD_INFORMATION, *PSTANDARD_INFORMATION;

typedef struct {
ATTRIBUTE_TYPE AttributeType;
USHORT Length;
UCHAR NameLength;
UCHAR NameOffset;
ULONGLONG LowVcn;
ULONGLONG FileReferenceNumber;
USHORT AttributeNumber;
USHORT AlignmentOrReserved[3];
} ATTRIBUTE_LIST, *PATTRIBUTE_LIST;

typedef struct {
ULONGLONG DirectoryFileReferenceNumber;
ULONGLONG CreationTime; // Saved when filename last changed
ULONGLONG ChangeTime; // ditto
ULONGLONG LastWriteTime; // ditto
ULONGLONG LastAccessTime; // ditto
ULONGLONG AllocatedSize; // ditto
ULONGLONG DataSize; // ditto
ULONG FileAttributes; // ditto
ULONG AlignmentOrReserved;
UCHAR NameLength;
UCHAR NameType; // 0x01 = Long, 0x02 = Short
WCHAR Name[1];
} FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;

typedef struct {
GUID ObjectId;
union {
struct {
GUID BirthVolumeId;
GUID BirthObjectId;
GUID DomainId;
} ;
UCHAR ExtendedInfo[48];
};
} OBJECTID_ATTRIBUTE, *POBJECTID_ATTRIBUTE;

typedef struct {
ULONG Unknown[2];
UCHAR MajorVersion;
UCHAR MinorVersion;
USHORT Flags;
} VOLUME_INFORMATION, *PVOLUME_INFORMATION;

typedef struct {
ULONG EntriesOffset;
ULONG IndexBlockLength;
ULONG AllocatedSize;
ULONG Flags; // 0x00 = Small directory, 0x01 = Large directory
} DIRECTORY_INDEX, *PDIRECTORY_INDEX;

typedef struct {
ULONGLONG FileReferenceNumber;
USHORT Length;
USHORT AttributeLength;
ULONG Flags; // 0x01 = Has trailing VCN, 0x02 = Last entry
// FILENAME_ATTRIBUTE Name;
// ULONGLONG Vcn; // VCN in IndexAllocation of earlier entries
} DIRECTORY_ENTRY, *PDIRECTORY_ENTRY;

typedef struct {
ATTRIBUTE_TYPE Type;
ULONG CollationRule;
ULONG BytesPerIndexBlock;
ULONG ClustersPerIndexBlock;
DIRECTORY_INDEX DirectoryIndex;
} INDEX_ROOT, *PINDEX_ROOT;

typedef struct {
NTFS_RECORD_HEADER Ntfs;
ULONGLONG IndexBlockVcn;
DIRECTORY_INDEX DirectoryIndex;
} INDEX_BLOCK_HEADER, *PINDEX_BLOCK_HEADER;

typedef struct {
ULONG ReparseTag;
USHORT ReparseDataLength;
USHORT Reserved;
UCHAR ReparseData[1];
} REPARSE_POINT, *PREPARSE_POINT;

typedef struct {
ULONG EaLength;
ULONG EaQueryLength;
} EA_INFORMATION, *PEA_INFORMATION;

typedef struct {
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR EaNameLength;
USHORT EaValueLength;
CHAR EaName[1];
// UCHAR EaData[];
} EA_ATTRIBUTE, *PEA_ATTRIBUTE;

typedef struct {
WCHAR AttributeName[64];
ULONG AttributeNumber;
ULONG Unknown[2];
ULONG Flags;
ULONGLONG MinimumSize;
ULONGLONG MaximumSize;
} ATTRIBUTE_DEFINITION, *PATTRIBUTE_DEFINITION;

#pragma pack(push, 1)

typedef struct {
UCHAR Jump[3];
UCHAR Format[8];
USHORT BytesPerSector;
UCHAR SectorsPerCluster;
USHORT BootSectors;
UCHAR Mbz1;
USHORT Mbz2;
USHORT Reserved1;
UCHAR MediaType;
USHORT Mbz3;
USHORT SectorsPerTrack;
USHORT NumberOfHeads;
ULONG PartitionOffset;
ULONG Reserved2[2];
ULONGLONG TotalSectors;
ULONGLONG MftStartLcn;
ULONGLONG Mft2StartLcn;
ULONG ClustersPerFileRecord;
ULONG ClustersPerIndexBlock;
ULONGLONG VolumeSerialNumber;
UCHAR Code[0x1AE];
USHORT BootSignature;
} BOOT_BLOCK, *PBOOT_BLOCK;

#pragma pack(pop)
111 changes: 111 additions & 0 deletions objidlib.cpp
@@ -0,0 +1,111 @@
// objidlib.cpp: îïðåäåëÿåò ýêñïîðòèðîâàííûå ôóíêöèè äëÿ ïðèëîæåíèÿ DLL.
//

#include "stdafx.h"
#include "objidlib.h"

OBJIDLIB_API BOOL ObjectIdExists(LPCWSTR sFileName)
{
HANDLE hFile = OpenFileForRead(sFileName,
(GetFileAttributes(sFileName) & FILE_ATTRIBUTE_DIRECTORY));
OBJECTID_ATTRIBUTE Obj;
DWORD dwRet;

if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

if (!DeviceIoControl(hFile, FSCTL_GET_OBJECT_ID,
NULL, 0, &Obj, sizeof(OBJECTID_ATTRIBUTE), &dwRet, NULL))
{
CloseHandle(hFile);
return FALSE;
}

CloseHandle(hFile);
return TRUE;
}

OBJIDLIB_API BOOL CreateObjectId(LPCWSTR sFileName, POBJECTID_ATTRIBUTE pObjId)
{
HANDLE hNew = OpenFileForRead(sFileName,
(GetFileAttributes(sFileName) & FILE_ATTRIBUTE_DIRECTORY));
OBJECTID_ATTRIBUTE Obj;
DWORD dwRet;

if (hNew == INVALID_HANDLE_VALUE)
{
return FALSE;
}

ZeroMemory(&Obj, sizeof(OBJECTID_ATTRIBUTE));

if (!DeviceIoControl(hNew,
FSCTL_CREATE_OR_GET_OBJECT_ID,
NULL, 0, &Obj, sizeof(OBJECTID_ATTRIBUTE), &dwRet, NULL))
{
CloseHandle(hNew);
return FALSE;
}

if (NULL != pObjId)
{
memcpy(pObjId, &Obj, sizeof(OBJECTID_ATTRIBUTE));
}

CloseHandle(hNew);
return TRUE;
}

OBJIDLIB_API BOOL GetObjectId(LPCWSTR sFileName, POBJECTID_ATTRIBUTE pObjId)
{
if (NULL != pObjId)
{
return FALSE;
}

HANDLE hNew = OpenFileForRead(sFileName,
(GetFileAttributes(sFileName) & FILE_ATTRIBUTE_DIRECTORY));

DWORD dwRet;

if (hNew == INVALID_HANDLE_VALUE)
{
return FALSE;
}

if (!DeviceIoControl(hNew,
FSCTL_GET_OBJECT_ID,
NULL, 0, pObjId, sizeof(OBJECTID_ATTRIBUTE), &dwRet, NULL))
{
CloseHandle(hNew);
return FALSE;
}

CloseHandle(hNew);
return TRUE;
}

OBJIDLIB_API BOOL DeleteObjectId(LPCWSTR sFileName)
{
HANDLE hDel = OpenFileForWrite(sFileName,
(GetFileAttributes(sFileName) & FILE_ATTRIBUTE_DIRECTORY));
DWORD dwRet;

if (hDel == INVALID_HANDLE_VALUE)
{
return FALSE;
}

if (!DeviceIoControl(hDel,
FSCTL_DELETE_OBJECT_ID,
NULL, 0, NULL, 0, &dwRet, NULL))
{
CloseHandle(hDel);
return FALSE;
}

CloseHandle(hDel);
return TRUE;
}
10 changes: 10 additions & 0 deletions objidlib.h
@@ -0,0 +1,10 @@
#ifdef OBJIDLIB_EXPORTS
#define OBJIDLIB_API extern "C" __declspec(dllexport)
#else
#define OBJIDLIB_API extern "C" __declspec(dllimport)
#endif

OBJIDLIB_API BOOL CreateObjectId(LPCWSTR sFileName, POBJECTID_ATTRIBUTE pObjId);
OBJIDLIB_API BOOL GetObjectId(LPCWSTR sFileName, POBJECTID_ATTRIBUTE pObjId);
OBJIDLIB_API BOOL ObjectIdExists(LPCWSTR sFileName);
OBJIDLIB_API BOOL DeleteObjectId(LPCWSTR sFileName);

0 comments on commit 58d1654

Please sign in to comment.