1
0
mirror of https://github.com/bobranten/Ext4Fsd.git synced 2025-10-29 13:18:30 -05:00

doc update and line ending conversions

This commit is contained in:
Bo Brantén
2020-08-14 23:04:55 +02:00
parent 0dfc921e41
commit fa2a988bd6
11 changed files with 2212 additions and 2212 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,49 +1,49 @@
#ifndef EXT2_SRV_PIPE_H
#define EXT2_SRV_PIPE_H
#define EXT2_MGR_SRV "\\\\.\\pipe\\EXT2MGR_PSRV"
#define PIPE_REQ_MAGIC 0xBAD0BAD8
#define REQ_BODY_SIZE (4096)
#pragma pack(1)
#pragma warning(disable: 4200)
typedef struct _PIPE_REQ {
ULONG magic;
ULONG flag;
ULONG cmd;
ULONG len;
CHAR data[0];
} PIPE_REQ, *PPIPE_REQ;
#define CMD_QUERY_DRV 0xBAD00001
#define CMD_DEFINE_DRV 0xBAD00002
#define CMD_REMOVE_DRV 0xBAD00003
typedef struct _REQ_QUERY_DRV {
ULONG type;
UCHAR drive;
UCHAR result;
USHORT symlink;
char name[0];
} REQ_QUERY_DRV, *PREQ_QUERY_DRV;
typedef struct _REQ_DEFINE_DRV {
ULONG pid;
ULONG flags;
UCHAR drive;
UCHAR result;
USHORT symlink;
char name[0];
} REQ_DEFINE_DRV, *PREQ_DEFINE_DRV,
REQ_REMOVE_DRV, *PREQ_REMOVE_DRV;
#pragma warning(default: 4200)
#pragma pack()
#ifndef EXT2_SRV_PIPE_H
#define EXT2_SRV_PIPE_H
#define EXT2_MGR_SRV "\\\\.\\pipe\\EXT2MGR_PSRV"
#define PIPE_REQ_MAGIC 0xBAD0BAD8
#define REQ_BODY_SIZE (4096)
#pragma pack(1)
#pragma warning(disable: 4200)
typedef struct _PIPE_REQ {
ULONG magic;
ULONG flag;
ULONG cmd;
ULONG len;
CHAR data[0];
} PIPE_REQ, *PPIPE_REQ;
#define CMD_QUERY_DRV 0xBAD00001
#define CMD_DEFINE_DRV 0xBAD00002
#define CMD_REMOVE_DRV 0xBAD00003
typedef struct _REQ_QUERY_DRV {
ULONG type;
UCHAR drive;
UCHAR result;
USHORT symlink;
char name[0];
} REQ_QUERY_DRV, *PREQ_QUERY_DRV;
typedef struct _REQ_DEFINE_DRV {
ULONG pid;
ULONG flags;
UCHAR drive;
UCHAR result;
USHORT symlink;
char name[0];
} REQ_DEFINE_DRV, *PREQ_DEFINE_DRV,
REQ_REMOVE_DRV, *PREQ_REMOVE_DRV;
#pragma warning(default: 4200)
#pragma pack()
#endif // EXT2_SRV_PIPE_H

File diff suppressed because it is too large Load Diff

View File

