Skip to content

Commit d92244e

Browse files
committed
1.1.3.1763 Update
1 parent e0115e8 commit d92244e

40 files changed

+1040
-38
lines changed

00-Common Headers/KexDll.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@
111111
#define STATUS_DLL_NOT_IN_SYSTEM_ROOT DEFINE_KEX_NTSTATUS(NTSTATUS_ERROR, 11)
112112
#define STATUS_PATH_TOO_SHORT DEFINE_KEX_NTSTATUS(NTSTATUS_ERROR, 12)
113113

114+
#define STATUS_NOT_SAME_OBJECT 0xC00001AC
115+
114116
#define KEXDATA_FLAG_PROPAGATED 1 // Indicates that this process was spawned from a VxKex-enabled parent
115117
#define KEXDATA_FLAG_IFEO_OPTIONS_PRESENT 2 // Indicates that this process has VxKex options set in IFEO
116118
#define KEXDATA_FLAG_MSIEXEC 4 // Indicates that this process is %SystemRoot%\system32\msiexec.exe
@@ -325,6 +327,14 @@ typedef PVOID TYPEDEF_TYPE_NAME(DLL_DIRECTORY_COOKIE);
325327

326328
#pragma endregion
327329

330+
#pragma region Nt* functions
331+
332+
KEXAPI NTSTATUS NTAPI NtCompareObjects(
333+
IN HANDLE FirstObjectHandle,
334+
IN HANDLE SecondObjectHandle);
335+
336+
#pragma endregion
337+
328338
#pragma region Kex* functions
329339

