1
0
mirror of https://github.com/bobranten/Ext4Fsd.git synced 2025-10-30 05:18:31 -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 #ifndef EXT2_SRV_PIPE_H
#define EXT2_SRV_PIPE_H #define EXT2_SRV_PIPE_H
#define EXT2_MGR_SRV "\\\\.\\pipe\\EXT2MGR_PSRV" #define EXT2_MGR_SRV "\\\\.\\pipe\\EXT2MGR_PSRV"
#define PIPE_REQ_MAGIC 0xBAD0BAD8 #define PIPE_REQ_MAGIC 0xBAD0BAD8
#define REQ_BODY_SIZE (4096) #define REQ_BODY_SIZE (4096)
#pragma pack(1) #pragma pack(1)
#pragma warning(disable: 4200) #pragma warning(disable: 4200)
typedef struct _PIPE_REQ { typedef struct _PIPE_REQ {
ULONG magic; ULONG magic;
ULONG flag; ULONG flag;
ULONG cmd; ULONG cmd;
ULONG len; ULONG len;
CHAR data[0]; CHAR data[0];
} PIPE_REQ, *PPIPE_REQ; } PIPE_REQ, *PPIPE_REQ;
#define CMD_QUERY_DRV 0xBAD00001 #define CMD_QUERY_DRV 0xBAD00001
#define CMD_DEFINE_DRV 0xBAD00002 #define CMD_DEFINE_DRV 0xBAD00002
#define CMD_REMOVE_DRV 0xBAD00003 #define CMD_REMOVE_DRV 0xBAD00003
typedef struct _REQ_QUERY_DRV { typedef struct _REQ_QUERY_DRV {
ULONG type; ULONG type;
UCHAR drive; UCHAR drive;
UCHAR result; UCHAR result;
USHORT symlink; USHORT symlink;
char name[0]; char name[0];
} REQ_QUERY_DRV, *PREQ_QUERY_DRV; } REQ_QUERY_DRV, *PREQ_QUERY_DRV;
typedef struct _REQ_DEFINE_DRV { typedef struct _REQ_DEFINE_DRV {
ULONG pid; ULONG pid;
ULONG flags; ULONG flags;
UCHAR drive; UCHAR drive;
UCHAR result; UCHAR result;
USHORT symlink; USHORT symlink;
char name[0]; char name[0];
} REQ_DEFINE_DRV, *PREQ_DEFINE_DRV, } REQ_DEFINE_DRV, *PREQ_DEFINE_DRV,
REQ_REMOVE_DRV, *PREQ_REMOVE_DRV; REQ_REMOVE_DRV, *PREQ_REMOVE_DRV;
#pragma warning(default: 4200) #pragma warning(default: 4200)
#pragma pack() #pragma pack()
#endif // EXT2_SRV_PIPE_H #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_ #ifndef _EXT2_SRV_INCLUDE_
#define _EXT2_SRV_INCLUDE_ #define _EXT2_SRV_INCLUDE_
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include <stdlib.h> #include <stdlib.h>
#include <tchar.h> #include <tchar.h>
#include <windows.h> #include <windows.h>
#include <crtdbg.h> #include <crtdbg.h>
#include <process.h> #include <process.h>
#include <WtsApi32.h> #include <WtsApi32.h>
#include <dbt.h> #include <dbt.h>
#include <shellapi.h> #include <shellapi.h>
/* /*
* global defintions * global defintions
*/ */
#define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0) #define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
#define DEBUG(...) do {} while(0) #define DEBUG(...) do {} while(0)
/* /*
* resources * resources
*/ */
#define IDI_MAINFRAME 101 #define IDI_MAINFRAME 101
/* /*
* global defintions * global defintions
*/ */
#ifdef _DEBUG #ifdef _DEBUG
#define EXT2_BREAK() DebugBreak() #define EXT2_BREAK() DebugBreak()
#define EXT2_ASSERT(X) _ASSERT(X) #define EXT2_ASSERT(X) _ASSERT(X)
#else #else
#define EXT2_BREAK() do {} while(0) #define EXT2_BREAK() do {} while(0)
#define EXT2_ASSERT(X) do {} while(0) #define EXT2_ASSERT(X) do {} while(0)
#endif #endif
/* /*
* log filter level * log filter level
*/ */
#define EXT2_LOG_CONSOLE (0x80000000) /* print to screen */ #define EXT2_LOG_CONSOLE (0x80000000) /* print to screen */
#define EXT2_LOG_ERROR (0x00000001) /* critical messagre */ #define EXT2_LOG_ERROR (0x00000001) /* critical messagre */
#define EXT2_LOG_MESSAGE (0x00000002) /* information */ #define EXT2_LOG_MESSAGE (0x00000002) /* information */
#define EXT2_LOG_DUMP (0x40000002) /* dump and message*/ #define EXT2_LOG_DUMP (0x40000002) /* dump and message*/
void Ext2Log(DWORD ll, char *fn, int ln, char *format, ... ); void Ext2Log(DWORD ll, char *fn, int ln, char *format, ... );
/* /*
* message / error log * message / error log
*/ */
#define MsgDump(F, ...) \ #define MsgDump(F, ...) \
do { \ do { \
Ext2Log(EXT2_LOG_DUMP, __FUNCTION__, __LINE__, \ Ext2Log(EXT2_LOG_DUMP, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \ ##F, ##__VA_ARGS__); \
} while(0) } while(0)
#define MsgLog(F, ...) \ #define MsgLog(F, ...) \
do { \ do { \
Ext2Log(EXT2_LOG_MESSAGE, __FUNCTION__, __LINE__, \ Ext2Log(EXT2_LOG_MESSAGE, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \ ##F, ##__VA_ARGS__); \
} while(0) } while(0)
#define ErrLog(F, ...) \ #define ErrLog(F, ...) \
do { \ do { \
Ext2Log(EXT2_LOG_ERROR, __FUNCTION__, __LINE__, \ Ext2Log(EXT2_LOG_ERROR, __FUNCTION__, __LINE__, \
##F, ##__VA_ARGS__); \ ##F, ##__VA_ARGS__); \
} while(0) } while(0)
/* /*
* structure definitions * structure definitions
*/ */
typedef struct _EXT2_PIPE { typedef struct _EXT2_PIPE {
struct _EXT2_PIPE *l; /* next pipe handle */ struct _EXT2_PIPE *l; /* next pipe handle */
HANDLE p; /* pipe handle */ HANDLE p; /* pipe handle */
HANDLE e; /* event handle */ HANDLE e; /* event handle */
HANDLE q; /* quiting */ HANDLE q; /* quiting */
OVERLAPPED o; /* overlap info */ OVERLAPPED o; /* overlap info */
volatile BOOL s; /* stop flag */ volatile BOOL s; /* stop flag */
} EXT2_PIPE, *PEXT2_PIPE; } EXT2_PIPE, *PEXT2_PIPE;
/* /*
* Ext2Pipe.cpp * Ext2Pipe.cpp
*/ */
DWORD Ext2StartPipeSrv(); DWORD Ext2StartPipeSrv();
VOID Ext2StopPipeSrv(); VOID Ext2StopPipeSrv();
INT Ext2NotifyUser(TCHAR *task, ULONG pid); INT Ext2NotifyUser(TCHAR *task, ULONG pid);
/* /*
* Mount.cpp (native API) * Mount.cpp (native API)
*/ */
BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName); BOOL Ext2EnablePrivilege(LPCTSTR lpszPrivilegeName);
VOID VOID
Ext2DrvNotify(TCHAR drive, int add); Ext2DrvNotify(TCHAR drive, int add);
BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv); BOOL Ext2AssignDrvLetter(TCHAR *dev, TCHAR drv);
BOOL Ext2RemoveDrvLetter(TCHAR drive); BOOL Ext2RemoveDrvLetter(TCHAR drive);
int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL); int Ext2StartUserTask(TCHAR *usr, TCHAR *srv, DWORD sid, BOOL);
INT Ext2StartMgrAsUser(); INT Ext2StartMgrAsUser();
/* /*
* Ext2Srv.cpp * Ext2Srv.cpp
*/ */
VOID Ext2DrivesChangeNotify(BOOLEAN bArrival); VOID Ext2DrivesChangeNotify(BOOLEAN bArrival);
#endif /* _EXT2_SRV_INCLUDE_ */ #endif /* _EXT2_SRV_INCLUDE_ */

View File

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

View File

@@ -1,11 +1,11 @@
BUILD_ALLOW_COMPILER_WARNINGS=1 BUILD_ALLOW_COMPILER_WARNINGS=1
BUILD_ALLOW_LINKER_WARNINGS=1 BUILD_ALLOW_LINKER_WARNINGS=1
# #
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # 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 # 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 # that is shared by all the driver components of the Windows NT DDK
# #
!INCLUDE $(NTMAKEENV)\makefile.def !INCLUDE $(NTMAKEENV)\makefile.def

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,10 +17,10 @@ Test
---- ----
To test this driver run one of the installation programs: 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.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 8.1. 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 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 Now you can read and write ext4 filesystems using the new features metadata checksums and 64-bit
blocknumbers from Windows. blocknumbers from Windows.
(sorry I can not sign drivers so you need to turn of Windows checking for that during testing) (sorry I can not sign drivers so you need to turn of Windows checking for that during testing)