@@ -1,128 +1,128 @@
#ifndef _EXT2_SRV_INCLUDE_
#define _EXT2_SRV_INCLUDE_
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#include <crtdbg.h>
#include <process.h>
#include <WtsApi32.h>
#include <dbt.h>
#include <shellapi.h>
/*
* global defintions
*/
#define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
#define DEBUG(...) do {} while(0)
/*
* resources
*/
#define IDI_MAINFRAME 101
/*
* global defintions
*/
#ifdef _DEBUG
#define EXT2_BREAK() DebugBreak()
#define EXT2_ASSERT(X) _ASSERT(X)
#else
#define EXT2_BREAK() do {} while(0)
#define EXT2_ASSERT(X) do {} while(0)
#endif
/*
* log filter level
*/
#define EXT2_LOG_CONSOLE (0x80000000) /* print to screen */
#define EXT2_LOG_ERROR (0x00000001) /* critical messagre */
#define EXT2_LOG_MESSAGE (0x00000002) /* information */
#define EXT2_LOG_DUMP (0x40000002) /* dump and message*/
void Ext2Log(DWORD ll, char *fn, int ln, char *format, ... );
/*
* message / error log
*/
#define MsgDump(F, ...) \
do { \
Ext2Log(EXT2_LOG_DUMP, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
#define MsgLog(F, ...) \
do { \
Ext2Log(EXT2_LOG_MESSAGE, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
#define ErrLog(F, ...) \
do { \
Ext2Log(EXT2_LOG_ERROR, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
/*
* structure definitions
*/
typedef struct _EXT2_PIPE {
struct _EXT2_PIPE *l; /* next pipe handle */
HANDLE p; /* pipe handle */
HANDLE e; /* event handle */
HANDLE q; /* quiting */
OVERLAPPED o; /* overlap info */
volatile BOOL s; /* stop flag */
} EXT2_PIPE, *PEXT2_PIPE;
/*
* Ext2Pipe.cpp
*/
DWORD Ext2StartPipeSrv();
VOID Ext2StopPipeSrv();
INT Ext2NotifyUser(TCHAR *task, ULONG pid);
/*
* Mount.cpp (native API)
*/
BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName);
VOID
Ext2DrvNotify(TCHAR drive, int add);
BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv);
BOOL Ext2RemoveDrvLetter(TCHAR drive);
int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL);
INT Ext2StartMgrAsUser();
/*
* Ext2Srv.cpp
*/
VOID Ext2DrivesChangeNotify(BOOLEAN bArrival);
#endif /* _EXT2_SRV_INCLUDE_ */
#ifndef _EXT2_SRV_INCLUDE_
#define _EXT2_SRV_INCLUDE_
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#include <crtdbg.h>
#include <process.h>
#include <WtsApi32.h>
#include <dbt.h>
#include <shellapi.h>
/*
* global defintions
*/
#define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
#define DEBUG(...) do {} while(0)
/*
* resources
*/
#define IDI_MAINFRAME 101
/*
* global defintions
*/
#ifdef _DEBUG
#define EXT2_BREAK() DebugBreak()
#define EXT2_ASSERT(X) _ASSERT(X)
#else
#define EXT2_BREAK() do {} while(0)
#define EXT2_ASSERT(X) do {} while(0)
#endif
/*
* log filter level
*/
#define EXT2_LOG_CONSOLE (0x80000000) /* print to screen */
#define EXT2_LOG_ERROR (0x00000001) /* critical messagre */
#define EXT2_LOG_MESSAGE (0x00000002) /* information */
#define EXT2_LOG_DUMP (0x40000002) /* dump and message*/
void Ext2Log(DWORD ll, char *fn, int ln, char *format, ... );
/*
* message / error log
*/
#define MsgDump(F, ...) \
do { \
Ext2Log(EXT2_LOG_DUMP, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
#define MsgLog(F, ...) \
do { \
Ext2Log(EXT2_LOG_MESSAGE, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
#define ErrLog(F, ...) \
do { \
Ext2Log(EXT2_LOG_ERROR, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \
} while(0)
/*
* structure definitions
*/
typedef struct _EXT2_PIPE {
struct _EXT2_PIPE *l; /* next pipe handle */
HANDLE p; /* pipe handle */
HANDLE e; /* event handle */
HANDLE q; /* quiting */
OVERLAPPED o; /* overlap info */
volatile BOOL s; /* stop flag */
} EXT2_PIPE, *PEXT2_PIPE;
/*
* Ext2Pipe.cpp
*/
DWORD Ext2StartPipeSrv();
VOID Ext2StopPipeSrv();
INT Ext2NotifyUser(TCHAR *task, ULONG pid);
/*
* Mount.cpp (native API)
*/
BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName);
VOID
Ext2DrvNotify(TCHAR drive, int add);
BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv);
BOOL Ext2RemoveDrvLetter(TCHAR drive);
int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL);
INT Ext2StartMgrAsUser();
/*
* Ext2Srv.cpp
*/
VOID Ext2DrivesChangeNotify(BOOLEAN bArrival);
#endif /* _EXT2_SRV_INCLUDE_ */

View File

@@ -1,125 +1,125 @@
// Microsoft Visual C++ generated resource script.
//
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
2 TEXTINCLUDE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
1 TEXTINCLUDE
BEGIN
END
#endif // APSTUDIO_INVOKED
#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,7,9
PRODUCTVERSION 1,4,7,9
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x9L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Matt Wu <matt@ext2fsd.com>"
VALUE "CompanyName", "www.ext2fsd.com"
VALUE "FileDescription", "Ext2Fsd Service Management"
VALUE "FileVersion", "1.4.7.9"
VALUE "InternalName", "Ext2Srv.exe"
VALUE "LegalCopyright", "Matt Wu <matt@ext2fsd.com>"
VALUE "OriginalFilename", "Ext2Srv.exe"
VALUE "ProductName", "Ext2Fsd Service"
VALUE "ProductVersion", "1.4.7.9"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_MAINFRAME ICON "./Ext2Srv.ico"
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
// Microsoft Visual C++ generated resource script.
//
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
2 TEXTINCLUDE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
1 TEXTINCLUDE
BEGIN
END
#endif // APSTUDIO_INVOKED
#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,7,9
PRODUCTVERSION 1,4,7,9
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x9L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Matt Wu <matt@ext2fsd.com>"
VALUE "CompanyName", "www.ext2fsd.com"
VALUE "FileDescription", "Ext2Fsd Service Management"
VALUE "FileVersion", "1.4.7.9"
VALUE "InternalName", "Ext2Srv.exe"
VALUE "LegalCopyright", "Matt Wu <matt@ext2fsd.com>"
VALUE "OriginalFilename", "Ext2Srv.exe"
VALUE "ProductName", "Ext2Fsd Service"
VALUE "ProductVersion", "1.4.7.9"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_MAINFRAME ICON "./Ext2Srv.ico"
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -1,11 +1,11 @@
BUILD_ALLOW_COMPILER_WARNINGS=1
BUILD_ALLOW_LINKER_WARNINGS=1
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def
BUILD_ALLOW_COMPILER_WARNINGS=1
BUILD_ALLOW_LINKER_WARNINGS=1
#
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)\makefile.def

View File

@@ -1,466 +1,466 @@
#include <Ext2Srv.h>
#include <tlhelp32.h>
#include <Sddl.h>
BOOL Ext2SetPrivilege(HANDLE token, LPCTSTR lpszPrivilegeName)
{
TOKEN_PRIVILEGES tp = {0};
LUID luid;
DWORD le;
BOOL rc;
rc = LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid);
if(!rc)
goto errorout;
/* initialize token privilege */
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
rc = AdjustTokenPrivileges(token, FALSE, &tp, NULL, NULL, NULL);
if (!rc)
le = GetLastError();
errorout:
return rc;
}
BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName)
{
HANDLE token;
BOOL rc;
rc = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY | TOKEN_READ, &token);
if(!rc)
goto errorout;
rc = Ext2SetPrivilege(token, lpszPrivilegeName);
CloseHandle(token);
errorout:
return rc;
}
VOID
Ext2DrvNotify(TCHAR drive, int add)
{
DEV_BROADCAST_VOLUME dbv;
DWORD target = BSM_APPLICATIONS;
unsigned long drv = 0;
if (drive >= 'A' && drive <= 'Z')
drv = drive - 'A';
else if(drive >= 'a' && drive <= 'z')
drv = drive - 'a';
else
return;
dbv.dbcv_size = sizeof( dbv );
dbv.dbcv_devicetype = DBT_DEVTYP_VOLUME;
dbv.dbcv_reserved = 0;
dbv.dbcv_unitmask = (1 << drv);
dbv.dbcv_flags = DBTF_NET;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_FORCEIFHUNG |
BSF_NOHANG | BSF_NOTIMEOUTIFNOTHUNG,
&target, WM_DEVICECHANGE, add ?
DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE,
(LPARAM)(DEV_BROADCAST_HDR *)&dbv );
}
DWORD Ext2QueryMgr(TCHAR *Auth, DWORD *pids, DWORD as)
{
DWORD total = 0;
HANDLE p = NULL;
PROCESSENTRY32 r = {0};
p = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == p)
return 0;
r.dwSize=sizeof(PROCESSENTRY32);
if (!Process32First(p, &r)) {
goto errorout;
}
do {
TCHAR *n = _tcsrchr(&r.szExeFile[0], _T('\\'));
if (!n)
n = &r.szExeFile[0];
if (_tcsicmp(n, Auth) == 0) {
pids[total++] = r.th32ProcessID;
if (total >= as)
break;
}
} while(Process32Next(p, &r));
errorout:
CloseHandle(p);
return total;
}
TCHAR * Ext2BuildSrvCMD(TCHAR *task)
{
TCHAR cmd[258]= {0}, *p, *refresh = NULL;
int len = 0;
if (GetModuleFileName(NULL, cmd, 256)) {
} else {
_tcscpy(cmd, GetCommandLine());
p = _tcsstr(cmd, _T("/"));
if (p)
*p = 0;
}
len = (int)_tcslen(cmd) + 40;
refresh = new TCHAR[len];
if (!refresh)
goto errorout;
memset(refresh, 0, sizeof(TCHAR)*len);
_tcscpy_s(refresh, len - 1, cmd);
_tcscat_s(refresh, len, _T(" "));
_tcscat_s(refresh, len, task);
errorout:
return refresh;
}
TCHAR *
Ext2StrStr(TCHAR *s, TCHAR *t)
{
int ls = (int)_tcslen(s), lt = (int)_tcslen(t), i;
for (i = 0; i + lt <= ls; i++) {
if (0 == _tcsnicmp(&s[i], t, lt))
return &s[i];
}
return NULL;
}
TCHAR * Ext2BuildUsrCMD(TCHAR *task)
{
TCHAR cmd[258]= {0}, *p, *refresh = NULL;
int len = 0;
if (GetModuleFileName(NULL, cmd, 256)) {
} else {
_tcscpy(cmd, GetCommandLine());
}
p = Ext2StrStr(cmd, _T("Ext2Srv"));
if (p)
*p = 0;
len = (int)_tcslen(cmd) + 10 + (int)_tcslen(task);
refresh = new TCHAR[len];
if (!refresh)
goto errorout;
memset(refresh, 0, sizeof(TCHAR)*len);
_tcscpy_s(refresh, len - 1, cmd);
_tcscat_s(refresh, len, task);
errorout:
return refresh;
}
int Ext2AdjustTokenGroups(HANDLE token, LPCTSTR group)
{
TOKEN_GROUPS tg = {0};
PSID sid = NULL;
DWORD le;
BOOL rc;
rc = ConvertStringSidToSid(group, &sid);
if(!rc)
goto errorout;
/* initialize token groups */
tg.GroupCount = 1;
tg.Groups[0].Sid = sid;
tg.Groups[0].Attributes = SE_GROUP_OWNER;
rc = AdjustTokenGroups(token, FALSE, &tg, sizeof(tg), NULL, NULL);
if (!rc)
le = GetLastError();
errorout:
return rc;
}
int Ext2CreateUserToken(DWORD sid, HANDLE *token, BOOL bElevated)
{
HANDLE token_user = NULL;
int rc = -1;
if (!token)
goto errorout;
rc = WTSQueryUserToken(sid, &token_user);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
rc = DuplicateTokenEx(token_user, MAXIMUM_ALLOWED, NULL,
SecurityIdentification, TokenPrimary,
token);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
if (bElevated) {
Ext2SetPrivilege(token, SE_IMPERSONATE_NAME);
Ext2SetPrivilege(token, SE_CHANGE_NOTIFY_NAME);
Ext2SetPrivilege(token, SE_CREATE_GLOBAL_NAME);
Ext2AdjustTokenGroups(token, _T("S-1-5-32-544"));
}
errorout:
if (token_user && token_user != INVALID_HANDLE_VALUE)
CloseHandle(token_user);
return rc;
}
int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL bElevated)
{
LPTSTR cmd = NULL;
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
HANDLE token = 0;
int rc = -1;
if (usr)
cmd = Ext2BuildUsrCMD(usr);
else
cmd = Ext2BuildSrvCMD(srv);
if (!cmd) {
rc = -1;
goto errorout;
}
rc = Ext2CreateUserToken(sid, &token, bElevated);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
si.cb = sizeof( STARTUPINFO );
rc = CreateProcessAsUser(token, NULL, cmd, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS |
CREATE_NO_WINDOW, NULL, NULL,
&si, &pi );
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
if (!GetExitCodeProcess(pi.hProcess, (LPDWORD)&rc)) {
rc = -2;
}
if (pi.hProcess != INVALID_HANDLE_VALUE) {
CloseHandle(pi.hProcess);
}
if (pi.hThread != INVALID_HANDLE_VALUE) {
CloseHandle(pi.hThread);
}
errorout:
if (cmd)
delete []cmd;
if (token)
CloseHandle(token);
return rc;
}
INT Ext2NotifyUser(TCHAR *task, ULONG mgr)
{
DWORD pid[64] = {0}, n, i, sid = 0;
INT rc = -1;
n = Ext2QueryMgr(_T("Ext2Mgr.exe"), pid, 63);
if (mgr)
pid[n++] = mgr;
for (i = 0; i < n && pid[i]; i++) {
rc = ProcessIdToSessionId(pid[i], &sid);
if (!rc) {
continue;
}
if (!mgr && mgr == pid[i]) {
n--;
rc = Ext2StartUserTask(0, task, sid, FALSE);
} else {
Ext2StartUserTask(0, task, sid, FALSE);
}
}
return rc;
}
BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv)
{
TCHAR dos[8];
_stprintf_s(dos, 8, _T("%C:"), drv);
if (!DefineDosDevice(DDD_RAW_TARGET_PATH, dos, dev)) {
ErrLog("mount: failed to assigned drive letter %C:.\n", drv);
return 0;
}
Ext2DrvNotify(drv, TRUE);
return TRUE;
}
BOOL Ext2RemoveDrvLetter(TCHAR drive)
{
TCHAR dosDev[MAX_PATH];
/* remove drive letter */
_stprintf_s(dosDev, MAX_PATH, _T("%C:"), drive);
DefineDosDevice(DDD_REMOVE_DEFINITION,
dosDev, NULL);
Ext2DrvNotify(drive, FALSE);
return TRUE;
}
CHAR *Ext2QueryAutoUserList()
{
int rc = TRUE;
HKEY hKey;
CHAR keyPath[MAX_PATH];
CHAR *userList = NULL;
LONG status, type, len;
/* Open ext2fsd sevice key */
strcpy (keyPath, "SYSTEM\\CurrentControlSet\\Services\\Ext2Fsd\\Parameters") ;
status = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
keyPath,
0,
KEY_READ | KEY_WOW64_64KEY,
&hKey) ;
if (status != ERROR_SUCCESS) {
rc = FALSE;
goto errorout;
}
/* query autorun user list */
len = MAX_PATH - 1;
userList = new CHAR[len + 1];
if (!userList)
goto errorout;
memset(userList, 0, len + 1);
status = RegQueryValueEx( hKey,
"AutorunUsers",
0,
(LPDWORD)&type,
(BYTE *)userList,
(LPDWORD)&len);
errorout:
RegCloseKey(hKey);
return userList;
}
BOOL Ext2RunMgrForCurrentUserVista()
{
CHAR *userList = NULL, *user, e;
CHAR userName[MAX_PATH] = {0};
DWORD userLen = MAX_PATH - 1;
BOOL rc = FALSE;
if (!GetUserName(userName, &userLen))
return FALSE;
userList = Ext2QueryAutoUserList();
if (!userList)
return FALSE;
user = userList;
while (user = Ext2StrStr(user, userName)) {
if (user > userList) {
e = user[-1];
if (e != ',' && e != ';') {
user = user + strlen(userName);
continue;
}
}
e = user[strlen(userName)];
if (!e || e == ',' || e == ';') {
rc = TRUE;
goto errorout;
}
user = user + strlen(userName);
}
errorout:
if (userList)
delete [] userList;
return rc;
}
INT Ext2StartMgrAsUser()
{
SHELLEXECUTEINFO sei = {0};
TCHAR cmd[258] = {0}, *t;
DWORD rc = 0;
if (!Ext2RunMgrForCurrentUserVista()) {
return 0;
}
/* sleeping 1 second before proceeding */
Sleep(1000);
/* building task CMD path */
rc = GetModuleFileName(NULL, cmd, 256);
if (!rc) {
return 0;
}
t = Ext2StrStr(cmd, "Ext2Srv.exe");
if (!t) {
return 0;
}
t[4] = _T('M');
t[5] = _T('g');
t[6] = _T('r');
/* starting Ext2Mgr as elevated */
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_FLAG_DDEWAIT |
SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpFile = cmd;
sei.lpParameters = _T("/quiet");
sei.lpVerb = _T("runas");
sei.nShow = SW_SHOW;
return ShellExecuteEx(&sei);
}
#include <Ext2Srv.h>
#include <tlhelp32.h>
#include <Sddl.h>
BOOL Ext2SetPrivilege(HANDLE token, LPCTSTR lpszPrivilegeName)
{
TOKEN_PRIVILEGES tp = {0};
LUID luid;
DWORD le;
BOOL rc;
rc = LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid);
if(!rc)
goto errorout;
/* initialize token privilege */
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
rc = AdjustTokenPrivileges(token, FALSE, &tp, NULL, NULL, NULL);
if (!rc)
le = GetLastError();
errorout:
return rc;
}
BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName)
{
HANDLE token;
BOOL rc;
rc = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY | TOKEN_READ, &token);
if(!rc)
goto errorout;
rc = Ext2SetPrivilege(token, lpszPrivilegeName);
CloseHandle(token);
errorout:
return rc;
}
VOID
Ext2DrvNotify(TCHAR drive, int add)
{
DEV_BROADCAST_VOLUME dbv;
DWORD target = BSM_APPLICATIONS;
unsigned long drv = 0;
if (drive >= 'A' && drive <= 'Z')
drv = drive - 'A';
else if(drive >= 'a' && drive <= 'z')
drv = drive - 'a';
else
return;
dbv.dbcv_size = sizeof( dbv );
dbv.dbcv_devicetype = DBT_DEVTYP_VOLUME;
dbv.dbcv_reserved = 0;
dbv.dbcv_unitmask = (1 << drv);
dbv.dbcv_flags = DBTF_NET;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK | BSF_FORCEIFHUNG |
BSF_NOHANG | BSF_NOTIMEOUTIFNOTHUNG,
&target, WM_DEVICECHANGE, add ?
DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE,
(LPARAM)(DEV_BROADCAST_HDR *)&dbv );
}
DWORD Ext2QueryMgr(TCHAR *Auth, DWORD *pids, DWORD as)
{
DWORD total = 0;
HANDLE p = NULL;
PROCESSENTRY32 r = {0};
p = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == p)
return 0;
r.dwSize=sizeof(PROCESSENTRY32);
if (!Process32First(p, &r)) {
goto errorout;
}
do {
TCHAR *n = _tcsrchr(&r.szExeFile[0], _T('\\'));
if (!n)
n = &r.szExeFile[0];
if (_tcsicmp(n, Auth) == 0) {
pids[total++] = r.th32ProcessID;
if (total >= as)
break;
}
} while(Process32Next(p, &r));
errorout:
CloseHandle(p);
return total;
}
TCHAR * Ext2BuildSrvCMD(TCHAR *task)
{
TCHAR cmd[258]= {0}, *p, *refresh = NULL;
int len = 0;
if (GetModuleFileName(NULL, cmd, 256)) {
} else {
_tcscpy(cmd, GetCommandLine());
p = _tcsstr(cmd, _T("/"));
if (p)
*p = 0;
}
len = (int)_tcslen(cmd) + 40;
refresh = new TCHAR[len];
if (!refresh)
goto errorout;
memset(refresh, 0, sizeof(TCHAR)*len);
_tcscpy_s(refresh, len - 1, cmd);
_tcscat_s(refresh, len, _T(" "));
_tcscat_s(refresh, len, task);
errorout:
return refresh;
}
TCHAR *
Ext2StrStr(TCHAR *s, TCHAR *t)
{
int ls = (int)_tcslen(s), lt = (int)_tcslen(t), i;
for (i = 0; i + lt <= ls; i++) {
if (0 == _tcsnicmp(&s[i], t, lt))
return &s[i];
}
return NULL;
}
TCHAR * Ext2BuildUsrCMD(TCHAR *task)
{
TCHAR cmd[258]= {0}, *p, *refresh = NULL;
int len = 0;
if (GetModuleFileName(NULL, cmd, 256)) {
} else {
_tcscpy(cmd, GetCommandLine());
}
p = Ext2StrStr(cmd, _T("Ext2Srv"));
if (p)
*p = 0;
len = (int)_tcslen(cmd) + 10 + (int)_tcslen(task);
refresh = new TCHAR[len];
if (!refresh)
goto errorout;
memset(refresh, 0, sizeof(TCHAR)*len);
_tcscpy_s(refresh, len - 1, cmd);
_tcscat_s(refresh, len, task);
errorout:
return refresh;
}
int Ext2AdjustTokenGroups(HANDLE token, LPCTSTR group)
{
TOKEN_GROUPS tg = {0};
PSID sid = NULL;
DWORD le;
BOOL rc;
rc = ConvertStringSidToSid(group, &sid);
if(!rc)
goto errorout;
/* initialize token groups */
tg.GroupCount = 1;
tg.Groups[0].Sid = sid;
tg.Groups[0].Attributes = SE_GROUP_OWNER;
rc = AdjustTokenGroups(token, FALSE, &tg, sizeof(tg), NULL, NULL);
if (!rc)
le = GetLastError();
errorout:
return rc;
}
int Ext2CreateUserToken(DWORD sid, HANDLE *token, BOOL bElevated)
{
HANDLE token_user = NULL;
int rc = -1;
if (!token)
goto errorout;
rc = WTSQueryUserToken(sid, &token_user);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
rc = DuplicateTokenEx(token_user, MAXIMUM_ALLOWED, NULL,
SecurityIdentification, TokenPrimary,
token);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
if (bElevated) {
Ext2SetPrivilege(token, SE_IMPERSONATE_NAME);
Ext2SetPrivilege(token, SE_CHANGE_NOTIFY_NAME);
Ext2SetPrivilege(token, SE_CREATE_GLOBAL_NAME);
Ext2AdjustTokenGroups(token, _T("S-1-5-32-544"));
}
errorout:
if (token_user && token_user != INVALID_HANDLE_VALUE)
CloseHandle(token_user);
return rc;
}
int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL bElevated)
{
LPTSTR cmd = NULL;
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
HANDLE token = 0;
int rc = -1;
if (usr)
cmd = Ext2BuildUsrCMD(usr);
else
cmd = Ext2BuildSrvCMD(srv);
if (!cmd) {
rc = -1;
goto errorout;
}
rc = Ext2CreateUserToken(sid, &token, bElevated);
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
si.cb = sizeof( STARTUPINFO );
rc = CreateProcessAsUser(token, NULL, cmd, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS |
CREATE_NO_WINDOW, NULL, NULL,
&si, &pi );
if (!rc) {
rc = -1 * GetLastError();
goto errorout;
}
if (!GetExitCodeProcess(pi.hProcess, (LPDWORD)&rc)) {
rc = -2;
}
if (pi.hProcess != INVALID_HANDLE_VALUE) {
CloseHandle(pi.hProcess);
}
if (pi.hThread != INVALID_HANDLE_VALUE) {
CloseHandle(pi.hThread);
}
errorout:
if (cmd)
delete []cmd;
if (token)
CloseHandle(token);
return rc;
}
INT Ext2NotifyUser(TCHAR *task, ULONG mgr)
{
DWORD pid[64] = {0}, n, i, sid = 0;
INT rc = -1;
n = Ext2QueryMgr(_T("Ext2Mgr.exe"), pid, 63);
if (mgr)
pid[n++] = mgr;
for (i = 0; i < n && pid[i]; i++) {
rc = ProcessIdToSessionId(pid[i], &sid);
if (!rc) {
continue;
}
if (!mgr && mgr == pid[i]) {
n--;
rc = Ext2StartUserTask(0, task, sid, FALSE);
} else {
Ext2StartUserTask(0, task, sid, FALSE);
}
}
return rc;
}
BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv)
{
TCHAR dos[8];
_stprintf_s(dos, 8, _T("%C:"), drv);
if (!DefineDosDevice(DDD_RAW_TARGET_PATH, dos, dev)) {
ErrLog("mount: failed to assigned drive letter %C:.\n", drv);
return 0;
}
Ext2DrvNotify(drv, TRUE);
return TRUE;
}
BOOL Ext2RemoveDrvLetter(TCHAR drive)
{
TCHAR dosDev[MAX_PATH];
/* remove drive letter */
_stprintf_s(dosDev, MAX_PATH, _T("%C:"), drive);
DefineDosDevice(DDD_REMOVE_DEFINITION,
dosDev, NULL);
Ext2DrvNotify(drive, FALSE);
return TRUE;
}
CHAR *Ext2QueryAutoUserList()
{
int rc = TRUE;
HKEY hKey;
CHAR keyPath[MAX_PATH];
CHAR *userList = NULL;
LONG status, type, len;
/* Open ext2fsd sevice key */
strcpy (keyPath, "SYSTEM\\CurrentControlSet\\Services\\Ext2Fsd\\Parameters") ;
status = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
keyPath,
0,
KEY_READ | KEY_WOW64_64KEY,
&hKey) ;
if (status != ERROR_SUCCESS) {
rc = FALSE;
goto errorout;
}
/* query autorun user list */
len = MAX_PATH - 1;
userList = new CHAR[len + 1];
if (!userList)
goto errorout;
memset(userList, 0, len + 1);
status = RegQueryValueEx( hKey,
"AutorunUsers",
0,
(LPDWORD)&type,
(BYTE *)userList,
(LPDWORD)&len);
errorout:
RegCloseKey(hKey);
return userList;
}
BOOL Ext2RunMgrForCurrentUserVista()
{
CHAR *userList = NULL, *user, e;
CHAR userName[MAX_PATH] = {0};
DWORD userLen = MAX_PATH - 1;
BOOL rc = FALSE;
if (!GetUserName(userName, &userLen))
return FALSE;
userList = Ext2QueryAutoUserList();
if (!userList)
return FALSE;
user = userList;
while (user = Ext2StrStr(user, userName)) {
if (user > userList) {
e = user[-1];
if (e != ',' && e != ';') {
user = user + strlen(userName);
continue;
}
}
e = user[strlen(userName)];
if (!e || e == ',' || e == ';') {
rc = TRUE;
goto errorout;
}
user = user + strlen(userName);
}
errorout:
if (userList)
delete [] userList;
return rc;
}
INT Ext2StartMgrAsUser()
{
SHELLEXECUTEINFO sei = {0};
TCHAR cmd[258] = {0}, *t;
DWORD rc = 0;
if (!Ext2RunMgrForCurrentUserVista()) {
return 0;
}
/* sleeping 1 second before proceeding */
Sleep(1000);
/* building task CMD path */
rc = GetModuleFileName(NULL, cmd, 256);
if (!rc) {
return 0;
}
t = Ext2StrStr(cmd, "Ext2Srv.exe");
if (!t) {
return 0;
}
t[4] = _T('M');
t[5] = _T('g');
t[6] = _T('r');
/* starting Ext2Mgr as elevated */
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_FLAG_DDEWAIT |
SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpFile = cmd;
sei.lpParameters = _T("/quiet");
sei.lpVerb = _T("runas");
sei.nShow = SW_SHOW;
return ShellExecuteEx(&sei);
}

