1
0
mirror of https://github.com/bobranten/Ext4Fsd.git synced 2025-10-29 21: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 */