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:
1048
Ext2Srv/Ext2Pipe.cpp
1048
Ext2Srv/Ext2Pipe.cpp
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||||
1156
Ext2Srv/Ext2Srv.cpp
1156
Ext2Srv/Ext2Srv.cpp
File diff suppressed because it is too large
Load Diff
@@ -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_ */
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user