免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 网站相关 > 网站安全 > 使用Google v8打造自己的脚本引擎(3)

使用Google v8打造自己的脚本引擎(3)

时间:2011-10-30 20:22来源:未知 整理:寂涯网络 点击:


    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 之类的函数
同时,我们把函数执行返回的结果作为第一个值返回。现在,我们把这个函数加入到全局对

本页地址 http://www.jybase.net/wangzhananquan/20111030517.html

百度搜索更多

谷歌搜索更多

顶一下
(2)
50%
踩一下
(2)
50%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com