summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2017-12-22 09:56:11 +0000
committermidipix <writeonce@midipix.org>2017-12-22 05:18:57 -0500
commit112cac7e8477bcb6f0432a0575c67d70d250eaa1 (patch)
tree5906776a45571557afbf9875877927807a899509 /src
parent15812f04c290bf84865678fd04e6beacc93fb6a6 (diff)
downloadntapi-112cac7e8477bcb6f0432a0575c67d70d250eaa1.tar.bz2
ntapi-112cac7e8477bcb6f0432a0575c67d70d250eaa1.tar.xz
tt_array_copy_utf16(): properly implement the interp-optarg-script semantics.
Diffstat (limited to 'src')
-rw-r--r--src/argv/ntapi_tt_array_utf16.c77
1 files changed, 54 insertions, 23 deletions
diff --git a/src/argv/ntapi_tt_array_utf16.c b/src/argv/ntapi_tt_array_utf16.c
index 266fd8e..fa0892d 100644
--- a/src/argv/ntapi_tt_array_utf16.c
+++ b/src/argv/ntapi_tt_array_utf16.c
@@ -21,9 +21,9 @@ int32_t __stdcall __ntapi_tt_array_copy_utf16(
__out int * argc,
__in const wchar16_t ** wargv,
__in const wchar16_t ** wenvp,
- __in const wchar16_t * image_name __optional,
- __in const wchar16_t * interpreter __optional,
- __in const wchar16_t * optarg __optional,
+ __in const wchar16_t * interp,
+ __in const wchar16_t * optarg,
+ __in const wchar16_t * script,
__in void * base,
__out void * buffer,
__in size_t buflen,
@@ -31,40 +31,55 @@ int32_t __stdcall __ntapi_tt_array_copy_utf16(
{
const wchar16_t ** parg;
const wchar16_t * warg;
- const wchar16_t * dummy;
+ const wchar16_t * mark;
wchar16_t * wch;
ptrdiff_t diff;
ptrdiff_t ptrs;
size_t needed;
-
- /* unused params */
- (void)interpreter;
- (void)optarg;
+ const wchar16_t * dummy[2] = {0,0};
/* fallback */
- dummy = 0;
- wargv = wargv ? wargv : &dummy;
- wenvp = wenvp ? wenvp : &dummy;
+ wargv = wargv ? wargv : dummy;
+ wenvp = wenvp ? wenvp : dummy;
/* ptrs, needed */
ptrs = 0;
needed = 0;
- if (image_name) {
+ /* interp */
+ if (interp) {
+ ptrs++;
+ needed += sizeof(wchar16_t *)
+ + __ntapi->tt_string_null_offset_short((const int16_t *)interp)
+ + sizeof(wchar16_t);
+ }
+
+ /* optarg */
+ if (interp) {
+ ptrs++;
+ needed += sizeof(wchar16_t *)
+ + __ntapi->tt_string_null_offset_short((const int16_t *)optarg)
+ + sizeof(wchar16_t);
+ }
+
+ /* script / wargv[0] */
+ if ((mark = script ? script : wargv[0])) {
ptrs++;
needed += sizeof(wchar16_t *)
- + __ntapi->tt_string_null_offset_short((const int16_t *)image_name)
+ + __ntapi->tt_string_null_offset_short((const int16_t *)mark)
+ sizeof(wchar16_t);
}
- for (parg=wargv; *parg; parg++)
+ /* wargv */
+ for (parg=&wargv[1]; *parg; parg++)
needed += sizeof(wchar16_t *)
+ __ntapi->tt_string_null_offset_short((const int16_t *)*parg)
+ sizeof(wchar16_t);
- ptrs += (parg - wargv);
+ ptrs += (parg - &wargv[1]);
*argc = (int)ptrs;
+ /* wenvp */
for (parg=wenvp; *parg; parg++)
needed += sizeof(wchar16_t *)
+ __ntapi->tt_string_null_offset_short((const int16_t *)*parg)
@@ -72,8 +87,8 @@ int32_t __stdcall __ntapi_tt_array_copy_utf16(
ptrs += (parg - wenvp);
- ptrs += 2;
- needed += 2*sizeof(wchar16_t *);
+ ptrs += 2;
+ needed += 2*sizeof(wchar16_t *);
blklen = blklen ? blklen : &needed;
*blklen = needed;
@@ -85,16 +100,32 @@ int32_t __stdcall __ntapi_tt_array_copy_utf16(
wch = (wchar16_t *)(parg+ptrs);
diff = (uintptr_t)base / sizeof(wchar16_t);
- /* image_name */
- if (image_name) {
+ /* interp */
+ if (interp) {
+ *parg++ = wch-diff;
+ for (warg=interp; *warg; warg++,wch++)
+ *wch = *warg;
+ *wch++ = '\0';
+ }
+
+ /* optarg */
+ if (optarg) {
+ *parg++ = wch-diff;
+ for (warg=optarg; *warg; warg++,wch++)
+ *wch = *warg;
+ *wch++ = '\0';
+ }
+
+ /* script / wargv[0] */
+ if ((mark = script ? script : wargv[0])) {
*parg++ = wch-diff;
- for (warg=image_name; *warg; warg++,wch++)
+ for (warg=mark; *warg; warg++,wch++)
*wch = *warg;
*wch++ = '\0';
}
- /* argv */
- for (; *wargv; wargv++) {
+ /* wargv */
+ for (++wargv; *wargv; wargv++) {
*parg++=wch-diff;
for (warg=*wargv; *warg; warg++,wch++)
*wch = *warg;
@@ -103,7 +134,7 @@ int32_t __stdcall __ntapi_tt_array_copy_utf16(
*parg++ = 0;
- /* envp */
+ /* wenvp */
for (; *wenvp; wenvp++) {
*parg++=wch-diff;
for (warg=*wenvp; *warg; warg++,wch++)