freeotfedriverlib.c
来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C语言 代码 · 共 132 行
C
132 行
// Description: Common FreeOTFE library functions// By Sarah Dean// Email: sdean12@sdean12.org// WWW: http://www.FreeOTFE.org///// -----------------------------------------------------------------------------//#include "FreeOTFEDriverlib.h"#include "FreeOTFElib.h"#include "FreeOTFEDebug.h"// =========================================================================// Create device dirNTSTATUSCreateDeviceDir( IN PWCHAR DirName, OUT PHANDLE DirHandle){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING devDirName; OBJECT_ATTRIBUTES dirObjAttribs; int i; DEBUGOUTLIB(DEBUGLEV_ENTER, ("CreateDeviceDir\n")); DEBUGOUTLIB(DEBUGLEV_INFO, ("Doing dir name... %ls\n", DirName)); // Note: We don't need to free devDirName, since it's buffer will be // pointing to a const RtlInitUnicodeString(&devDirName, DirName); DEBUGOUTLIB(DEBUGLEV_INFO, ("Initilizing dir obj attribs...\n")); InitializeObjectAttributes( &dirObjAttribs, &devDirName, (OBJ_PERMANENT | OBJ_OPENIF), NULL, // Root dir not needed since it's a fully // qualified name NULL // Security attribs ); DEBUGOUTLIB(DEBUGLEV_INFO, ("Creating dir object...\n")); status = ZwCreateDirectoryObject( DirHandle, DIRECTORY_ALL_ACCESS, &dirObjAttribs ); if (!(NT_SUCCESS(status))) { DEBUGOUTLIB(DEBUGLEV_ERROR, ("Unable to create/open dir object\n")); } else { DEBUGOUTLIB(DEBUGLEV_INFO, ("Making dir object temporary...\n")); status = ZwMakeTemporaryObject(*DirHandle); if (!(NT_SUCCESS(status))) { DEBUGOUTLIB(DEBUGLEV_ERROR, ("Unable to make dir object temporary?!.\n")); } } DEBUGOUTLIB(DEBUGLEV_EXIT, ("CreateDeviceDir\n")); return status;}// =========================================================================// Concatenate a "{zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz}" text representation// of the GUID given onto the end of the specified UNICODE_STRING// Note: "unicodeString" must have sufficient space to store the text// representation of the GUID.// Returns: STATUS_SUCCESS, or STATUS_BUFFER_TOO_SMALL if "unicodeString"'s// buffer was too smallNTSTATUSAppendGUIDToUnicodeString( IN GUID useGUID, IN OUT PUNICODE_STRING unicodeString){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING unicodeRep; DEBUGOUTLIB(DEBUGLEV_ENTER, ("AppendGUIDToUnicodeString\n")); // We add on an extra WCHAR since swprintf because although the UNICODE_STRING string // doesn't require it, swprintf adds a terminating NULL anyway unicodeRep.MaximumLength = GUID_STRING_REP_UNICODE_BYTE_LENGTH + sizeof(WCHAR); unicodeRep.Buffer = ExAllocatePool( NonPagedPool, unicodeRep.MaximumLength ); RtlZeroMemory(unicodeRep.Buffer, unicodeRep.MaximumLength); unicodeRep.Length = (USHORT)swprintf(unicodeRep.Buffer, L"{%.8X-%.4X-%.4X-%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X}", useGUID.Data1, useGUID.Data2, useGUID.Data3, useGUID.Data4[0], useGUID.Data4[1], useGUID.Data4[2], useGUID.Data4[3], useGUID.Data4[4], useGUID.Data4[5], useGUID.Data4[6], useGUID.Data4[7] ); // swprintf returns the number of WCHARs, not the length in bytes unicodeRep.Length = unicodeRep.Length * sizeof(WCHAR); status = RtlAppendUnicodeStringToString(unicodeString, &unicodeRep); ExFreePool(unicodeRep.Buffer); DEBUGOUTLIB(DEBUGLEV_EXIT, ("AppendGUIDToUnicodeString\n")); return status;}// =========================================================================// =========================================================================
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?