330340
KEXAPI NTSTATUS NTAPI KexInitializePropagation(

00-Common Headers/KxBase.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
// undocumented STARTUPINFO flag
4040
#define STARTF_HASSHELLDATA 0x400
4141

42+
#define ERROR_NOT_SAME_OBJECT 1656L
4243
#define APPMODEL_ERROR_NO_PACKAGE 15700L
4344
#define APPMODEL_ERROR_NO_APPLICATION 15703L
4445

@@ -577,6 +578,28 @@ typedef enum _FILE_INFO_BY_NAME_CLASS {
577578
MaximumFileInfoByNameClass
578579
} TYPEDEF_TYPE_NAME(FILE_INFO_BY_NAME_CLASS);
579580

581+
typedef struct PACKAGE_VERSION {
582+
union {
583+
UINT64 Version;
584+
struct {
585+
USHORT Revision;
586+
USHORT Build;
587+
USHORT Minor;
588+
USHORT Major;
589+
} DUMMYSTRUCTNAME;
590+
} DUMMYUNIONNAME;
591+
} TYPEDEF_TYPE_NAME(PACKAGE_VERSION);
592+
593+
typedef struct PACKAGE_ID {
594+
UINT32 reserved;
595+
UINT32 processorArchitecture;
596+
PACKAGE_VERSION version;
597+
PWSTR name;
598+
PWSTR publisher;
599+
PWSTR resourceId;
600+
PWSTR publisherId;
601+
} TYPEDEF_TYPE_NAME(PACKAGE_ID);
602+
580603
#pragma endregion
581604

582605
#if defined(KEX_ENV_WIN32)
@@ -699,6 +722,10 @@ KXBASEAPI BOOL WINAPI GetProcessMitigationPolicy(
699722
OUT PVOID Buffer,
700723
IN SIZE_T BufferCb);
701724

725+
KXBASEAPI BOOL WINAPI IsProcessCritical(
726+
IN HANDLE ProcessHandle,
727+
OUT PBOOL Critical);
728+
702729
//
703730
// file.c
704731
//

00-Common Headers/KxCom.h

Lines changed: 115 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -643,9 +643,118 @@ KXCOMAPI HRESULT WINAPI WindowsPromoteStringBuffer(
643643
// firefoxpatch.c
644644
//
645645

646-
HRESULT WINAPI Ext_CoCreateInstance(
647-
IN REFCLSID rclsid,
648-
IN LPUNKNOWN pUnkOuter,
649-
IN DWORD dwClsContext,
650-
IN REFIID riid,
651-
OUT LPVOID *ppv);
646+
KXCOMAPI HRESULT WINAPI Ext_CoCreateInstance(
647+
IN REFCLSID RefCLSID,
648+
IN LPUNKNOWN OuterUnknown,
649+
IN ULONG ClassContext,
650+
IN REFIID RefIID,
651+
OUT PPVOID Instance);
652+
653+
KXCOMAPI HRESULT WINAPI Ext_CoCreateInstanceEx(
654+
IN REFCLSID RefCLSID,
655+
IN LPUNKNOWN OuterUnknown,
656+
IN ULONG ClassContext,
657+
IN COSERVERINFO *ServerInfo,
658+
IN ULONG NumberOfInterfaces,
659+
IN OUT MULTI_QI *Interfaces);
660+
661+
KXCOMAPI HRESULT WINAPI Ext_CoGetClassObject(
662+
IN REFCLSID RefCLSID,
663+
IN ULONG ClassContext,
664+
IN COSERVERINFO *ServerInfo OPTIONAL,
665+
IN REFIID RefIID,
666+
OUT PPVOID ClassObject);
667+
668+
typedef enum _OLE_TLS_FLAGS {
669+
OLETLS_LOCALTID = 0x01, // This TID is in the current process.
670+
OLETLS_UUIDINITIALIZED = 0x02, // This Logical thread is init'd.
671+
OLETLS_INTHREADDETACH = 0x04, // This is in thread detach. Needed
672+
// due to NT's special thread detach
673+
// rules.
674+
OLETLS_CHANNELTHREADINITIALZED = 0x08, // This channel has been init'd
675+
OLETLS_WOWTHREAD = 0x10, // This thread is a 16-bit WOW thread.
676+
OLETLS_THREADUNINITIALIZING = 0x20, // This thread is in CoUninitialize.
677+
OLETLS_DISABLE_OLE1DDE = 0x40, // This thread can't use a DDE window.
678+
OLETLS_APARTMENTTHREADED = 0x80, // This is an STA apartment thread
679+
OLETLS_MULTITHREADED = 0x100, // This is an MTA apartment thread
680+
OLETLS_IMPERSONATING = 0x200, // This thread is impersonating
681+
OLETLS_DISABLE_EVENTLOGGER = 0x400, // Prevent recursion in event logger
682+
OLETLS_INNEUTRALAPT = 0x800, // This thread is in the NTA
683+
OLETLS_DISPATCHTHREAD = 0x1000, // This is a dispatch thread
684+
OLETLS_HOSTTHREAD = 0x2000, // This is a host thread
685+
OLETLS_ALLOWCOINIT = 0x4000, // This thread allows inits
686+
OLETLS_PENDINGUNINIT = 0x8000, // This thread has pending uninit
687+
OLETLS_FIRSTMTAINIT = 0x10000, // First thread to attempt an MTA init
688+
OLETLS_FIRSTNTAINIT = 0x20000, // First thread to attempt an NTA init
689+
OLETLS_APTINITIALIZING = 0x40000 // Apartment Object is initializing
690+
} TYPEDEF_TYPE_NAME(OLE_TLS_FLAGS);
691+
692+
typedef struct _SWindowData {
693+
HWND Window;
694+
ULONG FirstMessage;
695+
ULONG LastMessage;
696+
} TYPEDEF_TYPE_NAME(SWindowData);
697+
698+
typedef struct _CAptCallCtrl {
699+
IMessageFilter *MessageFilter;
700+
BOOL InMessageFilter;
701+
PVOID TopCML; // original datatype: CCliModalLoop
702+
SWindowData WindowData[2];
703+
} TYPEDEF_TYPE_NAME(CAptCallCtrl);
704+
705+
// NtCurrentTeb()->ReservedForOle points to one of these structures.
706+
// See tagSOleTlsData in oletls.h (nt5src) for descriptions of values.
707+
// The full definition of this structure can be found in the public symbol
708+
// files for ole32.dll (this one is incomplete, I've replaced most of the
709+
// pointers with PVOIDs and there is stuff missing from the end)
710+
typedef struct _SOleTlsData {
711+
PVOID pvThreadBase;
712+
PVOID pSmAllocator;
713+
ULONG dwApartmentID;
714+
ULONG dwFlags; // OLETLS_*
715+
LONG TlsMapIndex;
716+
PVOID *ppTlsSlot;
717+
ULONG cComInits;
718+
ULONG cOleInits;
719+
ULONG cCalls;
720+
PVOID pCallInfo;
721+
PVOID pFreeAsyncCall;
722+
PVOID pFreeClientCall;
723+
PVOID pObjServer;
724+
ULONG dwTIDCaller;
725+
PVOID pCurrentCtx;
726+
PVOID pEmptyCtx;
727+
PVOID pNativeCtx;
728+
ULONGLONG ContextId; // This is 64-bit even on the 32-bit version of ole32.dll
729+
PVOID pNativeApt;
730+
IUnknown *pCallContext;
731+
PVOID pCtxCall;
732+
PVOID pPS;
733+
PVOID pvPendingCallsFront;
734+
PVOID pvPendingCallsBack;
735+
CAptCallCtrl *pCallCtrl; // Initialized by CAptCallCtrl::CAptCallCtrl in ole32.dll
736+
PVOID pTopSCS;
737+
IMessageFilter *pMsgFilter;
738+
HWND hwndSTA;
739+
LONG cORPCNestingLevel;
740+
ULONG cDebugData;
741+
GUID LogicalThreadId;
742+
PVOID hThread;
743+
PVOID hRevert;
744+
IUnknown *pAsyncRelease;
745+
HWND hwndDdeServer;
746+
HWND hwndDdeClient;
747+
ULONG cServeDdeObjects;
748+
PVOID pSTALSvrsFront;
749+
HWND hwndClip;
750+
IDataObject *pDataObjClip;
751+
ULONG dwClipSeqNum;
752+
ULONG fIsClipWrapper;
753+
IUnknown *punkState;
754+
ULONG cCallCancellation;
755+
ULONG cAsyncSends;
756+
PVOID pAsyncCallList;
757+
PVOID pSurrogateList;
758+
PVOID pRWLockTlsEntry;
759+
//...
760+
} TYPEDEF_TYPE_NAME(SOleTlsData);

00-Common Headers/NtDll.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,7 +1602,12 @@ typedef struct _TEB {
16021602
// to me and there were shitloads of structures to copy so I gave up.
16031603
PVOID ActivationContextStackPointer;
16041604

1605+
#ifdef _M_X64
16051606
UCHAR SpareBytes[0x18];
1607+
#else
1608+
UCHAR SpareBytes[0x24];
1609+
#endif
1610+
16061611
ULONG TxFsContext;
16071612

16081613
GDI_TEB_BATCH GdiTebBatch;
@@ -2927,12 +2932,28 @@ typedef struct _LDR_RESOURCE_INFO {
29272932
ULONG_PTR Language;
29282933
} TYPEDEF_TYPE_NAME(LDR_RESOURCE_INFO);
29292934

2935+
typedef enum _EVENT_INFORMATION_CLASS {
2936+
EventBasicInformation
2937+
} TYPEDEF_TYPE_NAME(EVENT_INFORMATION_CLASS);
2938+
2939+
typedef struct _EVENT_BASIC_INFORMATION {
2940+
EVENT_TYPE EventType;
2941+
LONG EventState;
2942+
} TYPEDEF_TYPE_NAME(EVENT_BASIC_INFORMATION);
2943+
29302944
#pragma endregion
29312945

29322946
STATIC PKUSER_SHARED_DATA SharedUserData = (PKUSER_SHARED_DATA) 0x7FFE0000;
29332947

29342948
#pragma region Nt* function declarations
29352949

2950+
NTSYSCALLAPI NTSTATUS NTAPI NtQueryEvent(
2951+
IN HANDLE EventHandle,
2952+
IN EVENT_INFORMATION_CLASS EventInformationClass,
2953+
OUT PVOID EventInformation,
2954+
IN ULONG EventInformationLength,
2955+
OUT PULONG ReturnLength OPTIONAL);
2956+
29362957
NTSYSCALLAPI NTSTATUS NTAPI NtQueryObject(
29372958
IN HANDLE ObjectHandle,
29382959
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,

00-Common Headers/vautogen.h

0 Bytes
Binary file not shown.
461 Bytes
Binary file not shown.

00-Documentation/Changelog.txt

400 Bytes
Binary file not shown.

01-Development Utilities/vautogen/vautogen.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ HeaderFile=..\..\00-Common Headers\vautogen.h
33
MajorVersion=1
44
MinorVersion=1
55
PatchLevel=3
6-
BuildNumber=1584
6+
BuildNumber=1763

01-Extended DLLs/KxBase/appmodel.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,37 @@ KXBASEAPI LONG WINAPI AppPolicyGetThreadInitializationType(
209209

210210
*InitializationType = AppPolicyThreadInitializationType_None;
211211
return ERROR_SUCCESS;
212+
}
213+
214+
KXBASEAPI LONG WINAPI PackageIdFromFullName(
215+
IN PCWSTR PackageFullName,
216+
IN CONST ULONG Flags,
217+
IN OUT PULONG BufferLength,
218+
OUT BYTE *Buffer OPTIONAL)
219+
{
220+
if (!PackageFullName || !BufferLength || *BufferLength && !Buffer) {
221+
return ERROR_INVALID_PARAMETER;
222+
}
223+
224+
*BufferLength = 0;
225+
226+
return ERROR_NOT_FOUND;
227+
}
228+
229+
KXBASEAPI LONG WINAPI GetPackagePath(
230+
IN PCPACKAGE_ID PackageID,
231+
CONST ULONG Reserved,
232+
IN OUT PULONG PathLength,
233+
OUT PWSTR Path OPTIONAL)
234+
{
235+
if (!PackageID || Reserved != 0 || !PathLength || *PathLength != 0 && !Path) {
236+
return ERROR_INVALID_PARAMETER;
237+
}
238+
239+
if (*PathLength != 0) {
240+
Path[0] = '\0';
241+
}
242+
243+
*PathLength = 0;
244+
return ERROR_SUCCESS;
212245
}

01-Extended DLLs/KxBase/file.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,98 @@ KXBASEAPI BOOL WINAPI GetFileInformationByName(
239239

240240
RtlSetLastWin32Error(ERROR_NOT_SUPPORTED);
241241
return FALSE;
242+
}
243+
244+
KXBASEAPI BOOL WINAPI Ext_DeviceIoControl(
245+
IN HANDLE DeviceHandle,
246+
IN ULONG IoControlCode,
247+
IN PVOID InBuffer OPTIONAL,
248+
IN ULONG InBufferSize,
249+
OUT PVOID OutBuffer OPTIONAL,
250+
IN ULONG OutBufferSize,
251+
OUT PULONG BytesReturned OPTIONAL,
252+
IN OUT LPOVERLAPPED Overlapped OPTIONAL)
253+
{
254+
ULONG DummyBytesReturned;
255+
256+
//
257+
// Microsoft's documentation lists the BytesReturned (lpBytesReturned) parameter
258+
// as being optional. However, on Windows 7, the BytesReturned parameter is only
259+
// really optional when the Overlapped parameter is non-null.
260+
//
261+
// To summarize:
262+
//
263+
// Parameter combination | Result (Win7) | Result (Win8)
264+
// --------------------------------------------+------------------+---------------
265+
// Overlapped == NULL && BytesReturned != NULL | OK | OK
266+
// Overlapped == NULL && BytesReturned == NULL | Access violation | OK
267+
// Overlapped != NULL && BytesReturned == NULL | OK | OK
268+
// Overlapped != NULL && BytesReturned != NULL | OK | OK
269+
//
270+
// This is a discrepancy in behavior which was silently changed in Win8. An
271+
// additional check was added to the branch of code which is executed when
272+
// Overlapped == NULL.
273+
//
274+
// The fix is very simple, as you can see:
275+
//
276+
277+
if (BytesReturned == NULL) {
278+
BytesReturned = &DummyBytesReturned;
279+
}
280+
281+
return DeviceIoControl(
282+
DeviceHandle,
283+
IoControlCode,
284+
InBuffer,
285+
InBufferSize,
286+
OutBuffer,
287+
OutBufferSize,
288+
BytesReturned,
289+
Overlapped);
290+
}
291+
292+
KXBASEAPI BOOL WINAPI Ext_ReadFile(
293+
IN HANDLE FileHandle,
294+
OUT PVOID Buffer,
295+
IN ULONG NumberOfBytesToRead,
296+
OUT PULONG NumberOfBytesRead OPTIONAL,
297+
IN OUT LPOVERLAPPED Overlapped OPTIONAL)
298+
{
299+
ULONG DummyNumberOfBytesRead;
300+
301+
// See comment in Ext_DeviceIoControl for why this is necessary.
302+
// They changed the behavior of ReadFile in Windows 8 as well.
303+
if (NumberOfBytesRead == NULL) {
304+
NumberOfBytesRead = &DummyNumberOfBytesRead;
305+
}
306+
307+
return ReadFile(
308+
FileHandle,
309+
Buffer,
310+
NumberOfBytesToRead,
311+
NumberOfBytesRead,
312+
Overlapped);
313+
}
314+
315+
KXBASEAPI BOOL WINAPI Ext_WriteFile(
316+
IN HANDLE FileHandle,
317+
IN PCVOID Buffer,
318+
IN ULONG NumberOfBytesToWrite,
319+
OUT PULONG NumberOfBytesWritten OPTIONAL,
320+
IN OUT LPOVERLAPPED Overlapped OPTIONAL)
321+
{
322+
ULONG DummyNumberOfBytesWritten;
323+
324+
// See comment in Ext_DeviceIoControl for why this is necessary.
325+
// They changed the behavior of WriteFile in Windows 8 as well.
326+
if (NumberOfBytesWritten == NULL) {
327+
NumberOfBytesWritten = &DummyNumberOfBytesWritten;
328+
}
329+
330+
return WriteFile(
331+
FileHandle,
332+
Buffer,
333+
NumberOfBytesToWrite,
334+
NumberOfBytesWritten,
335+
Overlapped);
242336
}

0 commit comments

Comments
 (0)