[VMWINST] Fix amd64 build

[NTDLL] add missing amd64 specific exports
[MSVCRT*] Fix mangled c++ exports for amd64
[OLEAUT32] Add amd64 adm stub for call_method, fix MSVC/amd64 build
[RICHED20] Fix MSVC thiscall wrapper
[RPCRT4] add amd64 specific asm
[KSFILTER] Add c++ aliases, use dummy KeSaveFloatingPointState and KeRestoreFloatingPointState on non-x86 builds
[KMIXER] Fix a broken DPRINT
[PSEH] Priorize native SEH over dummy SEH

svn path=/trunk/; revision=53399
This commit is contained in:
Timo Kreuzer
2011-08-23 08:58:15 +00:00
parent 9564801ea8
commit fe7e695657
13 changed files with 877 additions and 714 deletions
+4 -1
View File
@@ -78,7 +78,7 @@ DetectVMware(int *Version)
__asm__ __volatile__("inl %%dx, %%eax"
: "=a" (ver), "=b" (magic)
: "0" (0x564d5868), "d" (0x5658), "c" (0xa));
#elif defined(_MSC_VER)
#elif defined(_MSC_VER) && defined(_M_IX86)
__asm
{
push ebx
@@ -90,6 +90,9 @@ DetectVMware(int *Version)
mov [magic], ebx
pop ebx
}
#elif defined(_MSC_VER) && defined(_M_AMD64)
DPRINT1("DetectVMware stub\n");
return FALSE;
#else
#error TODO
#endif
+2 -1
View File
@@ -1296,7 +1296,7 @@
;@ cdecl -private -arch=i386 _CIpow()
;@ cdecl _CIsin
;@ cdecl _CIsqrt
;@ stdcall -arch=x86_64 __C_specific_handler(ptr long ptr ptr)
@ cdecl -arch=x86_64 __C_specific_handler(ptr long ptr ptr)
@ cdecl __isascii(long)
@ cdecl __iscsym(long)
@ cdecl __iscsymf(long)
@@ -1321,6 +1321,7 @@
@ cdecl _itoa(long ptr long)
@ cdecl _itow(long ptr long)
@ cdecl _lfind(ptr ptr ptr long ptr)
@ cdecl -arch=x86_64 _local_unwind()
@ cdecl _ltoa(long ptr long)
@ cdecl _ltow(long ptr long)
@ cdecl _memccpy(ptr ptr long long)
+9 -2
View File
@@ -43,9 +43,11 @@
@ cdecl -i386 -norelay ??_Gbad_cast@@UAEPAXI@Z(long) __thiscall_MSVCRT_bad_cast_scalar_dtor
@ cdecl -i386 -norelay ??_Gbad_typeid@@UAEPAXI@Z(long) __thiscall_MSVCRT_bad_typeid_scalar_dtor
@ cdecl -i386 -norelay ??_Gexception@@UAEPAXI@Z(long) __thiscall_MSVCRT_exception_scalar_dtor
@ cdecl ??_U@YAPAXI@Z(long) MSVCRT_operator_new
@ cdecl -arch=win32 ??_U@YAPAXI@Z(long) MSVCRT_operator_new
@ cdecl -arch=win64 ??_U@YAPEAX_K@Z(long) MSVCRT_operator_new
# @ cdecl ??_U@YAPAXIHPBDH@Z(long long str long) MSVCRT_operator_new_dbg
@ cdecl ??_V@YAXPAX@Z(ptr) MSVCRT_operator_delete
@ cdecl -arch=win32 ??_V@YAXPAX@Z(ptr) MSVCRT_operator_delete
@ cdecl -arch=win64 ??_V@YAXPEAX@Z(ptr) MSVCRT_operator_delete
@ cdecl ?_query_new_handler@@YAP6AHI@ZXZ() MSVCRT__query_new_handler
@ cdecl ?_query_new_mode@@YAHXZ() MSVCRT__query_new_mode
@ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) MSVCRT__set_new_handler
@@ -1190,7 +1192,9 @@
@ cdecl fgetwc(ptr)
@ cdecl fgetws(ptr long ptr)
@ cdecl floor(double)
@ cdecl -arch=x86_64 floorf(long)
@ cdecl fmod(double double)
@ cdecl -arch=x86_64 fmodf(long)
@ cdecl fopen(str str)
# @ cdecl fopen_s(ptr str str)
@ varargs fprintf(ptr str)
@@ -1278,6 +1282,7 @@
@ cdecl modf(double ptr)
@ cdecl perror(str)
@ cdecl pow(double double)
@ cdecl -arch=x86_64 powf(long)
@ varargs printf(str)
# stub printf_s
@ cdecl putc(long ptr)
@@ -1302,10 +1307,12 @@
@ cdecl setvbuf(ptr str long long)
@ cdecl signal(long long)
@ cdecl sin(double)
@ cdecl -arch=x86_64 sinf(long)
@ cdecl sinh(double)
@ varargs sprintf(ptr str)
# @ varargs sprintf_s(ptr long str)
@ cdecl sqrt(double)
@ cdecl -arch=x86_64 sqrtf(long)
@ cdecl srand(long)
@ varargs sscanf(str str)
# @ varargs sscanf_s(str str)
+6 -4
View File
@@ -77,8 +77,10 @@
@ stub ??1streambuf@@UAE@XZ #
@ stub ??1strstream@@UAE@XZ #
@ stub ??1strstreambuf@@UAE@XZ #
@ cdecl ??2@YAPAXI@Z(long) MSVCRT_operator_new
@ cdecl ??3@YAXPAX@Z(ptr) MSVCRT_operator_delete
@ cdecl -arch=win32 ??2@YAPAXI@Z(long) MSVCRT_operator_new
@ cdecl -arch=win64 ??2@YAPEAX_K@Z(double) MSVCRT_operator_new
@ cdecl -arch=win32 ??3@YAXPAX@Z(ptr) MSVCRT_operator_delete
@ cdecl -arch=win64 ??3@YAXPEAX@Z(ptr) MSVCRT_operator_delete
@ stub ??4Iostream_init@@QAEAAV0@ABV0@@Z #
@ stub ??4filebuf@@QAEAAV0@ABV0@@Z #
@ stub ??4fstream@@QAEAAV0@AAV0@@Z #
@@ -457,7 +459,7 @@
@ extern _HUGE
@ cdecl _XcptFilter(long ptr)
@ cdecl -i386 __CxxFrameHandler(ptr ptr ptr ptr)
@ stdcall __CxxLongjmpUnwind(ptr)
@ stdcall -i386 __CxxLongjmpUnwind(ptr)
@ cdecl __STRINGTOLD(ptr ptr str long)
@ extern __argc
@ extern __argv
@@ -596,7 +598,7 @@
@ cdecl _fsopen(str str long)
@ cdecl _fstat(long ptr)
@ cdecl _ftime(ptr)
@ cdecl -ret64 _ftol()
@ cdecl -arch=i386 -ret64 _ftol()
@ cdecl _fullpath(ptr str long)
@ cdecl _futime(long ptr)
@ cdecl _gcvt(double long str)
File diff suppressed because it is too large Load Diff
+10
View File
@@ -1,6 +1,15 @@
#include <asm.inc>
#ifdef _M_AMD64
.code64
PUBLIC call_method
call_method:
int 2ch
ret
#else
.code32
PUBLIC _call_method
@@ -26,5 +35,6 @@ cm1:
pop esi
pop ebp
ret
#endif
END
+23 -18
View File
@@ -136,41 +136,41 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) {
DWORD xsize;
TRACE("...%s...\n",debugstr_guid(riid));
*pUnk = NULL;
hres = xbuf_get(buf,(LPBYTE)&xsize,sizeof(xsize));
if (hres) {
ERR("xbuf_get failed\n");
return hres;
}
if (xsize == 0) return S_OK;
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
if (hres) {
ERR("Stream create failed %x\n",hres);
return hres;
}
hres = IStream_Write(pStm,buf->base+buf->curoff,xsize,&res);
if (hres) {
ERR("stream write %x\n",hres);
return hres;
}
memset(&seekto,0,sizeof(seekto));
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
if (hres) {
ERR("Failed Seek %x\n",hres);
return hres;
}
hres = CoUnmarshalInterface(pStm,riid,(LPVOID*)pUnk);
if (hres) {
ERR("Unmarshalling interface %s failed with %x\n",debugstr_guid(riid),hres);
return hres;
}
IStream_Release(pStm);
return xbuf_skip(buf,xsize);
}
@@ -200,25 +200,25 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) {
hres = E_FAIL;
TRACE("...%s...\n",debugstr_guid(riid));
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
if (hres) {
ERR("Stream create failed %x\n",hres);
goto fail;
}
hres = CoMarshalInterface(pStm,riid,pUnk,0,NULL,0);
if (hres) {
ERR("Marshalling interface %s failed with %x\n", debugstr_guid(riid), hres);
goto fail;
}
hres = IStream_Stat(pStm,&ststg,STATFLAG_NONAME);
if (hres) {
ERR("Stream stat failed\n");
goto fail;
}
tempbuf = HeapAlloc(GetProcessHeap(), 0, ststg.cbSize.u.LowPart);
memset(&seekto,0,sizeof(seekto));
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
@@ -226,22 +226,22 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) {
ERR("Failed Seek %x\n",hres);
goto fail;
}
hres = IStream_Read(pStm,tempbuf,ststg.cbSize.u.LowPart,&res);
if (hres) {
ERR("Failed Read %x\n",hres);
goto fail;
}
xsize = ststg.cbSize.u.LowPart;
xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize));
hres = xbuf_add(buf,tempbuf,ststg.cbSize.u.LowPart);
HeapFree(GetProcessHeap(),0,tempbuf);
IStream_Release(pStm);
return hres;
fail:
xsize = 0;
xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize));
@@ -385,8 +385,13 @@ typedef struct _TMAsmProxy {
#include "poppack.h"
#else /* __i386__ */
#ifdef _MSC_VER
#pragma message("You need to implement stubless proxies for your architecture")
#else
# warning You need to implement stubless proxies for your architecture
#endif
typedef struct _TMAsmProxy {
char a;
} TMAsmProxy;
#endif
@@ -1010,7 +1015,7 @@ deserialize_param(
ITypeInfo_ReleaseTypeAttr(tinfo2, tattr);
ITypeInfo_Release(tinfo2);
}
/* read it in all cases, we need to know if we have
/* read it in all cases, we need to know if we have
* NULL pointer or not.
*/
hres = xbuf_get(buf,(LPBYTE)&cookie,sizeof(cookie));
@@ -1862,7 +1867,7 @@ TMStubImpl_AddRef(LPRPCSTUBBUFFER iface)
{
TMStubImpl *This = (TMStubImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(ref before=%u)\n", This, refCount - 1);
return refCount;
@@ -52,11 +52,9 @@ DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmGetContext,4)
DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxImmReleaseContext,8)
DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth,8)
#define STDCALL(func) __stdcall_ ## func
#define DEFINE_STDCALL_WRAPPER(num,func,args) \
__declspec(naked) void __stdcall __stdcall_##func(_tag_##func p1) \
{ \
__asm pop eax \
__asm pop eax \
__asm pop ecx \
__asm push eax \
+115 -1
View File
@@ -1,6 +1,7 @@
#include <asm.inc>
#ifdef _M_IX86
.code32
EXTERN _ndr_client_call:PROC
@@ -28,5 +29,118 @@ _call_stubless_func:
mov ecx, [esp] /* return address */
add esp, edx
jmp ecx
#else
.code64
END
EXTERN ndr_client_call:PROC
PUBLIC call_stubless_func
FUNC call_stubless_func
mov [rsp + 8], rcx
.SAVEREG rcx, 8
mov [rsp + 10h], rdx
.SAVEREG rdx, 10h
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 38h
.ALLOCSTACK 38h
.ENDPROLOG
lea r8, [rsp +38h + 8] /* &This */
mov rcx, [rcx] /* This->lpVtbl */
mov rcx, [rcx - 10h] /* MIDL_STUBLESS_PROXY_INFO */
mov rdx, [rcx + 10h] /* info->FormatStringOffset */
movzx rdx, word ptr [rdx+r10*2] /* FormatStringOffset[index] */
add rdx, [rcx + 8] /* info->ProcFormatString + offset */
mov rcx, [rcx] /* info->pStubDesc */
movaps [rsp + 20h], xmm1
movaps [rsp + 28h], xmm2
movaps [rsp + 30h], xmm3
lea r9, [rsp + 18h] /* fpu_args */
call ndr_client_call
add rsp, 38h
ret
ENDFUNC call_stubless_func
PUBLIC call_server_func
FUNC call_server_func
push rbp
.PUSHREG rbp
mov rbp, rsp
push rsi
.PUSHREG rsi
push rdi
.PUSHREG rdi
.ENDPROLOG
mov rax, rcx /* function to call */
mov rcx, 32 /* allocate max(32,stack_size) bytes of stack space */
cmp r8, rcx
cmovg rcx, r8
sub rsp, rcx
and rsp, NOT 15
mov rcx, r8
shr rcx, 3
mov rdi, rsp
mov rsi, rdx
rep movsq /* copy arguments */
mov rcx, [rsp]
mov rdx, [rsp + 8]
mov r8, [rsp + 16]
mov r9, [rsp + 24]
movd xmm0, rcx
movd xmm1, rdx
movd xmm2, r8
movd xmm3, r9
call rax
lea rsp, [rbp - 16] /* restore stack */
pop rdi
pop rsi
pop rbp
ret
ENDFUNC call_server_func
PUBLIC NdrClientCall2
FUNC NdrClientCall2
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 28h
.ALLOCSTACK 28h
.ENDPROLOG
lea r8, [rsp + 28h + 18h]
xor r9, r9
call ndr_client_call
add rsp, 28h
ret
ENDFUNC NdrClientCall2
EXTERN ndr_async_client_call:PROC
PUBLIC NdrAsyncClientCall
FUNC NdrAsyncClientCall
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 28h
.ALLOCSTACK 28h
.ENDPROLOG
lea r8, [rsp + 28h + 18h]
call ndr_async_client_call
add rsp, 28h
ret
ENDFUNC NdrAsyncClientCall
#endif
END
+17 -1
View File
@@ -8,11 +8,11 @@ EXTERN &orig:PROC
ALIAS <&alias> = <&orig>
ENDM
#ifdef _M_IX86
PUBLIC ?NonDelegatedRelease@CBaseUnknown@@UAGKXZ
?NonDelegatedRelease@CBaseUnknown@@UAGKXZ:
jmp _IIndirectedUnknown_fnRelease@4
DEFINE_ALIAS ??0CBaseUnknown@@QAE@ABU_GUID@@PAUIUnknown@@@Z, @CBaseUnknown_ConstructorWithGUID@16
DEFINE_ALIAS ??0CBaseUnknown@@QAE@PAUIUnknown@@@Z, @CBaseUnknown_Constructor@12
DEFINE_ALIAS ??1CBaseUnknown@@UAE@XZ, @CBaseUnknown_DefaultDestructor@8
@@ -22,5 +22,21 @@ DEFINE_ALIAS ?IndirectedQueryInterface@CBaseUnknown@@UAGJABU_GUID@@PAPAX@Z, _IIn
DEFINE_ALIAS ?IndirectedRelease@CBaseUnknown@@UAGKXZ, _IIndirectedUnknown_fnRelease@4
DEFINE_ALIAS ?NonDelegatedAddRef@CBaseUnknown@@UAGKXZ, _INonDelegatedUnknown_fnAddRef@4
DEFINE_ALIAS ?NonDelegatedQueryInterface@CBaseUnknown@@UAGJABU_GUID@@PAPAX@Z, _INonDelegatedUnknown_fnQueryInterface@12
#else
EXTERN IIndirectedUnknown_fnRelease:PROC
PUBLIC ?NonDelegatedRelease@CBaseUnknown@@UAGKXZ
?NonDelegatedRelease@CBaseUnknown@@UAGKXZ:
jmp IIndirectedUnknown_fnRelease
DEFINE_ALIAS ??0CBaseUnknown@@QAE@ABU_GUID@@PAUIUnknown@@@Z, CBaseUnknown_ConstructorWithGUID
DEFINE_ALIAS ??0CBaseUnknown@@QAE@PAUIUnknown@@@Z, CBaseUnknown_Constructor
DEFINE_ALIAS ??1CBaseUnknown@@UAE@XZ, CBaseUnknown_DefaultDestructor
DEFINE_ALIAS ??_FCBaseUnknown@@QAEXXZ, CBaseUnknown_Destructor
DEFINE_ALIAS ?IndirectedAddRef@CBaseUnknown@@UAGKXZ, IIndirectedUnknown_fnAddRef
DEFINE_ALIAS ?IndirectedQueryInterface@CBaseUnknown@@UAGJABU_GUID@@PAPAX@Z, IIndirectedUnknown_fnQueryInterface
DEFINE_ALIAS ?IndirectedRelease@CBaseUnknown@@UAGKXZ, IIndirectedUnknown_fnRelease
DEFINE_ALIAS ?NonDelegatedAddRef@CBaseUnknown@@UAGKXZ, INonDelegatedUnknown_fnAddRef
DEFINE_ALIAS ?NonDelegatedQueryInterface@CBaseUnknown@@UAGJABU_GUID@@PAPAX@Z, INonDelegatedUnknown_fnQueryInterface
#endif
END
@@ -32,3 +32,8 @@ KMixAllocateDeviceHeader(
NTSTATUS
CreatePin(
IN PIRP Irp);
#ifndef _M_IX86
#define KeSaveFloatingPointState(x) ((void)(x), STATUS_SUCCESS)
#define KeRestoreFloatingPointState(x) ((void)0)
#endif
@@ -76,7 +76,7 @@ PerformSampleRateConversion(
State = src_new(SRC_SINC_FASTEST, NumChannels, &error);
if (!State)
{
DPRINT1("KeSaveFloatingPointState failed with %x\n", Status);
DPRINT1("src_new failed with %x\n", error);
KeRestoreFloatingPointState(&FloatSave);
ExFreePool(FloatIn);
ExFreePool(FloatOut);
+13 -13
View File
@@ -23,19 +23,7 @@
#ifndef KJK_PSEH2_H_
#define KJK_PSEH2_H_
#if defined(USE_DUMMY_PSEH) || defined (__arm__) || defined(__clang__) || defined(_M_AMD64)
#define _SEH2_TRY {
#define _SEH2_FINALLY } {
#define _SEH2_EXCEPT(...) } if (0) {
#define _SEH2_END }
#define _SEH2_GetExceptionInformation()
#define _SEH2_GetExceptionCode() 0
#define _SEH2_AbnormalTermination()
#define _SEH2_YIELD(STMT_) STMT_
#define _SEH2_LEAVE
#elif defined(USE_NATIVE_SEH) || defined(_MSC_VER)
#if defined(USE_NATIVE_SEH) || defined(_MSC_VER)
#include <excpt.h>
#define _SEH2_TRY __try
@@ -48,6 +36,18 @@
#define _SEH2_YIELD(STMT_) STMT_
#define _SEH2_LEAVE __leave
#elif defined(USE_DUMMY_PSEH) || defined (__arm__) || defined(__clang__) || defined(_M_AMD64)
#define _SEH2_TRY {
#define _SEH2_FINALLY } {
#define _SEH2_EXCEPT(...) } if (0) {
#define _SEH2_END }
#define _SEH2_GetExceptionInformation()
#define _SEH2_GetExceptionCode() 0
#define _SEH2_AbnormalTermination()
#define _SEH2_YIELD(STMT_) STMT_
#define _SEH2_LEAVE
#elif defined(__GNUC__)
struct _EXCEPTION_RECORD;