Tatsache, war mir gar nicht mehr bewusst. Immer noch nicht c&p fertig (aber es sollte erkennbar sein was zu ändern ist):
Code:
DWORD ropChain[] = {		// EIP = NtWaitForSingleObject
		(DWORD)&NtClose,						// Return address 
		(DWORD)duplicatedProcessHandle,			// Own process handle
		FALSE,									// Alertable
		NULL,									// Timeout
		// EIP = NtClose
		(DWORD)&NtSetInformationFile,			// Return address
		(DWORD)duplicatedProcessHandle,			// Own process handle
		// EIP = NtSetInformationFile
		(DWORD)&NtClose,						// Return addr
		(DWORD)duplicatedFileHandle,			// File handle
		(DWORD)addressForROP,					// Pointer to IoStatusBlock
												// See above.
		(DWORD)addressForROP,					// Pointer to FileInformation
												// Just needs a TRUE value
		sizeof(FILE_DISPOSITION_INFORMATION),	// Length
		FileDispositionInformation,				// FILE_INFORMATION_CLASS
		// EIP = NtClose
		(DWORD)&RtlExitUserThread,				// Ret. addr
		(DWORD)duplicatedFileHandle,			// File handle
		// EIP = RtlExitUserThread
		STATUS_CANNOT_DELETE,					// Shutdown reason
	};
Das mit den Calling-conventionen stimmt nicht unbedingt. Ich hab es ehrlich gesagt nicht ausprobiert aber vielleicht gibt es
Code:
mov rcx, [rsp + 8]
ret

pop rdx 

RET
und ähnliches (natürlich auch für r8 & r9) womit es dann doch möglich wäre.