System.dll 64bit fixes
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6509 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
91756476d6
commit
47eadad506
3 changed files with 34 additions and 29 deletions
|
@ -39,7 +39,7 @@ const int ParamSizeByType[8] = {
|
||||||
sizeof(void*) / 4, // PAT_WSTRING //BUGBUG64?
|
sizeof(void*) / 4, // PAT_WSTRING //BUGBUG64?
|
||||||
sizeof(void*) / 4, // PAT_GUID //BUGBUG64?
|
sizeof(void*) / 4, // PAT_GUID //BUGBUG64?
|
||||||
0, // PAT_CALLBACK (Size will be equal to 1) //BUGBUG64?
|
0, // PAT_CALLBACK (Size will be equal to 1) //BUGBUG64?
|
||||||
1 // PAT_REGMEM
|
0 // PAT_REGMEM //BUGBUG64?
|
||||||
};
|
};
|
||||||
|
|
||||||
// Thomas needs to look at this.
|
// Thomas needs to look at this.
|
||||||
|
@ -266,7 +266,7 @@ PLUGINFUNCTION(Get)
|
||||||
GlobalFree(system_pushstring(GetResultStr(proc)));
|
GlobalFree(system_pushstring(GetResultStr(proc)));
|
||||||
// If proc is permanent?
|
// If proc is permanent?
|
||||||
if ((proc->Options & POPT_PERMANENT) == 0)
|
if ((proc->Options & POPT_PERMANENT) == 0)
|
||||||
GlobalFree((HANDLE) proc); // No, free it
|
GlobalFree((HGLOBAL) proc); // No, free it
|
||||||
}
|
}
|
||||||
else // Ok result, return proc
|
else // Ok result, return proc
|
||||||
system_pushintptr((INT_PTR) proc);
|
system_pushintptr((INT_PTR) proc);
|
||||||
|
@ -378,7 +378,7 @@ PLUGINFUNCTION(Call)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If proc is permanent?
|
// If proc is permanent?
|
||||||
if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HANDLE) proc); // No, free it
|
if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HGLOBAL) proc); // No, free it
|
||||||
} PLUGINFUNCTIONEND
|
} PLUGINFUNCTIONEND
|
||||||
|
|
||||||
PLUGINFUNCTIONSHORT(Int64Op)
|
PLUGINFUNCTIONSHORT(Int64Op)
|
||||||
|
@ -756,11 +756,11 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
||||||
{
|
{
|
||||||
// it may contain previous inline input
|
// it may contain previous inline input
|
||||||
if (!((proc->Params[ParamIndex].Input > -1) && (proc->Params[ParamIndex].Input <= __INST_LAST)))
|
if (!((proc->Params[ParamIndex].Input > -1) && (proc->Params[ParamIndex].Input <= __INST_LAST)))
|
||||||
GlobalFree((HANDLE) proc->Params[ParamIndex].Input);
|
GlobalFree((HGLOBAL) proc->Params[ParamIndex].Input);
|
||||||
proc->Params[ParamIndex].Input = BUGBUG64(int) temp4;
|
proc->Params[ParamIndex].Input = temp4;
|
||||||
}
|
}
|
||||||
if (temp3 == 1)
|
if (temp3 == 1)
|
||||||
proc->Params[ParamIndex].Output = BUGBUG64(int) temp4;
|
proc->Params[ParamIndex].Output = (int) temp4; // Note: As long as we never assign a pointer to temp4 when parsing a destination the cast to int is OK.
|
||||||
// Next parameter is output or something else
|
// Next parameter is output or something else
|
||||||
temp3++;
|
temp3++;
|
||||||
}
|
}
|
||||||
|
@ -847,7 +847,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
|
||||||
|
|
||||||
// fake-real parameter: for COM interfaces first param is Interface Pointer
|
// fake-real parameter: for COM interfaces first param is Interface Pointer
|
||||||
proc->Params[1].Output = IOT_NONE;
|
proc->Params[1].Output = IOT_NONE;
|
||||||
proc->Params[1].Input = BUGBUG64(int) AllocStr(proc->DllName);
|
proc->Params[1].Input = (INT_PTR) AllocStr(proc->DllName);
|
||||||
proc->Params[1].Size = PARAMSIZEBYTYPE_PTR;
|
proc->Params[1].Size = PARAMSIZEBYTYPE_PTR;
|
||||||
proc->Params[1].Type = PAT_PTR;
|
proc->Params[1].Type = PAT_PTR;
|
||||||
proc->Params[1].Option = 0;
|
proc->Params[1].Option = 0;
|
||||||
|
@ -940,7 +940,7 @@ void ParamsIn(SystemProc *proc)
|
||||||
realbuf = AllocStr(_T(""));
|
realbuf = AllocStr(_T(""));
|
||||||
else if (par->Input == IOT_STACK) realbuf = system_popstring();
|
else if (par->Input == IOT_STACK) realbuf = system_popstring();
|
||||||
else if ((par->Input > 0) && (par->Input <= __INST_LAST))
|
else if ((par->Input > 0) && (par->Input <= __INST_LAST))
|
||||||
realbuf = system_getuservariable(par->Input - 1);
|
realbuf = system_getuservariable((int)par->Input - 1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Inline input, will be freed as realbuf
|
// Inline input, will be freed as realbuf
|
||||||
|
@ -1037,7 +1037,7 @@ void ParamsDeAllocate(SystemProc *proc)
|
||||||
for (i = proc->ParamCount; i >= 0; i--)
|
for (i = proc->ParamCount; i >= 0; i--)
|
||||||
if (proc->Params[i].Value && proc->Params[i].Option == -1)
|
if (proc->Params[i].Value && proc->Params[i].Option == -1)
|
||||||
{
|
{
|
||||||
GlobalFree((HANDLE) (proc->Params[i].Value));
|
GlobalFree((HGLOBAL) (proc->Params[i].Value));
|
||||||
proc->Params[i].Value = 0;
|
proc->Params[i].Value = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1045,18 +1045,18 @@ void ParamsDeAllocate(SystemProc *proc)
|
||||||
void ParamsOut(SystemProc *proc)
|
void ParamsOut(SystemProc *proc)
|
||||||
{
|
{
|
||||||
INT_PTR *place;
|
INT_PTR *place;
|
||||||
int i;
|
|
||||||
TCHAR *realbuf;
|
|
||||||
LPWSTR wstr;
|
LPWSTR wstr;
|
||||||
|
int i;
|
||||||
|
TCHAR *realbuf = AllocString();
|
||||||
|
|
||||||
i = proc->ParamCount;
|
i = proc->ParamCount;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// Retreive pointer to place
|
// Retreive pointer to place
|
||||||
if (proc->Params[i].Option == -1) place = (INT_PTR*) proc->Params[i].Value;
|
if (proc->Params[i].Option == -1)
|
||||||
else place = (INT_PTR*) &(proc->Params[i].Value);
|
place = (INT_PTR*) proc->Params[i].Value;
|
||||||
|
else
|
||||||
realbuf = AllocString();
|
place = (INT_PTR*) &(proc->Params[i].Value);
|
||||||
|
|
||||||
// Step 1: retrive value
|
// Step 1: retrive value
|
||||||
switch (proc->Params[i].Type)
|
switch (proc->Params[i].Type)
|
||||||
|
@ -1088,10 +1088,11 @@ void ParamsOut(SystemProc *proc)
|
||||||
#ifdef _UNICODE
|
#ifdef _UNICODE
|
||||||
StringFromGUID2(*((REFGUID*)place), realbuf, g_stringsize);
|
StringFromGUID2(*((REFGUID*)place), realbuf, g_stringsize);
|
||||||
#else
|
#else
|
||||||
wstr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*2);
|
{
|
||||||
StringFromGUID2(*((REFGUID*)place), wstr, g_stringsize);
|
WCHAR guidstrbuf[39];
|
||||||
WideCharToMultiByte(CP_ACP, 0, wstr, g_stringsize, realbuf, g_stringsize, NULL, NULL);
|
int guidcch = StringFromGUID2(*((REFGUID*)place), guidstrbuf, g_stringsize);
|
||||||
GlobalFree((HGLOBAL)wstr);
|
WideCharToMultiByte(CP_ACP, 0, guidstrbuf, guidcch, realbuf, g_stringsize, NULL, NULL);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case PAT_WSTRING:
|
case PAT_WSTRING:
|
||||||
|
@ -1115,7 +1116,8 @@ void ParamsOut(SystemProc *proc)
|
||||||
|
|
||||||
SYSTEM_LOG_ADD(_T("\t\t\tParam Out("));
|
SYSTEM_LOG_ADD(_T("\t\t\tParam Out("));
|
||||||
// Step 2: place it
|
// Step 2: place it
|
||||||
if (proc->Params[i].Output == IOT_NONE) SYSTEM_LOG_ADD(_T("none"));
|
if (proc->Params[i].Output == IOT_NONE)
|
||||||
|
SYSTEM_LOG_ADD(_T("none"));
|
||||||
else if (proc->Params[i].Output == IOT_STACK)
|
else if (proc->Params[i].Output == IOT_STACK)
|
||||||
{
|
{
|
||||||
SYSTEM_LOG_ADD(_T("stack"));
|
SYSTEM_LOG_ADD(_T("stack"));
|
||||||
|
@ -1140,11 +1142,11 @@ void ParamsOut(SystemProc *proc)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GlobalFree(realbuf);
|
|
||||||
|
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
while (i >= 0);
|
while (i >= 0);
|
||||||
|
|
||||||
|
GlobalFree(realbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE CreateCallback(SystemProc *cbproc)
|
HANDLE CreateCallback(SystemProc *cbproc)
|
||||||
|
@ -1212,7 +1214,7 @@ void CallStruct(SystemProc *proc)
|
||||||
// No. Allocate struct memory
|
// No. Allocate struct memory
|
||||||
proc->Proc = (HANDLE) GlobalAlloc(GPTR, structsize);
|
proc->Proc = (HANDLE) GlobalAlloc(GPTR, structsize);
|
||||||
else // In case of zero size defined structure use mapped size
|
else // In case of zero size defined structure use mapped size
|
||||||
if (structsize == 0) structsize = (int) GlobalSize((HANDLE) proc->Proc);
|
if (structsize == 0) structsize = (int) GlobalSize((HGLOBAL) proc->Proc);
|
||||||
|
|
||||||
#ifdef SYSTEM_LOG_DEBUG
|
#ifdef SYSTEM_LOG_DEBUG
|
||||||
{
|
{
|
||||||
|
@ -1238,7 +1240,7 @@ void CallStruct(SystemProc *proc)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int intmask[4] = {0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF};
|
const int intmask[4] = {0xFFFFFFFF, 0x000000FF, 0x0000FFFF, 0x00FFFFFF};
|
||||||
|
|
||||||
// Special
|
// Special
|
||||||
size = (proc->Params[i].Option-1) * ByteSizeByType[proc->Params[i].Type];
|
size = (proc->Params[i].Option-1) * ByteSizeByType[proc->Params[i].Type];
|
||||||
|
@ -1249,8 +1251,10 @@ void CallStruct(SystemProc *proc)
|
||||||
case PAT_LONG:
|
case PAT_LONG:
|
||||||
// real structure size
|
// real structure size
|
||||||
proc->Params[i].Value = structsize;
|
proc->Params[i].Value = structsize;
|
||||||
|
#ifndef _WIN64
|
||||||
proc->Params[i]._value = 0;
|
proc->Params[i]._value = 0;
|
||||||
ssflag = TRUE; //Why does this have to be set?
|
#endif
|
||||||
|
ssflag = TRUE; // System::Call '*(...,&l.r0)'
|
||||||
case PAT_INT:
|
case PAT_INT:
|
||||||
// clear unused value bits
|
// clear unused value bits
|
||||||
proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)];
|
proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)];
|
||||||
|
|
|
@ -83,10 +83,12 @@ typedef struct
|
||||||
int Type;
|
int Type;
|
||||||
int Option; // -1 -> Pointer, 1-... -> Special+1
|
int Option; // -1 -> Pointer, 1-... -> Special+1
|
||||||
INT_PTR Value; // it can hold any pointer sized value
|
INT_PTR Value; // it can hold any pointer sized value
|
||||||
int _value; // value buffer for structures > 4 bytes (I hope 8 bytes will be enough) BUGBUG: Does Win64 need this?
|
#ifndef _WIN64
|
||||||
|
int _value; // Upper 32 bits of Value when type is 64 bit (2 pushes)
|
||||||
|
#endif
|
||||||
int Size; // Value real size (should be either 1 or 2 (the number of pushes))
|
int Size; // Value real size (should be either 1 or 2 (the number of pushes))
|
||||||
int Input; //BUGBUG: What about pointers on Win64?
|
|
||||||
int Output;
|
int Output;
|
||||||
|
INT_PTR Input;
|
||||||
HGLOBAL allocatedBlock; // block allocated for passing string, wstring or guid param
|
HGLOBAL allocatedBlock; // block allocated for passing string, wstring or guid param
|
||||||
} ProcParameter;
|
} ProcParameter;
|
||||||
|
|
||||||
|
|
|
@ -788,8 +788,7 @@ System::Free $0
|
||||||
|
|
||||||
<blockquote><pre>
|
<blockquote><pre>
|
||||||
# allocate
|
# allocate
|
||||||
System::Alloc 32
|
System::Call "*(i,i,p,p,p,p,p,p)p.r1"
|
||||||
Pop $1
|
|
||||||
# call
|
# call
|
||||||
System::Call "Kernel32::GlobalMemoryStatus(p r1)"
|
System::Call "Kernel32::GlobalMemoryStatus(p r1)"
|
||||||
# get
|
# get
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue