JSBool wimg_create_file(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { LPWSTR filePath = NULL; DWORD desiredAccess = WIM_GENERIC_READ, creationDisposition = WIM_OPEN_EXISTING, flags = 0, compressionType = WIM_COMPRESS_LZX, creationResult; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "W /u u u u", &filePath, &desiredAccess, &creationDisposition, &flags, &compressionType)) { JS_ReportError(cx, "Error during argument parsing in WIMCreateFile"); JS_EndRequest(cx); return JS_FALSE; } JS_YieldRequest(cx); HANDLE wimFile = WIMCreateFile(filePath, desiredAccess, creationDisposition, flags, compressionType, &creationResult); if(wimFile == NULL) { *rval = JSVAL_FALSE; JS_EndRequest(cx); return JS_TRUE; } JSObject * retObj = JS_NewObject(cx, &wimFileClass, wimFileProto, obj); *rval = OBJECT_TO_JSVAL(retObj); JS_SetPrivate(cx, retObj, wimFile); JS_EndRequest(cx); return JS_TRUE; }
JSBool netjoindomain(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { JSString * serverStr = NULL, * domainStr = NULL, *accountOUStr = NULL, *accountStr = NULL, *passwordStr = NULL; DWORD joinOptions = 0; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "S S S S u", &domainStr, &accountOUStr, &accountStr, &passwordStr, &joinOptions)) { JS_ReportError(cx, "Unable to parse arguments in netjoindomain"); JS_EndRequest(cx); return JS_FALSE; } JS_YieldRequest(cx); DWORD result = NetJoinDomain(NULL, (LPWSTR)JS_GetStringChars(domainStr), (JSVAL_IS_NULL(argv[1]) ? NULL : (LPWSTR)JS_GetStringChars(accountOUStr)), (JSVAL_IS_NULL(argv[2]) ? NULL : (LPWSTR)JS_GetStringChars(accountStr)), (JSVAL_IS_NULL(argv[3]) ? NULL : (LPWSTR)JS_GetStringChars(passwordStr)), joinOptions); if(result == NERR_Success) { *rval = JSVAL_TRUE; return JS_TRUE; } JSBool retBool = JS_NewNumberValue(cx, result, rval); JS_EndRequest(cx); return retBool; }
JSBool netgetjoinableous(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { LPWSTR domain, account, password; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "W W W", &domain, &account, &password)) { JS_ReportError(cx, "Error parsing arguments in NetGetJoinableOUs"); JS_EndRequest(cx); } JS_YieldRequest(cx); DWORD ouCount = 0; LPWSTR * ous = NULL; DWORD status = NetGetJoinableOUs(NULL, domain, (JSVAL_IS_NULL(argv[1]) ? NULL : account), (JSVAL_IS_NULL(argv[2]) ? NULL : password), &ouCount, &ous); if(status != NERR_Success) { JS_NewNumberValue(cx, status, rval); JS_EndRequest(cx); return JS_TRUE; } JSObject * arrayObj = JS_NewArrayObject(cx, 0, NULL); *rval = OBJECT_TO_JSVAL(arrayObj); for(DWORD i = 0; i < ouCount; i++) { JSString * curOu = JS_NewUCStringCopyZ(cx, (jschar*)ous[i]); JS_DefineElement(cx, arrayObj, i, STRING_TO_JSVAL(curOu), NULL, NULL, 0); } NetApiBufferFree(ous); JS_EndRequest(cx); return JS_TRUE; }
PSID convert_jsstring_to_sid(JSContext * cx, JSString * curMemberString, DWORD * errorCode) { PSID curMember; if(!ConvertStringSidToSid((LPWSTR)JS_GetStringChars(curMemberString), &curMember)) { DWORD sidSize = 0, cbDomain; SID_NAME_USE peUse; *errorCode = GetLastError(); JS_YieldRequest(cx); if(!LookupAccountName(NULL, (LPWSTR)JS_GetStringChars(curMemberString), NULL, &sidSize, NULL, &cbDomain, &peUse) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { *errorCode = GetLastError(); return NULL; } curMember = (PSID)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidSize); JS_YieldRequest(cx); LPTSTR domainName = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, cbDomain * sizeof(TCHAR)); if(!LookupAccountName(NULL, (LPWSTR)JS_GetStringChars(curMemberString), curMember, &sidSize, domainName, &cbDomain, &peUse)) { *errorCode = GetLastError(); HeapFree(GetProcessHeap(), 0, curMember); HeapFree(GetProcessHeap(), 0, domainName); return NULL; } HeapFree(GetProcessHeap(), 0, domainName); *errorCode = ERROR_SUCCESS; } else { DWORD sidSize = GetLengthSid(curMember); PSID retMember = (PSID)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidSize); CopySid(sidSize, retMember, curMember); LocalFree(curMember); curMember = retMember; } return curMember; }
JSBool wimg_delete_image(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { HANDLE wimFile = JS_GetPrivate(cx, obj); DWORD imageIndex; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "u", &imageIndex)) { JS_ReportError(cx, "Error during argument parsing in WIMDeleteImage"); JS_EndRequest(cx); return JS_FALSE; } JS_YieldRequest(cx); *rval = WIMDeleteImage(wimFile, imageIndex) ? JSVAL_TRUE : JSVAL_FALSE; JS_EndRequest(cx); return JS_TRUE; }
JSBool win32_impersonateuser(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { JSString * username, * password, *domain = NULL; DWORD logonType = LOGON32_LOGON_INTERACTIVE; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "S S /S u", &username, &password, &domain, &logonType)) { JS_ReportError(cx, "Unable to parse arguments in ImpersonateUser"); JS_EndRequest(cx); return JS_FALSE; } if(logonType == LOGON32_LOGON_NETWORK) { *rval = JSVAL_FALSE; JS_EndRequest(cx); return JS_TRUE; } LPWSTR domainName = NULL; if(domain != NULL) domainName = (LPWSTR)JS_GetStringChars(domain); HANDLE newToken = NULL; JS_YieldRequest(cx); if(!LogonUser((LPWSTR)JS_GetStringChars(username), domainName, (LPWSTR)JS_GetStringChars(password), logonType, LOGON32_PROVIDER_DEFAULT, &newToken)) { *rval = JSVAL_FALSE; JS_EndRequest(cx); return JS_TRUE; } if(!ImpersonateLoggedOnUser(newToken)) *rval = JSVAL_FALSE; else *rval = JSVAL_TRUE; CloseHandle(newToken); JS_EndRequest(cx); return JS_TRUE; }
JSBool DLLCALL js_CommonOperationCallback(JSContext *cx, js_callback_t* cb) { cb->counter++; /* Terminated? */ if(cb->auto_terminate && (cb->terminated!=NULL && *cb->terminated)) { JS_ReportWarning(cx,"Terminated"); cb->counter=0; return(JS_FALSE); } /* Infinite loop? */ if(cb->limit && cb->counter > cb->limit) { JS_ReportError(cx,"Infinite loop (%lu operation callbacks) detected",cb->counter); cb->counter=0; return(JS_FALSE); } /* Give up timeslices every once in a while */ if(cb->yield_interval && (cb->counter%cb->yield_interval)==0) { jsrefcount rc; rc=JS_SUSPENDREQUEST(cx); YIELD(); JS_RESUMEREQUEST(cx, rc); } /* Permit other contexts to run GC */ JS_YieldRequest(cx); /* Periodic Garbage Collection */ if(cb->gc_interval && (cb->counter%cb->gc_interval)==0) JS_MaybeGC(cx), cb->gc_attempts++; return(JS_TRUE); }
JSBool wimg_load_image(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { DWORD imageIndex; JS_BeginRequest(cx); if(!JS_ConvertArguments(cx, argc, argv, "u", &imageIndex)) { JS_ReportError(cx, "Error during argument parsing in WIMLoadImage"); JS_EndRequest(cx); return JS_FALSE; } JS_YieldRequest(cx); HANDLE hImage = WIMLoadImage(JS_GetPrivate(cx, obj), imageIndex); if(hImage == NULL) { *rval = JSVAL_FALSE; JS_EndRequest(cx); return JS_TRUE; } JSObject * retObj = JS_NewObject(cx, &wimImageClass, wimImageProto, obj); *rval = OBJECT_TO_JSVAL(retObj); JS_SetPrivate(cx, retObj, hImage); JS_EndRequest(cx); return JS_TRUE; }
JSBool netlocalgroupaddmembers(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { JS_BeginRequest(cx); if(argc < 2) { JS_ReportError(cx, "Must pass members to be added."); JS_EndRequest(cx); return JS_FALSE; } LOCALGROUP_MEMBERS_INFO_0 * members; DWORD * lookupResult; DWORD memberCount = 0; JSString * groupName = JS_ValueToString(cx, argv[0]); argv[0] = STRING_TO_JSVAL(groupName); if(JSVAL_IS_OBJECT(argv[1]) && JS_IsArrayObject(cx, JSVAL_TO_OBJECT(argv[1]))) { JSObject * memberArray; JS_ValueToObject(cx, argv[1], &memberArray); argv[1] = OBJECT_TO_JSVAL(memberArray); JS_GetArrayLength(cx, memberArray, (jsuint*)&memberCount); members = (LOCALGROUP_MEMBERS_INFO_0*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOCALGROUP_MEMBERS_INFO_0) * memberCount); lookupResult = (DWORD*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD) * memberCount); JS_EnterLocalRootScope(cx); for(DWORD i = 0; i < memberCount; i++) { jsval curMemberVal; JSString * curMemberString; JS_GetElement(cx, memberArray, (jsint)i, &curMemberVal); curMemberString = JS_ValueToString(cx, curMemberVal); members[i].lgrmi0_sid = convert_jsstring_to_sid(cx, curMemberString, &lookupResult[i]); } JS_LeaveLocalRootScope(cx); } else { JSString * memberString = JS_ValueToString(cx, argv[1]); argv[1] = STRING_TO_JSVAL(memberString); members = (LOCALGROUP_MEMBERS_INFO_0*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOCALGROUP_MEMBERS_INFO_0)); lookupResult = (DWORD*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD)); members->lgrmi0_sid = convert_jsstring_to_sid(cx, memberString, lookupResult); memberCount = 1; } for(DWORD i = 0; i < memberCount; i++) { if(lookupResult[i] == 0) { JS_YieldRequest(cx); lookupResult[i] = NetLocalGroupAddMembers(NULL, (LPWSTR)JS_GetStringChars(groupName), 0, (LPBYTE)&members[i], 1); } } JSObject * retArray = JS_NewArrayObject(cx, 0, NULL); *rval = OBJECT_TO_JSVAL(retArray); for(DWORD i = 0; i < memberCount; i++) { jsval curResultVal; JS_NewNumberValue(cx, lookupResult[i], &curResultVal); JS_DefineElement(cx, retArray, i, curResultVal, NULL, NULL, 0); HeapFree(GetProcessHeap(), 0, members[i].lgrmi0_sid); } HeapFree(GetProcessHeap(), 0, members); HeapFree(GetProcessHeap(), 0, lookupResult); JS_EndRequest(cx); return JS_TRUE; }