View File

@@ -1,12 +1,12 @@
TARGETNAME=Ext2Srv
TARGETPATH=obj
TARGETTYPE=PROGRAM
UMTYPE=windows
INCLUDES=.;.\Libraries\;$(INCLUDES)
TARGETLIBS=$(DDK_LIB_PATH)\WtsApi32.lib \
$(DDK_LIB_PATH)\shell32.lib
USE_MSVCRT=1
SOURCES=Ext2Pipe.cpp Ext2Srv.cpp \
Mount.cpp Ext2Srv.rc
TARGETNAME=Ext2Srv
TARGETPATH=obj
TARGETTYPE=PROGRAM
UMTYPE=windows
INCLUDES=.;.\Libraries\;$(INCLUDES)
TARGETLIBS=$(DDK_LIB_PATH)\WtsApi32.lib \
$(DDK_LIB_PATH)\shell32.lib
USE_MSVCRT=1
SOURCES=Ext2Pipe.cpp Ext2Srv.cpp \
Mount.cpp Ext2Srv.rc

View File

@@ -1,140 +1,140 @@
/*
tlhelp32.h - Include file for Tool help functions.
Written by Mumit Khan <khan@nanotech.wisc.edu>
This file is part of a free library for the Win32 API.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _TLHELP32_H
#define _TLHELP32_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define HF32_DEFAULT 1
#define HF32_SHARED 2
#define LF32_FIXED 0x1
#define LF32_FREE 0x2
#define LF32_MOVEABLE 0x4
#define MAX_MODULE_NAME32 255
#define TH32CS_SNAPHEAPLIST 0x1
#define TH32CS_SNAPPROCESS 0x2
#define TH32CS_SNAPTHREAD 0x4
#define TH32CS_SNAPMODULE 0x8
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST|TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE)
#define TH32CS_INHERIT 0x80000000
typedef struct tagHEAPLIST32 {
DWORD dwSize;
DWORD th32ProcessID;
DWORD th32HeapID;
DWORD dwFlags;
} HEAPLIST32,*PHEAPLIST32,*LPHEAPLIST32;
typedef struct tagHEAPENTRY32 {
DWORD dwSize;
HANDLE hHandle;
DWORD dwAddress;
DWORD dwBlockSize;
DWORD dwFlags;
DWORD dwLockCount;
DWORD dwResvd;
DWORD th32ProcessID;
DWORD th32HeapID;
} HEAPENTRY32,*PHEAPENTRY32,*LPHEAPENTRY32;
typedef struct tagPROCESSENTRY32W {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32W,*PPROCESSENTRY32W,*LPPROCESSENTRY32W;
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];
} PROCESSENTRY32,*PPROCESSENTRY32,*LPPROCESSENTRY32;
typedef struct tagTHREADENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ThreadID;
DWORD th32OwnerProcessID;
LONG tpBasePri;
LONG tpDeltaPri;
DWORD dwFlags;
} THREADENTRY32,*PTHREADENTRY32,*LPTHREADENTRY32;
typedef struct tagMODULEENTRY32W {
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE *modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
WCHAR szModule[MAX_MODULE_NAME32 + 1];
WCHAR szExePath[MAX_PATH];
} MODULEENTRY32W,*PMODULEENTRY32W,*LPMODULEENTRY32W;
typedef struct tagMODULEENTRY32 {
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE *modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH];
} MODULEENTRY32,*PMODULEENTRY32,*LPMODULEENTRY32;
BOOL WINAPI Heap32First(LPHEAPENTRY32,DWORD,DWORD);
BOOL WINAPI Heap32ListFirst(HANDLE,LPHEAPLIST32);
BOOL WINAPI Heap32ListNext(HANDLE,LPHEAPLIST32);
BOOL WINAPI Heap32Next(LPHEAPENTRY32);
BOOL WINAPI Module32First(HANDLE,LPMODULEENTRY32);
BOOL WINAPI Module32FirstW(HANDLE,LPMODULEENTRY32W);
BOOL WINAPI Module32Next(HANDLE,LPMODULEENTRY32);
BOOL WINAPI Module32NextW(HANDLE,LPMODULEENTRY32W);
BOOL WINAPI Process32First(HANDLE,LPPROCESSENTRY32);
BOOL WINAPI Process32FirstW(HANDLE,LPPROCESSENTRY32W);
BOOL WINAPI Process32Next(HANDLE,LPPROCESSENTRY32);
BOOL WINAPI Process32NextW(HANDLE,LPPROCESSENTRY32W);
BOOL WINAPI Thread32First(HANDLE,LPTHREADENTRY32);
BOOL WINAPI Thread32Next(HANDLE,LPTHREADENTRY32);
BOOL WINAPI Toolhelp32ReadProcessMemory(DWORD,LPCVOID,LPVOID,DWORD,LPDWORD);
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD,DWORD);
#ifdef UNICODE
#define LPMODULEENTRY32 LPMODULEENTRY32W
#define LPPROCESSENTRY32 LPPROCESSENTRY32W
#define MODULEENTRY32 MODULEENTRY32W
#define Module32First Module32FirstW
#define Module32Next Module32NextW
#define PMODULEENTRY32 PMODULEENTRY32W
#define PPROCESSENTRY32 PPROCESSENTRY32W
#define PROCESSENTRY32 PROCESSENTRY32W
#define Process32First Process32FirstW
#define Process32Next Process32NextW
#endif /* UNICODE */
#ifdef __cplusplus
}
#endif
#endif /* _TLHELP32_H */
/*
tlhelp32.h - Include file for Tool help functions.
Written by Mumit Khan <khan@nanotech.wisc.edu>
This file is part of a free library for the Win32 API.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _TLHELP32_H
#define _TLHELP32_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define HF32_DEFAULT 1
#define HF32_SHARED 2
#define LF32_FIXED 0x1
#define LF32_FREE 0x2
#define LF32_MOVEABLE 0x4
#define MAX_MODULE_NAME32 255
#define TH32CS_SNAPHEAPLIST 0x1
#define TH32CS_SNAPPROCESS 0x2
#define TH32CS_SNAPTHREAD 0x4
#define TH32CS_SNAPMODULE 0x8
#define TH32CS_SNAPALL (TH32CS_SNAPHEAPLIST|TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE)
#define TH32CS_INHERIT 0x80000000
typedef struct tagHEAPLIST32 {
DWORD dwSize;
DWORD th32ProcessID;
DWORD th32HeapID;
DWORD dwFlags;
} HEAPLIST32,*PHEAPLIST32,*LPHEAPLIST32;
typedef struct tagHEAPENTRY32 {
DWORD dwSize;
HANDLE hHandle;
DWORD dwAddress;
DWORD dwBlockSize;
DWORD dwFlags;
DWORD dwLockCount;
DWORD dwResvd;
DWORD th32ProcessID;
DWORD th32HeapID;
} HEAPENTRY32,*PHEAPENTRY32,*LPHEAPENTRY32;
typedef struct tagPROCESSENTRY32W {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32W,*PPROCESSENTRY32W,*LPPROCESSENTRY32W;
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];
} PROCESSENTRY32,*PPROCESSENTRY32,*LPPROCESSENTRY32;
typedef struct tagTHREADENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ThreadID;
DWORD th32OwnerProcessID;
LONG tpBasePri;
LONG tpDeltaPri;
DWORD dwFlags;
} THREADENTRY32,*PTHREADENTRY32,*LPTHREADENTRY32;
typedef struct tagMODULEENTRY32W {
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE *modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
WCHAR szModule[MAX_MODULE_NAME32 + 1];
WCHAR szExePath[MAX_PATH];
} MODULEENTRY32W,*PMODULEENTRY32W,*LPMODULEENTRY32W;
typedef struct tagMODULEENTRY32 {
DWORD dwSize;
DWORD th32ModuleID;
DWORD th32ProcessID;
DWORD GlblcntUsage;
DWORD ProccntUsage;
BYTE *modBaseAddr;
DWORD modBaseSize;
HMODULE hModule;
char szModule[MAX_MODULE_NAME32 + 1];
char szExePath[MAX_PATH];
} MODULEENTRY32,*PMODULEENTRY32,*LPMODULEENTRY32;
BOOL WINAPI Heap32First(LPHEAPENTRY32,DWORD,DWORD);
BOOL WINAPI Heap32ListFirst(HANDLE,LPHEAPLIST32);
BOOL WINAPI Heap32ListNext(HANDLE,LPHEAPLIST32);
BOOL WINAPI Heap32Next(LPHEAPENTRY32);
BOOL WINAPI Module32First(HANDLE,LPMODULEENTRY32);
BOOL WINAPI Module32FirstW(HANDLE,LPMODULEENTRY32W);
BOOL WINAPI Module32Next(HANDLE,LPMODULEENTRY32);
BOOL WINAPI Module32NextW(HANDLE,LPMODULEENTRY32W);
BOOL WINAPI Process32First(HANDLE,LPPROCESSENTRY32);
BOOL WINAPI Process32FirstW(HANDLE,LPPROCESSENTRY32W);
BOOL WINAPI Process32Next(HANDLE,LPPROCESSENTRY32);
BOOL WINAPI Process32NextW(HANDLE,LPPROCESSENTRY32W);
BOOL WINAPI Thread32First(HANDLE,LPTHREADENTRY32);
BOOL WINAPI Thread32Next(HANDLE,LPTHREADENTRY32);
BOOL WINAPI Toolhelp32ReadProcessMemory(DWORD,LPCVOID,LPVOID,DWORD,LPDWORD);
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD,DWORD);
#ifdef UNICODE
#define LPMODULEENTRY32 LPMODULEENTRY32W
#define LPPROCESSENTRY32 LPPROCESSENTRY32W
#define MODULEENTRY32 MODULEENTRY32W
#define Module32First Module32FirstW
#define Module32Next Module32NextW
#define PMODULEENTRY32 PMODULEENTRY32W
#define PPROCESSENTRY32 PPROCESSENTRY32W
#define PROCESSENTRY32 PROCESSENTRY32W
#define Process32First Process32FirstW
#define Process32Next Process32NextW
#endif /* UNICODE */
#ifdef __cplusplus
}
#endif
#endif /* _TLHELP32_H */

