fi.pArgsData[i-2].data = (PVOID)args[i]->Uint32Value(); }elseif (args[i]->IsString()){ fi.pArgsData[i-2].nType = 1; if (bWideChar) fi.pArgsData[i-2].data = (PVOID)_wcsdup((wchar_t *)*(String::Value(args[i]->ToString()))); else fi.pArgsData[i-2].data = (PVOID)_strdup(*(String::AsciiValue(args[i]->ToString()))); }elseif (args[i]->IsArray()){ //数组结构体 fi.pArgsData[i-2].nType = 2; Array *arr = Array::Cast(*args[i]); int nLength = arr->Length(); fi.pArgsData[i-2].data = malloc(nLength * sizeof(int)); for (int ii=0;ii<nLength;ii++) { ((DWORD *)fi.pArgsData[i-2].data)[ii] = arr->Get(i)->Uint32Value(); } }elseif (args[i]->IsFunction()){ //js函数暂不支持 fi.pArgsData[i-2].nType = -1; bRun = FALSE; printf("Don't Support Function.\n"); break; }else{ fi.pArgsData[i-2].nType = -1; fi.pArgsData[i-2].data = (PVOID)args[i]->Uint32Value(); } //Handle<String> s = args[i]->ToString(); //std::cout << *(String::AsciiValue(s)) << std::endl; } if (bRun) { for (i=fi.nArgs-1;i>=0;i--) { SetEax((DWORD)fi.pArgsData[i].data); __asm{ push eax } } __asm{ mov eax, lpFuncAddress call eax mov i_ret, eax } } ret_array->Set(Integer::New(0), Integer::New(i_ret)); for (i=0;i<fi.nArgs;i++) { switch (fi.pArgsData[i].nType) { case 0: ret_array->Set(Integer::New(i+1), Uint32::New((DWORD)fi.pArgsData[i-2].data)); //*Uint32::Cast(*args[i+2]) = *Uint32::New((DWORD)fi.pArgsData[i-2].data); break; case 1: { ret_array->Set(Integer::New(i+1), bWideChar ? v8::String::New((uint16_t *)fi.pArgsData[i].data,lstrlenW((wchar_t *)fi.pArgsData[i].data)) : v8::String::New((char *)fi.pArgsData[i].data,lstrlenA((char *)fi.pArgsData[i].data))); } break; case 2: { int nLength = Array::Cast(*args[i+2])->Length(); Handle<Array> arr = Array::New(nLength); for (int ii=0;ii<nLength;ii++) { arr->Set(Integer::New(ii), v8::Uint32::New(((DWORD *)fi.pArgsData[i].data)[ii])); } ret_array->Set(Integer::New(i+1), arr); } break; default: //case 0: ret_array->Set(Integer::New(i+1), Uint32::New((DWORD)fi.pArgsData[i-2].data)); } if (fi.pArgsData[i].nType > 0) { free(fi.pArgsData[i].data); } } delete[] fi.pArgsData; }else{ i_ret = ((FUNC_DEF)lpFuncAddress)(); } free(szDllName); free(szFuncName); if (args.Length() > 2) { return ret_array; }else{ return Integer::New(i_ret); 从代码中我们可以看到,有参数的函数返回的是一个数组,这是由于有些API带有传址 的参数,我们需要把其中被修改的数据也返回回脚本,像 GetModuleFileName 之类的函数 同时,我们把函数执行返回的结果作为第一个值返回。现在,我们把这个函数加入到全局对 |