var DWX=WScript.CreateObject("DynamicWrapperX");
var bit=DWX.Bitness(); // разрядность процесса
var dwxsize={l:4,u:4,m:8,q:8,h:bit/8,p:bit/8,n:2,t:2,c:1,b:1,f:4,d:8}; // размеры типов
var defWINAPI={
/* 4 */ LONG:"l", INT:"l", BOOL:"l", HRESULT:"l", NTSTATUS:"l", "int":"l",
/* u4 */ ULONG:"u", UINT:"u", DWORD:"u", PUINT:"u", LPUINT:"u", ULONG32:"u", "enum":"u",
/* 8 */ INT64:"m", LONGLONG:"m",
/* u8 */ UINT64:"q", ULONGLONG:"q", DWORDLONG:"q", ULONG64:"q",
/* $ */ HANDLE:"h", HWND:"h", HMODULE:"h", HLOCAL:"h", HINSTANCE:"h", HICON:"h", HCURSOR:"h", HBRUSH:"h", HDROP:"h", PVOID:"h", INT_PTR:"h", LONG_PTR:"h", /*?*/
/* u$ */ WNDPROC:"p", LPCTSTR:"p", LPCWSTR:"p", UINT_PTR:"p", WPARAM:"p", LPARAM:"p", LPVOID:"p", ULONG_PTR:"p", PULONG_PTR:"p", LRESULT:"p", SIZE_T:"p" /*unsigned*/, LPMSG:"p", PDWORD:"p", PHANDLE:"p", PSID:"p",
/* 2 */ SHORT:"n",
/* u2 */ USHORT:"t", WORD:"t", PWORD:"t", LPWORD:"t", WCHAR:"t", OLECHAR:"t", wchar_t:"t",
/* 1 */ CHAR:"c", CCHAR:"c",
/* u1 */ UCHAR:"b", BYTE:"b", PBYTE:"b", BOOLEAN:"b",
/* 4 */ FLOAT:"f",
/* 8 */ DOUBLE:"d",
BSTR:"w", LPWSTR:"w", LPOLESTR:"w",
LPSTR:"s", LPCSTRL:"s"
};
var struct={ // добавить описание обязательно к этому объекту
use: [], // для очистки
create: function(name,crtaddr){ // если crtaddr задан числом, отличным от 0, то память на структуру выделяться не будет
if(typeof(struct[name])=="undefined"){WScript.Echo("Error, struct "+name+" is undefined!");WScript.Quit();return false} // исключение
var obj={
addr: crtaddr?crtaddr:DWX.MemAlloc(struct[name].$_size,1), // при crtaddr не выделяем память
type: name,
put: function(aStr,data){struct.put(this,aStr,data)},
get: function(aStr){return struct.get(this,aStr)},
size: struct[name].$_size,
_nid: crtaddr?-1:struct.use.length // номер структуры, для destroy
};
if(!crtaddr)struct.use.push(obj);
return obj
},
put: function(obj,aStr,data){
var tp=struct[obj.type],sz=0; aStr=aStr.split(".");
for(var i=0;i<aStr.length-1;i++){sz+=tp[aStr[i]].offset;tp=tp[aStr[i]].obj;}
tp=tp[aStr.pop()];
DWX.NumPut(data,obj.addr,(sz+tp.offset),tp.type);
},
get: function(obj,aStr){ // use: 'var SysTimeInfo=struct.create("SYSTEM_TIME_OF_DAY_INFORMATION"); SysTimeInfo.get("CurrentTime.LowPart");' - вернёт значение поля, а 'SysTimeInfo.get("CurrentTime");' вернёт указатель на поле
var tp=struct[obj.type],sz=0,tmp; aStr=aStr.split(".");
var charonly=false;
for(var i=0;i<aStr.length;i++){
tmp=aStr[i].split(/(\[)|(\])/g); // разделяем каждый элемент строки адреса по []
tp=tp[tmp[0]]; sz+=tp.offset;
if(tmp[1]){tmp=tmp[1]-0;charonly=true;if(tp.obj)sz+=tp.obj.$_size*tmp; else sz+=dwxsize[tp.type]*tmp;} // tmp=eval(tmp[1])-0; (убрал eval)
else{charonly=false;}
if(tp.obj)tp=tp.obj; else break;
}
if(tp.$_size)return obj.addr+sz; // если это не "лист" дерева структуры, то просто возвращаем указатель на память
// DebugStr+=typeof(tmp)+": "+tmp+"\n";
if((!tp.count)||charonly/*(tmp>=0) - bad*/)return DWX.NumGet(obj.addr,sz,tp.type); // (tmp>=0), где tmp=[srt,n] - чтобы при запросе str[n] не выводилась оставшаяся часть строки - bag solution (tp.count - количество элементов массива)
// else: tmp=[str] => массив (пока обработчики только строки)
if(tp.elemtype=="WCHAR")return DWX.StrGet(obj.addr+sz,"w"); // если это строка
if(tp.elemtype=="UCHAR")return DWX.StrGet(obj.addr+sz,"s"); // если это строка
WScript.Echo("TODO: добавить обработчик для типа: "+tp.elemtype); // debug
return obj.addr+sz;
},
define: function(name,str,pack){ // pack - выравнивание для структуры (default(0): по максимальному члену)
var obj={},sz=0,arg,tp;
var align=1,tost; // new vars (renamed)
if(!pack)pack=8; // размеры всех типов не превышают 8
str=str.split(";");
for(var i=0;i<str.length;i++){
arg=str[i].split(/\s/gm);
if(arg.length<2)continue;
tp=defWINAPI[arg[0]];
if(typeof(tp)=="undefined"){WScript.Echo("Error, type "+arg[0]+" is undefined!");WScript.Quit();return false} // исключение
/* // без выравнивания:
if(typeof(tp)=="string"){obj[arg[1]]={type:tp,offset:sz};sz+=dwxsize[tp];}
else{obj[arg[1]]={obj:tp,offset:sz};sz+=tp.$_size}
// с выравниванием:
if(typeof(tp)=="string"){ // если тип является простым
align=Math.max(align,dwxsize[tp]); // высчитываем общее выравнивание структуры
tost=Math.min(pack,dwxsize[tp]); // выравнивание текущего члена (исключительно при изменении выравнивания pack)
sz=Math.ceil(sz/tost)*tost; // отступ по выравниванию
obj[arg[1]]={type:tp,offset:sz}; // создание члена в структуре
sz+=dwxsize[tp];
} else { // иначе (составным)
align=Math.max(align,tp.$_align);
tost=Math.min(pack,tp.$_align);
sz=Math.ceil(sz/tost)*tost;
obj[arg[1]]={obj:tp,offset:sz};
sz+=tp.$_size;
}
*/
// с множественным обозначением (массивами)
var data,kdata;
tost=arg[1].split(/(\[)|(\])/g); // temp var
if(tost.length==1){data=arg[1];kdata=1;}else{data=tost[0];kdata=tost[1]-0;} // kdata=eval(tost[1])-0; (убрал eval)
if(typeof(tp)=="string"){ // простой тип
align=Math.max(align,dwxsize[tp]); // общее выравнивание структуры
tost=Math.min(pack,dwxsize[tp]);
sz=Math.ceil(sz/tost)*tost;
obj[data]={type:tp,offset:sz};
if(kdata>1){obj[data].count=kdata;obj[data].elemtype=arg[0];} // если массив (кол-во членов больше 1)
sz+=dwxsize[tp]*kdata;
} else { // составной тип
align=Math.max(align,tp.$_align);
tost=Math.min(pack,tp.$_align);
sz=Math.ceil(sz/tost)*tost;
obj[data]={obj:tp,offset:sz};
if(kdata>1){obj[data].count=kdata;obj[data].elemtype=arg[0];}
sz+=tp.$_size*kdata;
}
}
tost=Math.min(pack,align);
sz=Math.ceil(sz/tost)*tost; // выравниваем последний элемент структуры, оставляя после ного пустоту (правило выравнивание последнего поля)
obj.$_size=sz;
obj.$_align=Math.min(align,pack); // для маленьких структур
defWINAPI[name]=obj;
struct[name]=obj;
},
destroy: function(obj){DWX.MemFree(obj.addr);obj.addr=0;struct.use[obj._nid]=null;},
destroyAll: function(){
var t; while(struct.use.length){t=struct.use.pop();if(t!=null)struct.destroy(t);}
}
/* Пример структуры - результат struct.define("WIN32_FIND_DATAW","DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[260]; WCHAR cAlternateFileName[14]"):
struct.WIN32_FIND_DATAW = defWINAPI.WIN32_FIND_DATAW = {
"dwFileAttributes": {type: "u", offset: 0},
"ftCreationTime": {
obj: {
"dwLowDateTime": {type: "u", offset: 0},
"dwHighDateTime": {type: "u", offset: 4},
$_size: 8,
$_align: 4
},
offset: 4
},
"ftLastAccessTime": {
obj: {
"dwLowDateTime": {type: "u", offset: 0},
"dwHighDateTime": {type: "u", offset: 4},
$_size: 8,
$_align: 4
},
offset: 12
},
"ftLastWriteTime": {
obj: {
"dwLowDateTime": {type: "u", offset: 0},
"dwHighDateTime": {type: "u", offset: 4},
$_size: 8,
$_align: 4
},
offset: 20
},
"nFileSizeHigh": {type: "u", offset: 28},
"nFileSizeLow": {type: "u", offset: 32},
"dwReserved0": {type: "u", offset: 36},
"dwReserved1": {type: "u", offset: 40},
"cFileName": {type: "t", offset: 44, count: 260, elemtype: "WCHAR"},
"cAlternateFileName": {type: "t", offset: 564, count: 14, elemtype: "WCHAR"},
$_size: 592,
$_align: 4
}
*/
}
// include
DWX.Register("kernel32.dll","FindFirstFileW","i=pp","r=h"); // LPCTSTR,LPWIN32_FIND_DATAW; HANDLE
DWX.Register("kernel32.dll","FindNextFileW","i=hp","r=l"); // HANDLE,LPWIN32_FIND_DATAW; BOOL
DWX.Register("kernel32.dll","FindClose","i=h","r=l"); // HANDLE; BOOL
// typedef
struct.define("FILETIME","DWORD dwLowDateTime; DWORD dwHighDateTime");
struct.define("WIN32_FIND_DATAW","DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[260]; WCHAR cAlternateFileName[14]"); // MAX_PATH=260
// define
var INVALID_HANDLE_VALUE=-1;
function FindFiles(path){
var Files=[];
var FindFileData=struct.create("WIN32_FIND_DATAW");
var hFind=DWX.FindFirstFileW(path,FindFileData.addr);
if(hFind!=INVALID_HANDLE_VALUE){
while(1){
if((FindFileData.get("dwFileAttributes")&0x10)==0) // FILE_ATTRIBUTE_DIRECTORY=0x00000010
Files.push(FindFileData.get("cFileName")); // если не дирректория
if(DWX.FindNextFileW(hFind,FindFileData.addr)==0)break;
}
DWX.FindClose(hFind);
}
struct.destroy(FindFileData);
return Files;
}
// main
var DllFiles=FindFiles("C:\\Windows\\*.dll");
WScript.Echo(DllFiles.join("\n"));