View File

@@ -1,177 +1,177 @@
#ifndef _WTSAPI32_H
#define _WTSAPI32_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if (_WIN32_WINNT >= 0x0501)
// session notification message
#define WM_WTSSESSION_CHANGE 0x02B1
typedef enum _WTS_INFO_CLASS {
WTSInitialProgram = 0,
WTSApplicationName = 1,
WTSWorkingDirectory = 2,
WTSOEMId = 3,
WTSSessionId = 4,
WTSUserName = 5,
WTSWinStationName = 6,
WTSDomainName = 7,
WTSConnectState = 8,
WTSClientBuildNumber = 9,
WTSClientName = 10,
WTSClientDirectory = 11,
WTSClientProductId = 12,
WTSClientHardwareId = 13,
WTSClientAddress = 14,
WTSClientDisplay = 15,
WTSClientProtocolType = 16,
WTSIdleTime = 17,
WTSLogonTime = 18,
WTSIncomingBytes = 19,
WTSOutgoingBytes = 20,
WTSIncomingFrames = 21,
WTSOutgoingFrames = 22,
WTSClientInfo = 23,
WTSSessionInfo = 24
} WTS_INFO_CLASS;
typedef enum _WTS_CONNECTSTATE_CLASS {
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit
} WTS_CONNECTSTATE_CLASS;
// session notification message flags
#define WTS_CONSOLE_CONNECT 0x1
#define WTS_CONSOLE_DISCONNECT 0x2
#define WTS_REMOTE_CONNECT 0x3
#define WTS_REMOTE_DISCONNECT 0x4
#define WTS_SESSION_LOGON 0x5
#define WTS_SESSION_LOGOFF 0x6
#define WTS_SESSION_LOCK 0x7
#define WTS_SESSION_UNLOCK 0x8
#define WTS_SESSION_REMOTE_CONTROL 0x9
// WTSRegisterSessionNotifiction flags
#define NOTIFY_FOR_THIS_SESSION 0
#define NOTIFY_FOR_ALL_SESSIONS 1
BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags);
BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd);
BOOL WINAPI WTSQueryUserToken(ULONG SessionId, PHANDLE pToken);
#endif /* _WIN32_WINNT >= 0x0501 */
#if (_WIN32_WINNT >= 0x0500)
typedef struct _WTS_SESSION_INFOW {
DWORD SessionId;
LPWSTR pWinStationName;
WTS_CONNECTSTATE_CLASS State;
} WTS_SESSION_INFOW, *PWTS_SESSION_INFOW;
typedef struct _WTS_SESSION_INFOA {
DWORD SessionId;
LPSTR pWinStationName;
WTS_CONNECTSTATE_CLASS State;
} WTS_SESSION_INFOA, *PWTS_SESSION_INFOA;
#ifdef UNICODE
#define WTS_SESSION_INFO WTS_SESSION_INFOW
#define PWTS_SESSION_INFO PWTS_SESSION_INFOW
#else
#define WTS_SESSION_INFO WTS_SESSION_INFOA
#define PWTS_SESSION_INFO PWTS_SESSION_INFOA
#endif
// WTSWaitSystemEvent local server handle
#define WTS_CURRENT_SERVER_HANDLE 0
#define WTS_CURRENT_SESSION ((DWORD)-1)
// WTSWaitSystemEvent flags
#define WTS_EVENT_NONE 0x00000000
#define WTS_EVENT_CREATE 0x00000001
#define WTS_EVENT_DELETE 0x00000002
#define WTS_EVENT_RENAME 0x00000004
#define WTS_EVENT_CONNECT 0x00000008
#define WTS_EVENT_DISCONNECT 0x00000010
#define WTS_EVENT_LOGON 0x00000020
#define WTS_EVENT_LOGOFF 0x00000040
#define WTS_EVENT_STATECHANGE 0x00000080
#define WTS_EVENT_LICENSE 0x00000100
#define WTS_EVENT_ALL 0x7FFFFFFF
#define WTS_EVENT_FLUSH 0x80000000
BOOL WINAPI WTSQuerySessionInformationA(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass,
LPSTR *ppBuffer, DWORD *pBytesReturned);
BOOL WINAPI WTSQuerySessionInformationW(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass,
LPTSTR *ppBuffer, DWORD *pBytesReturned);
BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD EventMask, DWORD* pEventFlags);
BOOL WINAPI WTSDisconnectSession(HANDLE hServer, DWORD SessionId, BOOL bWait);
BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version,
PWTS_SESSION_INFOW *ppSessionInfo,
PDWORD pCount);
BOOL WINAPI WTSEnumerateSessionsA(HANDLE hServer, DWORD Reserved, DWORD Version,
PWTS_SESSION_INFOA *ppSessionInfo,
PDWORD pCount);
void WINAPI WTSFreeMemory(PVOID pMemory);
#ifdef UNICODE
#define WTSEnumerateSessions WTSEnumerateSessionsW
#define WTSQuerySessionInformation WTSQuerySessionInformationW
#else
#define WTSEnumerateSessions WTSEnumerateSessionsA
#define WTSQuerySessionInformation WTSQuerySessionInformationA
#endif
BOOL WTSSendMessageA(
HANDLE hServer,
DWORD SessionId,
LPSTR pTitle,
DWORD TitleLength,
LPSTR pMessage,
DWORD MessageLength,
DWORD Style,
DWORD Timeout,
DWORD *pResponse,
BOOL bWait
);
BOOL WTSSendMessageW(
HANDLE hServer,
DWORD SessionId,
LPWSTR pTitle,
DWORD TitleLength,
LPWSTR pMessage,
DWORD MessageLength,
DWORD Style,
DWORD Timeout,
DWORD *pResponse,
BOOL bWait
);
#ifdef UNICODE
#define WTSSendMessage WTSSendMessageW
#else
#define WTSSendMessage WTSSendMessageA
#endif
#endif /* _WIN32_WINNT >= 0x0500 */
#ifdef __cplusplus
}
#endif
#endif /* _WTSAPI32_H */
#ifndef _WTSAPI32_H
#define _WTSAPI32_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if (_WIN32_WINNT >= 0x0501)
// session notification message
#define WM_WTSSESSION_CHANGE 0x02B1
typedef enum _WTS_INFO_CLASS {
WTSInitialProgram = 0,
WTSApplicationName = 1,
WTSWorkingDirectory = 2,
WTSOEMId = 3,
WTSSessionId = 4,
WTSUserName = 5,
WTSWinStationName = 6,
WTSDomainName = 7,
WTSConnectState = 8,
WTSClientBuildNumber = 9,
WTSClientName = 10,
WTSClientDirectory = 11,
WTSClientProductId = 12,
WTSClientHardwareId = 13,
WTSClientAddress = 14,
WTSClientDisplay = 15,
WTSClientProtocolType = 16,
WTSIdleTime = 17,
WTSLogonTime = 18,
WTSIncomingBytes = 19,
WTSOutgoingBytes = 20,
WTSIncomingFrames = 21,
WTSOutgoingFrames = 22,
WTSClientInfo = 23,
WTSSessionInfo = 24
} WTS_INFO_CLASS;
typedef enum _WTS_CONNECTSTATE_CLASS {
WTSActive,
WTSConnected,
WTSConnectQuery,
WTSShadow,
WTSDisconnected,
WTSIdle,
WTSListen,
WTSReset,
WTSDown,
WTSInit
} WTS_CONNECTSTATE_CLASS;
// session notification message flags
#define WTS_CONSOLE_CONNECT 0x1
#define WTS_CONSOLE_DISCONNECT 0x2
#define WTS_REMOTE_CONNECT 0x3
#define WTS_REMOTE_DISCONNECT 0x4
#define WTS_SESSION_LOGON 0x5
#define WTS_SESSION_LOGOFF 0x6
#define WTS_SESSION_LOCK 0x7
#define WTS_SESSION_UNLOCK 0x8
#define WTS_SESSION_REMOTE_CONTROL 0x9
// WTSRegisterSessionNotifiction flags
#define NOTIFY_FOR_THIS_SESSION 0
#define NOTIFY_FOR_ALL_SESSIONS 1
BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags);
BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd);
BOOL WINAPI WTSQueryUserToken(ULONG SessionId, PHANDLE pToken);
#endif /* _WIN32_WINNT >= 0x0501 */
#if (_WIN32_WINNT >= 0x0500)
typedef struct _WTS_SESSION_INFOW {
DWORD SessionId;
LPWSTR pWinStationName;
WTS_CONNECTSTATE_CLASS State;
} WTS_SESSION_INFOW, *PWTS_SESSION_INFOW;
typedef struct _WTS_SESSION_INFOA {
DWORD SessionId;
LPSTR pWinStationName;
WTS_CONNECTSTATE_CLASS State;
} WTS_SESSION_INFOA, *PWTS_SESSION_INFOA;
#ifdef UNICODE
#define WTS_SESSION_INFO WTS_SESSION_INFOW
#define PWTS_SESSION_INFO PWTS_SESSION_INFOW
#else
#define WTS_SESSION_INFO WTS_SESSION_INFOA
#define PWTS_SESSION_INFO PWTS_SESSION_INFOA
#endif
// WTSWaitSystemEvent local server handle
#define WTS_CURRENT_SERVER_HANDLE 0
#define WTS_CURRENT_SESSION ((DWORD)-1)
// WTSWaitSystemEvent flags
#define WTS_EVENT_NONE 0x00000000
#define WTS_EVENT_CREATE 0x00000001
#define WTS_EVENT_DELETE 0x00000002
#define WTS_EVENT_RENAME 0x00000004
#define WTS_EVENT_CONNECT 0x00000008
#define WTS_EVENT_DISCONNECT 0x00000010
#define WTS_EVENT_LOGON 0x00000020
#define WTS_EVENT_LOGOFF 0x00000040
#define WTS_EVENT_STATECHANGE 0x00000080
#define WTS_EVENT_LICENSE 0x00000100
#define WTS_EVENT_ALL 0x7FFFFFFF
#define WTS_EVENT_FLUSH 0x80000000
BOOL WINAPI WTSQuerySessionInformationA(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass,
LPSTR *ppBuffer, DWORD *pBytesReturned);
BOOL WINAPI WTSQuerySessionInformationW(HANDLE hServer, DWORD SessionId, WTS_INFO_CLASS WTSInfoClass,
LPTSTR *ppBuffer, DWORD *pBytesReturned);
BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD EventMask, DWORD* pEventFlags);
BOOL WINAPI WTSDisconnectSession(HANDLE hServer, DWORD SessionId, BOOL bWait);
BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version,
PWTS_SESSION_INFOW *ppSessionInfo,
PDWORD pCount);
BOOL WINAPI WTSEnumerateSessionsA(HANDLE hServer, DWORD Reserved, DWORD Version,
PWTS_SESSION_INFOA *ppSessionInfo,
PDWORD pCount);
void WINAPI WTSFreeMemory(PVOID pMemory);
#ifdef UNICODE
#define WTSEnumerateSessions WTSEnumerateSessionsW
#define WTSQuerySessionInformation WTSQuerySessionInformationW
#else
#define WTSEnumerateSessions WTSEnumerateSessionsA
#define WTSQuerySessionInformation WTSQuerySessionInformationA
#endif
BOOL WTSSendMessageA(
HANDLE hServer,
DWORD SessionId,
LPSTR pTitle,
DWORD TitleLength,
LPSTR pMessage,
DWORD MessageLength,
DWORD Style,
DWORD Timeout,
DWORD *pResponse,
BOOL bWait
);
BOOL WTSSendMessageW(
HANDLE hServer,
DWORD SessionId,
LPWSTR pTitle,
DWORD TitleLength,
LPWSTR pMessage,
DWORD MessageLength,
DWORD Style,
DWORD Timeout,
DWORD *pResponse,
BOOL bWait
);
#ifdef UNICODE
#define WTSSendMessage WTSSendMessageW
#else
#define WTSSendMessage WTSSendMessageA
#endif
#endif /* _WIN32_WINNT >= 0x0500 */
#ifdef __cplusplus
}
#endif
#endif /* _WTSAPI32_H */

View File

@@ -17,10 +17,10 @@ Test
----
To test this driver run one of the installation programs:
http://www.acc.umu.se/~bosse/ext2fsd/0.70/Ext2Fsd-0.70b2-setup.exe for Windows 10.
http://www.acc.umu.se/~bosse/ext2fsd/0.70/Ext2Fsd-0.70b1-setup-xp.exe for Windows XP - Windows 8.1.
http://www.acc.umu.se/~bosse/ext2fsd/0.70/Ext2Fsd-0.70b2-setup.exe for Windows 8 - Windows 10.
http://www.acc.umu.se/~bosse/ext2fsd/0.70/Ext2Fsd-0.70b1-setup-xp.exe for Windows XP - Windows 7.
If you compile the driver yourself you only need to run the installation program once, then you can
copy your driver over the old in \windows\system32\drivers.
copy your driver file over the old in \windows\system32\drivers.
Now you can read and write ext4 filesystems using the new features metadata checksums and 64-bit
blocknumbers from Windows.
(sorry I can not sign drivers so you need to turn of Windows checking for that during testing)