> include a Dll into a compiled .exe and then load the Dll and use it without having to extract the Dll
example1.ah2
Code: Select all
;https://github.com/thqby/ahk2_lib/tree/master/WebView2
;@Ahk2Exe-AddResource 64bit\WebView2Loader.dll
main := Gui('+Resize')
main.OnEvent('Close', (*) => (wvc := wv := 0))
main.Show(Format('w{} h{}', A_ScreenWidth * 0.6, A_ScreenHeight * 0.6))
wvc := WebView2.create(main.Hwnd,,,,,,"64bit\WebView2Loader.dll")
wv := wvc.CoreWebView2
wv.Navigate('https://autohotkey.com')
wv.AddHostObjectToScript('ahk', {str:'str from ahk',func:MsgBox})
wv.OpenDevToolsWindow()
MemoryLoadLibrary_fromPath(dllPath) {
if (A_IsCompiled) {
SplitPath dllPath, &dllName
hModule:=DllCall("GetModuleHandle","Ptr",0,"Ptr")
Resource:=DllCall("FindResource","Ptr",hModule,"Str",dllName,"UInt",10,"Ptr") ;RT_CDATA
if (!Resource) {
throw ValueError("Resource not found:",0,dllName) ;opted for an error instead of message box
}
ResourceSize:=DllCall("SizeofResource","Ptr",hModule,"Ptr",Resource,"Uint")
ResourcePtr:=DllCall("LoadResource","Ptr",hModule,"Ptr",Resource,"Ptr")
dllBuf:={Ptr:ResourcePtr,Size:ResourceSize}
} else {
dllBuf := FileRead(dllPath,"RAW")
}
return MemoryLoadLibrary(dllBuf)
}
MemoryLoadLibrary(buf) {
;https://github.com/fancycode/MemoryModule
;https://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/
e_lfanew:=NumGet(buf,0x3c,"Int") ;IMAGE_DOS_HEADER::e_lfanew
optionalSectionSize:=NumGet(buf,e_lfanew+0x38,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SectionAlignment
NumberOfSections:=NumGet(buf,e_lfanew+0x6,"uShort") ;IMAGE_NT_HEADERS::FileHeader.NumberOfSections
SizeOfOptionalHeader:=NumGet(buf,e_lfanew+0x14,"uShort") ;IMAGE_NT_HEADERS::FileHeader.SizeOfOptionalHeader
lastSectionEnd:=0
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections
while (section < end) {
endOfSection:=NumGet(buf,section+0xc,"Uint") ;IMAGE_SECTION_HEADER::VirtualAddress
SizeOfRawData:=NumGet(buf,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
if (SizeOfRawData) {
endOfSection += SizeOfRawData
} else {
endOfSection += optionalSectionSize
}
if (endOfSection > lastSectionEnd) {
lastSectionEnd := endOfSection
}
section+=0x28
}
AlignValueUp(value, alignment) {
return (value + alignment - 1) & ~(alignment - 1)
}
AlignValueDown(value, alignment) {
return value & ~(alignment - 1)
}
SectionAlignment:=NumGet(buf,e_lfanew+0x38,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SectionAlignment
SizeOfImage:=NumGet(buf,e_lfanew+0x50,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfImage
alignedImageSize := AlignValueUp(SizeOfImage, SectionAlignment)
ImageBase:=NumGet(buf,e_lfanew-A_PtrSize+0x38,"Ptr") ;IMAGE_NT_HEADERS::OptionalHeader.ImageBase
code := DllCall("VirtualAlloc","Ptr",ImageBase,"Ptr",alignedImageSize,"Uint",0x00003000,"Uint",0x04,"Ptr") ;MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE
if (!code) {
throw "//unimplemented: try to allocate memory at arbitrary position"
}
if ((((code) >> 32) < (((code + alignedImageSize)) >> 32))) {
throw "//Memory block may not span 4 GB boundaries."
}
SizeOfHeaders:=NumGet(buf,e_lfanew+0x54,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfHeaders
headers := DllCall("VirtualAlloc","Ptr",code,"Ptr",SizeOfHeaders,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
DllCall("ntdll\memcpy","Ptr",headers,"Ptr",buf,"Ptr",SizeOfHeaders)
NumPut("Ptr",code,headers,e_lfanew-A_PtrSize+0x38) ;IMAGE_NT_HEADERS::OptionalHeader.ImageBase
;CopySections START
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections
while (section < end) {
SizeOfRawData:=NumGet(headers,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
VirtualAddress:=NumGet(headers,section+0xc,"Uint") ;IMAGE_SECTION_HEADER::VirtualAddress
if (!SizeOfRawData) {
if (SectionAlignment > 0) {
DllCall("VirtualAlloc","Ptr",code+VirtualAddress,"Ptr",SectionAlignment,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
; Always use position from file to support alignments smaller
; than page size (allocation above will align to page size).
dest:=code+VirtualAddress
; NOTE: On 64bit systems we truncate to 32bit here but expand
; again later when "PhysicalAddress" is used.
NumPut("Uint",dest & 0xffffffff,headers,section+0x8) ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
DllCall("ntdll\memset","Ptr",dest,"Int",0,"Ptr",SectionAlignment)
}
section+=0x28
continue
}
DllCall("VirtualAlloc","Ptr",code+VirtualAddress,"Ptr",SizeOfRawData,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
; Always use position from file to support alignments smaller
; than page size (allocation above will align to page size).
dest:=code+VirtualAddress
PointerToRawData:=NumGet(headers,section+0x14,"Uint") ;IMAGE_SECTION_HEADER::PointerToRawData
DllCall("ntdll\memcpy","Ptr",dest,"Ptr",buf.Ptr+PointerToRawData,"Ptr",SizeOfRawData)
; NOTE: On 64bit systems we truncate to 32bit here but expand
; again later when "PhysicalAddress" is used.
NumPut("Uint",dest & 0xffffffff,headers,section+0x8) ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
section+=0x28
}
;CopySections END
locationDelta := code - ImageBase
if (locationDelta) {
throw "//unimplemented: PerformBaseRelocation()"
}
;BuildImportTable START
directory := e_lfanew+4*A_PtrSize+0x70 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
directory_Size:=NumGet(headers,directory+0x4,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size
if (directory_Size) {
directory_VirtualAddress:=NumGet(headers,directory+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
importDesc:=directory_VirtualAddress
loop {
importDesc_Name:=NumGet(code,importDesc+0xc,"Uint") ;IMAGE_IMPORT_DESCRIPTOR::Name
if (!importDesc_Name) {
break
}
handle := DllCall("LoadLibraryA","Ptr",code+importDesc_Name,"Ptr")
importDesc_OriginalFirstThunk:=NumGet(code,importDesc+0x0,"Uint") ; IMAGE_IMPORT_DESCRIPTOR::OriginalFirstThunk
importDesc_FirstThunk:=NumGet(code,importDesc+0x10,"Uint") ; IMAGE_IMPORT_DESCRIPTOR::FirstThunk
funcRef := code + importDesc_FirstThunk
if (importDesc_OriginalFirstThunk) {
thunkRef := code + importDesc_OriginalFirstThunk
} else {
; no hint table
thunkRef := funcRef
}
while (thunkRef_dereferenced:=NumGet(thunkRef,"Ptr")) {
if (thunkRef_dereferenced & (1<<(A_PtrSize<<3)-1)) {
NumPut("Ptr",DllCall("GetProcAddress","Ptr",handle,"Ptr",thunkRef_dereferenced & 0xffff,"Ptr"),funcRef)
} else {
NumPut("Ptr",DllCall("GetProcAddress","Ptr",handle,"Ptr",code+thunkRef_dereferenced+2,"Ptr"),funcRef)
}
thunkRef+=A_PtrSize, funcRef+=A_PtrSize
}
importDesc+=0x14
}
}
;BuildImportTable END
;FinalizeSections START
;READ
;COPY
;loop (Length-1) {
; READ
; UPDATE
; continue
;
; PROTECT
; COPY
;}
;PROTECT
;
;READ,(COPY,(READ,UPDATE)*,PROTECT)+
;
;possible:
;READ,UPDATE
;READ,UPDATE,PROTECT,COPY
;READ,COPY,PROTECT
;
;PROTECT:(i<=length) ? COPY : return
;COPY:(i<length) ? READ : ++i,PROTECT
;UPDATE:current_needs_to_be_copied ? PROTECT : ((i<length) ? READ : PROTECT)
;READ:(i==0) ? COPY : UPDATE
;ProtectionFlags:=[PAGE_NOACCESS,PAGE_EXECUTE,PAGE_READONLY,PAGE_EXECUTE_READ,PAGE_WRITECOPY,PAGE_EXECUTE_WRITECOPY,PAGE_READWRITE,PAGE_EXECUTE_READWRITE,]
ProtectionFlags:=[0x01,0x10,0x02,0x20,0x08,0x80,0x04,0x40,]
if (A_PtrSize==8) {
; "PhysicalAddress" might have been truncated to 32bit above, expand to
; 64bits again.
imageOffset := code & 0xffffffff00000000
} else {
imageOffset := 0
}
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections -0x28
start:=section
FinalizeSections_label:
while (section <= end) {
PhysicalAddress:=NumGet(headers,section+0x8,"Uint") ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
sectionAddress := PhysicalAddress | imageOffset
alignedAddress := AlignValueDown(sectionAddress, SectionAlignment)
sectionSize:=NumGet(headers,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
section_Characteristics:=NumGet(headers,section+0x24,"Uint") ;IMAGE_SECTION_HEADER::Characteristics
if (!sectionSize) {
if (section_Characteristics & 0x00000040) { ;IMAGE_SCN_CNT_INITIALIZED_DATA
sectionSize:=NumGet(headers,e_lfanew+0x20,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfInitializedData
} else if (section_Characteristics & 0x00000080) { ;IMAGE_SCN_CNT_UNINITIALIZED_DATA
sectionSize:=NumGet(headers,e_lfanew+0x24,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfUninitializedData
}
}
loop {
if (section == start) {
sectionAddress_carry:=sectionAddress,alignedAddress_carry:=alignedAddress,sectionSize_carry:=sectionSize,section_Characteristics_carry:=section_Characteristics
if (section < end) {
section+=0x28
continue FinalizeSections_label
} else {
++section ;will trigger break FinalizeSections_label
}
} else {
; Combine access flags of all sections that share a page
; TODO(fancycode): We currently share flags of a trailing large section
; with the page of a first small section. This should be optimized.
if (alignedAddress_carry == alignedAddress || sectionAddress_carry + sectionSize_carry > alignedAddress) {
; Section shares page with previous
section_Characteristics_carry |= (section_Characteristics & 0xfdffffff) ;~IMAGE_SCN_MEM_DISCARDABLE
section_Characteristics_carry &= (section_Characteristics | 0xfdffffff) ;~IMAGE_SCN_MEM_DISCARDABLE
sectionSize_carry := sectionAddress + sectionSize - sectionAddress_carry
if (section < end) {
section+=0x28
continue FinalizeSections_label
}
}
}
;FinalizeSection START
loop 1 {
if (!sectionSize_carry) {
break
}
if (section_Characteristics_carry & 0x02000000) { ;IMAGE_SCN_MEM_DISCARDABLE
; section is not needed any more and can safely be freed
if (sectionAddress_carry == alignedAddress_carry) {
; Only allowed to decommit whole pages
DllCall("VirtualFree","Ptr",sectionAddress_carry,"Ptr",sectionSize_carry,"Uint",0x00004000) ;MEM_DECOMMIT
}
break
}
protect := ProtectionFlags[(section_Characteristics_carry >> 29)+1]
if (section_Characteristics_carry & 0x04000000) { ;IMAGE_SCN_MEM_NOT_CACHED
protect |= 0x200 ;PAGE_NOCACHE
}
DllCall("VirtualProtect","Ptr",sectionAddress_carry,"Ptr",sectionSize_carry,"Uint",protect,"Uint*",&oldProtect:=0)
}
if (section > end) {
break FinalizeSections_label
}
;FinalizeSection END
start:=section
}
}
;FinalizeSections END
;ExecuteTLS START
directory_TLS := e_lfanew+4*A_PtrSize+0xb0 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]
directory_TLS_VirtualAddress:=NumGet(headers,directory_TLS+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress
if (directory_TLS_VirtualAddress) {
tls := code + directory_TLS_VirtualAddress
callback:=NumGet(tls,3*A_PtrSize,"Ptr") ;IMAGE_TLS_DIRECTORY::AddressOfCallBacks
if (callback) {
while (callback_dereferenced:=NumGet(callback,"Ptr")) {
DllCall(callback_dereferenced,"Ptr",code,"Uint",1,"Ptr",0) ;DLL_PROCESS_ATTACH
callback+=A_PtrSize
}
}
}
;ExecuteTLS END
; get entry point of loaded library
AddressOfEntryPoint:=NumGet(headers,e_lfanew+0x28,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.AddressOfEntryPoint
FileHeader_Characteristics:=NumGet(buf,e_lfanew+0x16,"uShort") ;IMAGE_NT_HEADERS::FileHeader.Characteristics
if (AddressOfEntryPoint) {
if (FileHeader_Characteristics & 0x2000) { ;IMAGE_FILE_DLL
DllEntry := code + AddressOfEntryPoint
DllCall(DllEntry,"Ptr",code,"Uint",1,"Ptr",0) ;DLL_PROCESS_ATTACH
}
}
GetProcAddress_map:=Map()
directory_export := e_lfanew+4*A_PtrSize+0x68 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
directory_export_VirtualAddress:=NumGet(headers,directory_export+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress
exports:=code + directory_export_VirtualAddress
nameRef:=code + NumGet(exports,0x20,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfNames
ordinal:=code + NumGet(exports,0x24,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfNameOrdinals
NumberOfNames:=NumGet(exports,0x18,"Uint") ;IMAGE_EXPORT_DIRECTORY::NumberOfNames
AddressOfFunctions:=NumGet(exports,0x1c,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfFunctions
end:=nameRef+4*NumberOfNames
while (nameRef < end) {
name:=StrGet(code + NumGet(nameRef,"Uint"),"UTF-8")
GetProcAddress_map[name] := code + NumGet(code,AddressOfFunctions + NumGet(ordinal,"uShort")*4,"Uint")
nameRef+=4,ordinal+=2
}
return GetProcAddress_map
}
/************************************************************************
* @description Use Microsoft Edge WebView2 control in ahk
* @file WebView2.ahk
* @author thqby
* @date 2023/11/20
* @version 1.0.31
* @webview2version 1.0.2151.40
***********************************************************************/
class WebView2 extends WebView2.Base {
/**
* create Edge WebView2 control.
* @param hwnd the hwnd of Gui or Control.
* @param callback Wait for the webview2 control to be created when the callback is unset; otherwise, don't wait and call the callback function after completion.
* @param createdEnvironment Create WebView2 controls from the created environment.
* @param datadir User data folder.
* @param edgeruntime The path of Edge Runtime or Edge(dev..) Bin.
* @param options The environment options of Edge. @see WebView2.EnvironmentOptions
* `{TargetCompatibleBrowserVersion?: string, AdditionalBrowserArguments?: string, AllowSingleSignOnUsingOSPrimaryAccount?: bool, Language?: string, ExclusiveUserDataFolderAccess?: bool}`
* @param dllPath The path of `WebView2Loader.dll`.
*/
static create(hwnd, callback := unset, createdEnvironment := 0, datadir := '', edgeruntime := '', options := 0, dllPath := 'WebView2Loader.dll') {
Controller := WebView2.Controller()
ControllerCompletedHandler := WebView2.Handler(ControllerCompleted_Invoke)
if (createdEnvironment)
ComCall(3, createdEnvironment, 'ptr', hwnd, 'ptr', ControllerCompletedHandler) ; ICoreWebView2Environment::CreateCoreWebView2Controller Method.
else {
if (!FileExist(dllPath) && FileExist(t := A_LineFile '\..\' (A_PtrSize * 8) 'bit\WebView2Loader.dll'))
dllPath := t
if (!edgeruntime) {
ver := '0.0.0.0'
for root in [EnvGet('ProgramFiles(x86)'), A_AppData '\..\Local']
loop files root '\Microsoft\EdgeWebView\Application\*', 'D'
if RegExMatch(A_LoopFilePath, '\\([\d.]+)$', &m) && VerCompare(m[1], ver) > 0
edgeruntime := A_LoopFileFullPath, ver := m[1]
}
EnvironmentCompletedHandler := WebView2.Handler(EnvironmentCompleted_Invoke)
if options {
if !options.HasOwnProp('TargetCompatibleBrowserVersion')
options.TargetCompatibleBrowserVersion := ver
options := WebView2.EnvironmentOptions(options)
}
WebView2Loader_GetProcAddress_map:=MemoryLoadLibrary_fromPath(dllPath)
if (R := DllCall(WebView2Loader_GetProcAddress_map['CreateCoreWebView2EnvironmentWithOptions'], 'str', edgeruntime,
'str', datadir || RegExReplace(A_AppData, 'Roaming$', 'Local\Microsoft\Edge\User Data'), 'ptr', options,
'ptr', EnvironmentCompletedHandler, 'uint')) {
ControllerCompletedHandler := EnvironmentCompletedHandler := 0
throw OSError(R)
}
}
if (!IsSet(callback))
while (!Controller.ptr)
Sleep(-1)
return Controller
EnvironmentCompleted_Invoke(com_this, hresult, createdEnvironment) {
if !createdEnvironment
throw OSError(hresult)
ComCall(3, createdEnvironment, 'ptr', hwnd, 'ptr', ControllerCompletedHandler)
EnvironmentCompletedHandler := 0
return 0
}
ControllerCompleted_Invoke(com_this, hresult, createdController) {
if !createdController
throw OSError(hresult)
DllCall('user32\GetClientRect', 'ptr', hwnd, 'ptr', RECT := Buffer(16)), ObjAddRef(createdController)
Controller.ptr := createdController, Controller.Bounds := RECT
if (IsSet(callback))
try callback(Controller)
ControllerCompletedHandler := 0
return 0
}
}
static AHKObjHelper() {
return { get: get, set: set, call: call }
get(this, prop, params := unset) {
if !IsSet(params) {
if (this is Array && prop is Integer) || (this is Map)
return this[prop]
params := []
}
return this.%prop%[params*]
}
set(this, prop, value, params := unset) {
if !IsSet(params) {
if (this is Array && prop is Integer) || (this is Map)
return this[prop] := value
params := []
}
return this.%prop%[params*] := value
}
call(this, method, params*) => this.%method%(params*)
}
; Interfaces Base class
class Base {
ptr := 0
__New(ptr := 0, addref := true) {
if ptr {
this.ptr := ptr
if (addref)
ObjAddRef(ptr)
}
}
__Delete() {
if (this.ptr)
this.Release()
}
__Call(Name, Params) {
if (HasMethod(this, 'add_' Name)) {
if (!IsInteger(handler := Params[1]) && !(handler is WebView2.Handler))
handler := WebView2.Handler(Params*)
token := this.add_%Name%(handler)
return { ptr: this.ptr, handler: handler, __Delete: this.remove_%Name%.Bind(, token) }
} else
throw Error('This value of type "' this.__Class '" has no method named "add_' Name '".', -1)
}
__Enum(n) {
if this.Base.HasOwnProp('__Item') {
if n = 1
return (n := this.Count, i := 0, (&v) => i < n ? (v := this[i++], true) : false)
return (n := this.Count, i := 0, (&k, &v, *) => i < n ? (v := this[k := i++], true) : false)
} else if n > 1
return _enum(this)
_enum(self) {
iter := self.Base.OwnProps(), iter() ; skip `__Class`
return next
next(&k, &v, *) {
while iter(&k)
if !((v := self.%k%) is Func)
return true
return false
}
}
}
AddRef() => ObjAddRef(this.ptr)
Release() => ObjRelease(this.ptr)
}
;#region WebView2 Interfaces
class AcceleratorKeyPressedEventArgs extends WebView2.Base {
static IID := '{9f760f8a-fb79-42be-9990-7b56900fa9c7}'
KeyEventKind => (ComCall(3, this, 'int*', &keyEventKind := 0), keyEventKind) ; COREWEBVIEW2_KEY_EVENT_KIND
VirtualKey => (ComCall(4, this, 'uint*', &virtualKey := 0), virtualKey)
KeyEventLParam => (ComCall(5, this, 'int*', &lParam := 0), lParam)
PhysicalKeyStatus => (ComCall(6, this, 'ptr*', physicalKeyStatus := WebView2.PHYSICAL_KEY_STATUS()), physicalKeyStatus) ; COREWEBVIEW2_PHYSICAL_KEY_STATUS
Handled {
get => (ComCall(7, this, 'int*', &handled := 0), handled)
set => ComCall(8, this, 'int', Value)
}
}
class BasicAuthenticationRequestedEventArgs extends WebView2.Base {
static IID := '{ef05516f-d897-4f9e-b672-d8e2307a3fb0}'
Uri => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Challenge => (ComCall(4, this, 'ptr*', &challenge := 0), CoTaskMem_String(challenge))
Response => (ComCall(5, this, 'ptr*', response := WebView2.BasicAuthenticationResponse()), response)
Cancel {
get => (ComCall(6, this, 'int*', &cancel := 0), cancel)
set => ComCall(7, this, 'int', Value)
}
GetDeferral() => (ComCall(8, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class BasicAuthenticationResponse extends WebView2.Base {
UserName {
get => (ComCall(3, this, 'ptr*', &userName := 0), CoTaskMem_String(userName))
set => ComCall(4, this, 'wstr', Value)
}
Password {
get => (ComCall(5, this, 'ptr*', &password := 0), CoTaskMem_String(password))
set => ComCall(6, this, 'wstr', Value)
}
}
class BrowserProcessExitedEventArgs extends WebView2.Base {
static IID := '{1f00663f-af8c-4782-9cdd-dd01c52e34cb}'
BrowserProcessExitKind => (ComCall(3, this, 'int*', &browserProcessExitKind := 0), browserProcessExitKind) ; COREWEBVIEW2_BROWSER_PROCESS_EXIT_KIND
BrowserProcessId => (ComCall(4, this, 'uint*', &value := 0), value)
}
class Certificate extends WebView2.Base {
static IID := '{C5FB2FCE-1CAC-4AEE-9C79-5ED0362EAAE0}'
Subject => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Issuer => (ComCall(4, this, 'ptr*', &value := 0), CoTaskMem_String(value))
ValidFrom => (ComCall(5, this, 'double*', &value := 0), value)
ValidTo => (ComCall(6, this, 'double*', &value := 0), value)
DerEncodedSerialNumber => (ComCall(7, this, 'ptr*', &value := 0), CoTaskMem_String(value))
DisplayName => (ComCall(8, this, 'ptr*', &value := 0), CoTaskMem_String(value))
ToPemEncoding() => (ComCall(9, this, 'ptr*', &pemEncodedData := 0), CoTaskMem_String(pemEncodedData))
PemEncodedIssuerCertificateChain => (ComCall(10, this, 'ptr*', value := WebView2.StringCollection()), value)
}
class CompositionController extends WebView2.Base {
static IID := '{3df9b733-b9ae-4a15-86b4-eb9ee9826469}'
RootVisualTarget {
get => (ComCall(3, this, 'ptr*', &target := 0), ComValue(0xd, target))
set => ComCall(4, this, 'ptr', Value)
}
SendMouseInput(eventKind, virtualKeys, mouseData, point) => ComCall(5, this, 'int', eventKind, 'int', virtualKeys, 'uint', mouseData, 'int64', point)
SendPointerInput(eventKind, pointerInfo) => ComCall(6, this, 'int', eventKind, 'ptr', pointerInfo) ; ICoreWebView2PointerInfo
Cursor => (ComCall(7, this, 'ptr*', &cursor := 0), cursor)
SystemCursorId => (ComCall(8, this, 'uint*', &systemCursorId := 0), systemCursorId)
add_CursorChanged(eventHandler) => (ComCall(9, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2CursorChangedEventHandler
remove_CursorChanged(token) => ComCall(10, this, 'int64', token)
static IID_2 := '{0b6a3d24-49cb-4806-ba20-b5e0734a7b26}'
AutomationProvider => (ComCall(11, this, 'ptr*', &provider := 0), ComValue(0xd, provider))
static IID_3 := '{9570570e-4d76-4361-9ee1-f04d0dbdfb1e}'
DragEnter(dataObject, keyState, point) => (ComCall(12, this, 'ptr', dataObject, 'uint', keyState, 'int64', point, 'uint*', &effect := 0), effect)
DragLeave() => ComCall(13, this)
DragOver(keyState, point) => (ComCall(14, this, 'uint', keyState, 'int64', point, 'uint*', &effect := 0), effect)
Drop(dataObject, keyState, point) => (ComCall(15, this, 'ptr', dataObject, 'uint', keyState, 'int64', point, 'uint*', &effect := 0), effect)
}
class Controller extends WebView2.Base {
static IID := '{4d00c0d1-9434-4eb6-8078-8697a560334f}'
__Delete() {
if (this.ptr)
this.Close(), super.__Delete()
}
Fill() {
if !this.ptr
return
DllCall('user32\GetClientRect', 'ptr', this.ParentWindow, 'ptr', RECT := Buffer(16))
this.Bounds := RECT
}
IsVisible {
get => (ComCall(3, this, 'int*', &isVisible := 0), isVisible)
set => ComCall(4, this, 'int', Value)
}
Bounds {
get => (ComCall(5, this, 'ptr', bounds := Buffer(16)), bounds)
set => A_PtrSize = 8 ? ComCall(6, this, 'ptr', Value) : ComCall(6, this, 'int64', NumGet(Value, 'int64'), 'int64', NumGet(Value, 8, 'int64'))
}
ZoomFactor {
get => (ComCall(7, this, 'double*', &zoomFactor := 0), zoomFactor)
set => ComCall(8, this, 'double', Value)
}
add_ZoomFactorChanged(eventHandler) => (ComCall(9, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ZoomFactorChangedEventHandler
remove_ZoomFactorChanged(token) => ComCall(10, this, 'int64', token)
SetBoundsAndZoomFactor(bounds, zoomFactor) => (A_PtrSize = 8 ? ComCall(11, this, 'ptr', bounds, 'double', zoomFactor) : ComCall(11, this, 'int64', NumGet(bounds, 'int64'), 'int64', NumGet(bounds, 8, 'int64'), 'double', zoomFactor))
MoveFocus(reason) => ComCall(12, this, 'int', reason)
add_MoveFocusRequested(eventHandler) => (ComCall(13, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2MoveFocusRequestedEventHandler
remove_MoveFocusRequested(token) => ComCall(14, this, 'int64', token)
add_GotFocus(eventHandler) => (ComCall(15, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FocusChangedEventHandler
remove_GotFocus(token) => ComCall(16, this, 'int64', token)
add_LostFocus(eventHandler) => (ComCall(17, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FocusChangedEventHandler
remove_LostFocus(token) => ComCall(18, this, 'int64', token)
add_AcceleratorKeyPressed(eventHandler) => (ComCall(19, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2AcceleratorKeyPressedEventHandler
remove_AcceleratorKeyPressed(token) => ComCall(20, this, 'int64', token)
ParentWindow {
get => (ComCall(21, this, 'ptr*', &parentWindow := 0), parentWindow)
set => ComCall(22, this, 'ptr', Value)
}
NotifyParentWindowPositionChanged() => ComCall(23, this)
Close() => ComCall(24, this)
CoreWebView2 => (ComCall(25, this, 'ptr*', coreWebView2 := WebView2.Core()), coreWebView2)
static IID_2 := '{c979903e-d4ca-4228-92eb-47ee3fa96eab}'
DefaultBackgroundColor {
get => (ComCall(26, this, 'uint*', &backgroundColor := 0), backgroundColor)
set => ComCall(27, this, 'uint', Value)
}
static IID_3 := '{f9614724-5d2b-41dc-aef7-73d62b51543b}'
RasterizationScale {
get => (ComCall(28, this, 'double*', &scale := 0), scale)
set => ComCall(29, this, 'double', Value)
}
ShouldDetectMonitorScaleChanges {
get => (ComCall(30, this, 'int*', &value := 0), value)
set => ComCall(31, this, 'int', Value)
}
add_RasterizationScaleChanged(eventHandler) => (ComCall(32, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2RasterizationScaleChangedEventHandler
remove_RasterizationScaleChanged(token) => ComCall(33, this, 'int64', token)
BoundsMode {
get => (ComCall(34, this, 'int*', &boundsMode := 0), boundsMode) ; COREWEBVIEW2_BOUNDS_MODE
set => ComCall(35, this, 'int', Value)
}
static IID_4 := '{97d418d5-a426-4e49-a151-e1a10f327d9e}'
AllowExternalDrop {
get => (ComCall(36, this, 'int*', &value := 0), value)
set => ComCall(37, this, 'int', Value)
}
}
class ControllerOptions extends WebView2.Base {
static IID := '{12aae616-8ccb-44ec-bcb3-eb1831881635}'
ProfileName {
get => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(4, this, 'wstr', Value)
}
IsInPrivateModeEnabled {
get => (ComCall(5, this, 'int*', &value := 0), value)
set => ComCall(6, this, 'int', Value)
}
static IID_2 := '{06c991d8-9e7e-11ed-a8fc-0242ac120002}'
ScriptLocale {
get => (ComCall(7, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(8, this, 'wstr', Value)
}
}
class ContentLoadingEventArgs extends WebView2.Base {
static IID := '{0c8a1275-9b6b-4901-87ad-70df25bafa6e}'
IsErrorPage => (ComCall(3, this, 'int*', &isErrorPage := 0), isErrorPage)
NavigationId => (ComCall(4, this, 'int64*', &navigationId := 0), navigationId)
}
class ContextMenuItem extends WebView2.Base {
static IID := '{7aed49e3-a93f-497a-811c-749c6b6b6c65}'
Name => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Label => (ComCall(4, this, 'ptr*', &value := 0), CoTaskMem_String(value))
CommandId => (ComCall(5, this, 'int*', &value := 0), value)
ShortcutKeyDescription => (ComCall(6, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Icon => (ComCall(7, this, 'ptr*', &value := 0), ComValue(0xd, value))
Kind => (ComCall(8, this, 'int*', &value := 0), value)
IsEnabled {
set => ComCall(9, this, 'int', Value)
get => (ComCall(10, this, 'int*', &value := 0), value)
}
IsChecked {
set => ComCall(11, this, 'int', Value)
get => (ComCall(12, this, 'int*', &value := 0), value)
}
Children => (ComCall(13, this, 'ptr*', value := WebView2.ContextMenuItemCollection()), value)
add_CustomItemSelected(eventHandler) => (ComCall(14, this, 'ptr', eventHandler, 'int64*', &token := 0), token)
remove_CustomItemSelected(token) => ComCall(15, this, 'int64', token)
}
class ContextMenuItemCollection extends WebView2.Base {
static IID := '{f562a2f5-c415-45cf-b909-d4b7c1e276d3}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &value := 0), value)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr*', value := WebView2.ContextMenuItem()), value)
RemoveValueAtIndex(index) => ComCall(5, this, 'uint', index)
InsertValueAtIndex(index, value) => ComCall(6, this, 'uint', index, 'ptr', value)
}
class ContextMenuRequestedEventArgs extends WebView2.Base {
static IID := '{a1d309ee-c03f-11eb-8529-0242ac130003}'
MenuItems => (ComCall(3, this, 'ptr*', value := WebView2.ContextMenuItemCollection()), value)
ContextMenuTarget => (ComCall(4, this, 'ptr*', value := WebView2.ContextMenuTarget()), value)
Location => (ComCall(5, this, 'int64*', &value := 0), value)
SelectedCommandId {
set => ComCall(6, this, 'int', Value)
get => (ComCall(7, this, 'int*', &value := 0), value)
}
Handled {
set => ComCall(8, this, 'int', Value)
get => (ComCall(9, this, 'int*', &value := 0), value)
}
GetDeferral() => (ComCall(10, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class ContextMenuTarget extends WebView2.Base {
static IID := '{b8611d99-eed6-4f3f-902c-a198502ad472}'
Kind => (ComCall(3, this, 'int*', &value := 0), value) ; COREWEBVIEW2_CONTEXT_MENU_TARGET_KIND
IsEditable => (ComCall(4, this, 'int*', &value := 0), value)
IsRequestedForMainFrame => (ComCall(5, this, 'int*', &value := 0), value)
PageUri => (ComCall(6, this, 'ptr*', &value := 0), CoTaskMem_String(value))
FrameUri => (ComCall(7, this, 'ptr*', &value := 0), CoTaskMem_String(value))
HasLinkUri => (ComCall(8, this, 'int*', &value := 0), value)
LinkUri => (ComCall(9, this, 'ptr*', &value := 0), CoTaskMem_String(value))
HasLinkText => (ComCall(10, this, 'int*', &value := 0), value)
LinkText => (ComCall(11, this, 'ptr*', &value := 0), CoTaskMem_String(value))
HasSourceUri => (ComCall(12, this, 'int*', &value := 0), value)
SourceUri => (ComCall(13, this, 'ptr*', &value := 0), CoTaskMem_String(value))
HasSelection => (ComCall(14, this, 'int*', &value := 0), value)
Selection => (ComCall(15, this, 'ptr*', &value := 0), CoTaskMem_String(value))
}
class Cookie extends WebView2.Base {
static IID := '{AD26D6BE-1486-43E6-BF87-A2034006CA21}'
Name => (ComCall(3, this, 'ptr*', &name := 0), CoTaskMem_String(name))
Value {
get => (ComCall(4, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(5, this, 'wstr', Value)
}
Domain => (ComCall(6, this, 'ptr*', &domain := 0), CoTaskMem_String(domain))
Path => (ComCall(7, this, 'ptr*', &path := 0), CoTaskMem_String(path))
Expires {
get => (ComCall(8, this, 'double*', &expires := 0), expires)
set => ComCall(9, this, 'double', Value)
}
IsHttpOnly {
get => (ComCall(10, this, 'int*', &isHttpOnly := 0), isHttpOnly)
set => ComCall(11, this, 'int', Value)
}
SameSite {
get => (ComCall(12, this, 'int*', &sameSite := 0), sameSite) ; COREWEBVIEW2_COOKIE_SAME_SITE_KIND
set => ComCall(13, this, 'int', Value)
}
IsSecure {
get => (ComCall(14, this, 'int*', &isSecure := 0), isSecure)
set => ComCall(15, this, 'int', Value)
}
IsSession => (ComCall(16, this, 'int*', &isSession := 0), isSession)
}
class CookieList extends WebView2.Base {
static IID := '{F7F6F714-5D2A-43C6-9503-346ECE02D186}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &count := 0), count)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr*', cookie := WebView2.Cookie()), cookie)
}
class CookieManager extends WebView2.Base {
static IID := '{177CD9E7-B6F5-451A-94A0-5D7A3A4C4141}'
CreateCookie(name, value, domain, path) => (ComCall(3, this, 'wstr', name, 'wstr', value, 'wstr', domain, 'wstr', path, 'ptr*', cookie := WebView2.Cookie()), cookie)
CopyCookie(cookieParam) => (ComCall(4, this, 'ptr', cookieParam, 'ptr*', cookie := WebView2.Cookie()), cookie) ; ICoreWebView2Cookie
GetCookies(uri, handler) => ComCall(5, this, 'wstr', uri, 'ptr', handler) ; ICoreWebView2GetCookiesCompletedHandler
AddOrUpdateCookie(cookie) => ComCall(6, this, 'ptr', cookie) ; ICoreWebView2Cookie
DeleteCookie(cookie) => ComCall(7, this, 'ptr', cookie) ; ICoreWebView2Cookie
DeleteCookies(name, uri) => ComCall(8, this, 'wstr', name, 'wstr', uri)
DeleteCookiesWithDomainAndPath(name, domain, path) => ComCall(9, this, 'wstr', name, 'wstr', domain, 'wstr', path)
DeleteAllCookies() => ComCall(10, this)
}
class Core extends WebView2.Base {
static IID := '{76eceacb-0462-4d94-ac83-423a6793775e}'
AddAHKObjHelper() => this.AddHostObjectToScript('AHKObjHelper', WebView2.AHKObjHelper())
Settings => (ComCall(3, this, 'ptr*', settings := WebView2.Settings()), settings)
Source => (ComCall(4, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
Navigate(uri) => ComCall(5, this, 'wstr', uri)
NavigateToString(htmlContent) => ComCall(6, this, 'wstr', htmlContent)
add_NavigationStarting(eventHandler) => (ComCall(7, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NavigationStartingEventHandler
remove_NavigationStarting(token) => ComCall(8, this, 'int64', token)
add_ContentLoading(eventHandler) => (ComCall(9, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ContentLoadingEventHandler
remove_ContentLoading(token) => ComCall(10, this, 'int64', token)
add_SourceChanged(eventHandler) => (ComCall(11, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2SourceChangedEventHandler
remove_SourceChanged(token) => ComCall(12, this, 'int64', token)
add_HistoryChanged(eventHandler) => (ComCall(13, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2HistoryChangedEventHandler
remove_HistoryChanged(token) => ComCall(14, this, 'int64', token)
add_NavigationCompleted(eventHandler) => (ComCall(15, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NavigationCompletedEventHandler
remove_NavigationCompleted(token) => ComCall(16, this, 'int64', token)
add_FrameNavigationStarting(eventHandler) => (ComCall(17, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NavigationStartingEventHandler
remove_FrameNavigationStarting(token) => ComCall(18, this, 'int64', token)
add_FrameNavigationCompleted(eventHandler) => (ComCall(19, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NavigationCompletedEventHandler
remove_FrameNavigationCompleted(token) => ComCall(20, this, 'int64', token)
add_ScriptDialogOpening(eventHandler) => (ComCall(21, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ScriptDialogOpeningEventHandler
remove_ScriptDialogOpening(token) => ComCall(22, this, 'int64', token)
add_PermissionRequested(eventHandler) => (ComCall(23, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2PermissionRequestedEventHandler
remove_PermissionRequested(token) => ComCall(24, this, 'int64', token)
add_ProcessFailed(eventHandler) => (ComCall(25, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ProcessFailedEventHandler
remove_ProcessFailed(token) => ComCall(26, this, 'int64', token)
AddScriptToExecuteOnDocumentCreated(javaScript, handler) => ComCall(27, this, 'wstr', javaScript, 'ptr', handler) ; ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler
RemoveScriptToExecuteOnDocumentCreated(id) => ComCall(28, this, 'wstr', id)
ExecuteScript(javaScript, handler) => ComCall(29, this, 'wstr', javaScript, 'ptr', handler) ; ICoreWebView2ExecuteScriptCompletedHandler
CapturePreview(imageFormat, imageStream, handler) => ComCall(30, this, 'int', imageFormat, 'ptr', imageStream, 'ptr', handler) ; ICoreWebView2CapturePreviewCompletedHandler
Reload() => ComCall(31, this)
PostWebMessageAsJson(webMessageAsJson) => ComCall(32, this, 'wstr', webMessageAsJson)
PostWebMessageAsString(webMessageAsString) => ComCall(33, this, 'wstr', webMessageAsString)
add_WebMessageReceived(handler) => (ComCall(34, this, 'ptr', handler, 'int64*', &token := 0), token) ; ICoreWebView2WebMessageReceivedEventHandler
remove_WebMessageReceived(token) => ComCall(35, this, 'int64', token)
CallDevToolsProtocolMethod(methodName, parametersAsJson, handler) => ComCall(36, this, 'wstr', methodName, 'wstr', parametersAsJson, 'ptr', handler) ; ICoreWebView2CallDevToolsProtocolMethodCompletedHandler
BrowserProcessId => (ComCall(37, this, 'uint*', &value := 0), value)
CanGoBack => (ComCall(38, this, 'int*', &canGoBack := 0), canGoBack)
CanGoForward => (ComCall(39, this, 'int*', &canGoForward := 0), canGoForward)
GoBack() => ComCall(40, this)
GoForward() => ComCall(41, this)
GetDevToolsProtocolEventReceiver(eventName) => (ComCall(42, this, 'wstr', eventName, 'ptr*', receiver := WebView2.DevToolsProtocolEventReceiver()), receiver)
Stop() => ComCall(43, this)
add_NewWindowRequested(eventHandler) => (ComCall(44, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NewWindowRequestedEventHandler
remove_NewWindowRequested(token) => ComCall(45, this, 'int64', token)
add_DocumentTitleChanged(eventHandler) => (ComCall(46, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2DocumentTitleChangedEventHandler
remove_DocumentTitleChanged(token) => ComCall(47, this, 'int64', token)
DocumentTitle => (ComCall(48, this, 'ptr*', &title := 0), CoTaskMem_String(title))
AddHostObjectToScript(name, object) => ComCall(49, this, 'wstr', name, 'ptr', ComVar(object))
RemoveHostObjectFromScript(name) => ComCall(50, this, 'wstr', name)
OpenDevToolsWindow() => ComCall(51, this)
add_ContainsFullScreenElementChanged(eventHandler) => (ComCall(52, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ContainsFullScreenElementChangedEventHandler
remove_ContainsFullScreenElementChanged(token) => ComCall(53, this, 'int64', token)
ContainsFullScreenElement => (ComCall(54, this, 'int*', &containsFullScreenElement := 0), containsFullScreenElement)
add_WebResourceRequested(eventHandler) => (ComCall(55, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2WebResourceRequestedEventHandler
remove_WebResourceRequested(token) => ComCall(56, this, 'int64', token)
AddWebResourceRequestedFilter(uri, resourceContext) => ComCall(57, this, 'wstr', uri, 'int', resourceContext)
RemoveWebResourceRequestedFilter(uri, resourceContext) => ComCall(58, this, 'wstr', uri, 'int', resourceContext)
add_WindowCloseRequested(eventHandler) => (ComCall(59, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2WindowCloseRequestedEventHandler
remove_WindowCloseRequested(token) => ComCall(60, this, 'int64', token)
static IID_2 := '{9E8F0CF8-E670-4B5E-B2BC-73E061E3184C}'
add_WebResourceResponseReceived(eventHandler) => (ComCall(61, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2WebResourceResponseReceivedEventHandler
remove_WebResourceResponseReceived(token) => ComCall(62, this, 'int64', token)
NavigateWithWebResourceRequest(request) => ComCall(63, this, 'ptr', request) ; ICoreWebView2WebResourceRequest
add_DOMContentLoaded(eventHandler) => (ComCall(64, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2DOMContentLoadedEventHandler
remove_DOMContentLoaded(token) => ComCall(65, this, 'int64', token)
CookieManager => (ComCall(66, this, 'ptr*', cookieManager := WebView2.CookieManager()), cookieManager)
Environment => (ComCall(67, this, 'ptr*', environment := WebView2.Environment()), environment)
static IID_3 := '{A0D6DF20-3B92-416D-AA0C-437A9C727857}'
TrySuspend(handler) => ComCall(68, this, 'ptr', handler) ; ICoreWebView2TrySuspendCompletedHandler
Resume() => ComCall(69, this)
IsSuspended => (ComCall(70, this, 'int*', &isSuspended := 0), isSuspended)
SetVirtualHostNameToFolderMapping(hostName, folderPath, accessKind) => ComCall(71, this, 'wstr', hostName, 'wstr', folderPath, 'int', accessKind)
ClearVirtualHostNameToFolderMapping(hostName) => ComCall(72, this, 'wstr', hostName)
static IID_4 := '{20d02d59-6df2-42dc-bd06-f98a694b1302}'
add_FrameCreated(eventHandler) => (ComCall(73, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameCreatedEventHandler
remove_FrameCreated(token) => ComCall(74, this, 'int64', token)
add_DownloadStarting(eventHandler) => (ComCall(75, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2DownloadStartingEventHandler
remove_DownloadStarting(token) => ComCall(76, this, 'int64', token)
static IID_5 := '{bedb11b8-d63c-11eb-b8bc-0242ac130003}'
add_ClientCertificateRequested(eventHandler) => (ComCall(77, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ClientCertificateRequestedEventHandler
remove_ClientCertificateRequested(token) => ComCall(78, this, 'int64', token)
static IID_6 := '{499aadac-d92c-4589-8a75-111bfc167795}'
OpenTaskManagerWindow() => ComCall(79, this)
static IID_7 := '{79c24d83-09a3-45ae-9418-487f32a58740}'
PrintToPdf(resultFilePath, printSettings, handler) => ComCall(80, this, 'wstr', resultFilePath, 'ptr', printSettings, 'ptr', handler)
static IID_8 := '{E9632730-6E1E-43AB-B7B8-7B2C9E62E094}'
add_IsMutedChanged(eventHandler) => (ComCall(81, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2IsMutedChangedEventHandler
remove_IsMutedChanged(token) => ComCall(82, this, 'int64', token)
IsMuted {
get => (ComCall(83, this, 'int*', &value := 0), value)
set => ComCall(84, this, 'int', Value)
}
add_IsDocumentPlayingAudioChanged(eventHandler) => (ComCall(85, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2IsDocumentPlayingAudioChangedEventHandler
remove_IsDocumentPlayingAudioChanged(token) => ComCall(86, this, 'int64', token)
IsDocumentPlayingAudio => (ComCall(87, this, 'int*', &value := 0), value)
static IID_9 := '{4d7b2eab-9fdc-468d-b998-a9260b5ed651}'
add_IsDefaultDownloadDialogOpenChanged(handler) => (ComCall(88, this, 'ptr', handler, 'int64*', &token := 0), token) ; ICoreWebView2IsDefaultDownloadDialogOpenChangedEventHandler
remove_IsDefaultDownloadDialogOpenChanged(token) => ComCall(89, this, 'int64', &token := 0)
IsDefaultDownloadDialogOpen => (ComCall(90, this, 'int*', &value := 0), value)
OpenDefaultDownloadDialog() => ComCall(91, this)
CloseDefaultDownloadDialog() => ComCall(92, this)
DefaultDownloadDialogCornerAlignment {
get => (ComCall(93, this, 'int*', &value := 0), value)
set => ComCall(94, this, 'int', Value)
}
DefaultDownloadDialogMargin {
get => (ComCall(95, this, 'int64*', &value := 0), value) ; POINT
set => ComCall(96, this, 'int64', Value)
}
static IID_10 := '{b1690564-6f5a-4983-8e48-31d1143fecdb}'
add_BasicAuthenticationRequested(eventHandler) => (ComCall(97, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2BasicAuthenticationRequestedEventHandler
remove_BasicAuthenticationRequested(token) => ComCall(98, this, 'int64', &token := 0)
static IID_11 := '{0be78e56-c193-4051-b943-23b460c08bdb}'
CallDevToolsProtocolMethodForSession(sessionId, methodName, parametersAsJson, handler) => ComCall(99, this, 'wstr', sessionId, 'wstr', methodName, 'wstr', parametersAsJson, 'ptr', handler)
add_ContextMenuRequested(eventHandler) => (ComCall(100, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ContextMenuRequestedEventHandler
remove_ContextMenuRequested(token) => ComCall(101, this, 'int64', &token := 0)
static IID_12 := '{35D69927-BCFA-4566-9349-6B3E0D154CAC}'
add_StatusBarTextChanged(eventHandler) => (ComCall(102, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2StatusBarTextChangedEventHandler
remove_StatusBarTextChanged(token) => ComCall(103, this, 'int64', &token := 0)
StatusBarText => (ComCall(104, this, 'ptr*', &value := 0), CoTaskMem_String(value))
static IID_13 := '{F75F09A8-667E-4983-88D6-C8773F315E84}'
Profile => (ComCall(105, this, 'ptr*', value := WebView2.Profile()), value)
static IID_14 := '{6DAA4F10-4A90-4753-8898-77C5DF534165}'
add_ServerCertificateErrorDetected(eventHandler) => (ComCall(106, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ServerCertificateErrorDetectedEventHandler
remove_ServerCertificateErrorDetected(token) => ComCall(107, this, 'int64', &token := 0)
ClearServerCertificateErrorActions(handler) => ComCall(108, this, 'ptr', handler) ; ICoreWebView2ClearServerCertificateErrorActionsCompletedHandler
static IID_15 := '{517B2D1D-7DAE-4A66-A4F4-10352FFB9518}'
add_FaviconChanged(eventHandler) => (ComCall(109, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FaviconChangedEventHandler
remove_FaviconChanged(token) => ComCall(110, this, 'int64', token)
FaviconUri => (ComCall(111, this, 'ptr*', &value := 0), CoTaskMem_String(value))
GetFavicon(format, completedHandler) => ComCall(112, this, 'int', format, 'ptr', completedHandler) ; COREWEBVIEW2_FAVICON_IMAGE_FORMAT, ICoreWebView2GetFaviconCompletedHandler
static IID_16 := '{0EB34DC9-9F91-41E1-8639-95CD5943906B}'
Print(printSettings, handler) => ComCall(113, this, 'ptr', printSettings, 'ptr', handler)
ShowPrintUI(printDialogKind) => ComCall(114, this, 'int', printDialogKind)
PrintToPdfStream(printSettings, handler) => ComCall(115, this, 'ptr', printSettings, 'ptr', handler)
static IID_17 := '{702E75D4-FD44-434D-9D70-1A68A6B1192A}'
PostSharedBufferToScript(sharedBuffer, access, additionalDataAsJson) => ComCall(116, this, 'ptr', sharedBuffer, 'int', access, 'wstr', additionalDataAsJson)
static IID_18 := '{7A626017-28BE-49B2-B865-3BA2B3522D90}'
add_LaunchingExternalUriScheme(eventHandler) => (ComCall(117, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2LaunchingExternalUriSchemeEventHandler
remove_LaunchingExternalUriScheme(token) => ComCall(118, this, 'int64', token)
static IID_19 := '{6921F954-79B0-437F-A997-C85811897C68}'
MemoryUsageTargetLevel {
get => (ComCall(119, this, 'int*', &level := 0), level)
set => ComCall(120, this, 'int', Value)
}
}
class ClientCertificate extends WebView2.Base {
static IID := '{e7188076-bcc3-11eb-8529-0242ac130003}'
Subject => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Issuer => (ComCall(4, this, 'ptr*', &value := 0), CoTaskMem_String(value))
ValidFrom => (ComCall(5, this, 'double*', &value := 0), value)
ValidTo => (ComCall(6, this, 'double*', &value := 0), value)
DerEncodedSerialNumber => (ComCall(7, this, 'ptr*', &value := 0), CoTaskMem_String(value))
DisplayName => (ComCall(8, this, 'ptr*', &value := 0), CoTaskMem_String(value))
ToPemEncoding() => (ComCall(9, this, 'ptr*', &pemEncodedData := 0), CoTaskMem_String(pemEncodedData))
PemEncodedIssuerCertificateChain => (ComCall(10, this, 'ptr*', value := WebView2.StringCollection()), value)
Kind => (ComCall(11, this, 'int*', &value := 0), value) ; COREWEBVIEW2_CLIENT_CERTIFICATE_KIND
}
class CustomSchemeRegistration extends Buffer {
static IID := '{d60ac92c-37a6-4b26-a39e-95cfe59047bb}'
/**
* Represents the registration of a custom scheme with the CoreWebView2Environment.
* https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2customschemeregistration
* @param {String} SchemeName The name of the custom scheme to register.
* @param {Array} AllowedOrigins The array of origins that are allowed to use the scheme.
* @param TreatAsSecure Whether the sites with this scheme will be treated as a Secure Context like an HTTPS site.
* @param HasAuthorityComponent Set this property to true if the URIs with this custom scheme will have an authority component (a host for custom schemes).
*/
__New(SchemeName, AllowedOrigins, TreatAsSecure := false, HasAuthorityComponent := false) {
super.__New(11 * A_PtrSize)
p_this := ObjPtr(this), p_unk := this.Ptr + A_PtrSize
p := NumPut('ptr', p_unk, this), fnptrs := []
this.DefineProp('__Delete', { call: __Delete })
for cb in [
QueryInterface, AddRef, Release,
get_SchemeName, get_TreatAsSecure, put_xxx,
GetAllowedOrigins, SetAllowedOrigins,
get_HasAuthorityComponent, put_xxx
]
p := NumPut('ptr', _ := CallbackCreate(cb), p), fnptrs.Push(_)
QueryInterface(this, riid, ppvObject) {
DllCall("ole32.dll\StringFromGUID2", "ptr", riid, "ptr", buf := Buffer(78), "int", 39)
iid := StrGet(buf)
if iid = '{d60ac92c-37a6-4b26-a39e-95cfe59047bb}' {
ObjAddRef(p_this), NumPut('ptr', p_unk, ppvObject)
return 0
}
NumPut('ptr', 0, ppvObject)
return 0x80004002
}
AddRef(this) => ObjAddRef(p_this)
Release(this) => ObjRelease(p_this)
put_xxx(this, value) => 0
get_SchemeName(this, pvalue) {
pm := DllCall('ole32\CoTaskMemAlloc', 'uptr', s := StrLen(SchemeName) * 2 + 2, 'ptr')
DllCall('RtlMoveMemory', 'ptr', pm, 'ptr', StrPtr(SchemeName), 'uptr', s)
return (NumPut('ptr', pm, pvalue), 0)
}
get_TreatAsSecure(this, pvalue) => (NumPut('int', TreatAsSecure, pvalue), 0)
get_HasAuthorityComponent(this, pvalue) => (NumPut('int', HasAuthorityComponent, pvalue), 0)
GetAllowedOrigins(this, pallowedOriginsCount, pallowedOrigins) {
local l, p, pm, ps
NumPut('uint', l := AllowedOrigins.Length, pallowedOriginsCount)
if l {
pm := p := DllCall('ole32\CoTaskMemAlloc', 'uptr', l * A_PtrSize, 'ptr')
for origin in AllowedOrigins {
ps := DllCall('ole32\CoTaskMemAlloc', 'uptr', s := StrLen(origin) * 2 + 2, 'ptr')
DllCall('RtlMoveMemory', 'ptr', ps, 'ptr', StrPtr(origin), 'uptr', s)
p := NumPut('ptr', ps, p)
}
} else pm := 0
NumPut('ptr', pm, pallowedOrigins)
return 0
}
SetAllowedOrigins(this, allowedOriginsCount, pallowedOrigins) {
AllowedOrigins := []
loop allowedOriginsCount
AllowedOrigins.Push(StrGet(NumGet(pallowedOrigins, (A_Index - 1) * A_PtrSize, 'ptr')))
return 0
}
__Delete(*) {
for ptr in fnptrs
CallbackFree(ptr)
}
}
}
class ClientCertificateCollection extends WebView2.Base {
static IID := '{ef5674d2-bcc3-11eb-8529-0242ac130003}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &value := 0), value)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr*', certificate := WebView2.ClientCertificate()), certificate)
}
class ClientCertificateRequestedEventArgs extends WebView2.Base {
static IID := '{bc59db28-bcc3-11eb-8529-0242ac130003}'
Host => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
Port => (ComCall(4, this, 'int*', &value := 0), value)
IsProxy => (ComCall(5, this, 'int*', &value := 0), value)
AllowedCertificateAuthorities => (ComCall(6, this, 'ptr*', value := WebView2.StringCollection()), value)
MutuallyTrustedCertificates => (ComCall(7, this, 'ptr*', value := WebView2.ClientCertificateCollection()), value)
SelectedCertificate {
get => (ComCall(8, this, 'ptr*', value := WebView2.ClientCertificate()), value)
set => ComCall(9, this, 'ptr', Value)
}
Cancel {
get => (ComCall(10, this, 'int*', &value := 0), value)
set => ComCall(11, this, 'int', Value)
}
Handled {
get => (ComCall(12, this, 'int*', &value := 0), value)
set => ComCall(13, this, 'int', Value)
}
GetDeferral() => (ComCall(14, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class DOMContentLoadedEventArgs extends WebView2.Base {
static IID := '{16B1E21A-C503-44F2-84C9-70ABA5031283}'
NavigationId => (ComCall(3, this, 'int64*', &navigationId := 0), navigationId)
}
class Deferral extends WebView2.Base {
static IID := '{c10e7f7b-b585-46f0-a623-8befbf3e4ee0}'
Complete() => ComCall(3, this)
}
class DevToolsProtocolEventReceivedEventArgs extends WebView2.Base {
static IID := '{653c2959-bb3a-4377-8632-b58ada4e66c4}'
ParameterObjectAsJson => (ComCall(3, this, 'ptr*', ¶meterObjectAsJson := 0), CoTaskMem_String(parameterObjectAsJson))
static IID_2 := '{2DC4959D-1494-4393-95BA-BEA4CB9EBD1B}'
SessionId => (ComCall(4, this, 'ptr*', &sessionId := 0), CoTaskMem_String(sessionId))
}
class DevToolsProtocolEventReceiver extends WebView2.Base {
static IID := '{b32ca51a-8371-45e9-9317-af021d080367}'
add_DevToolsProtocolEventReceived(handler) => (ComCall(3, this, 'ptr', handler, 'int64*', &token := 0), token) ; ICoreWebView2DevToolsProtocolEventReceivedEventHandler
remove_DevToolsProtocolEventReceived(token) => ComCall(4, this, 'int64', token)
}
class DownloadOperation extends WebView2.Base {
static IID := '{3d6b6cf2-afe1-44c7-a995-c65117714336}'
add_BytesReceivedChanged(eventHandler) => (ComCall(3, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2BytesReceivedChangedEventHandler
remove_BytesReceivedChanged(token) => ComCall(4, this, 'int64', token)
add_EstimatedEndTimeChanged(eventHandler) => (ComCall(5, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2EstimatedEndTimeChangedEventHandler
remove_EstimatedEndTimeChanged(token) => ComCall(6, this, 'int64', token)
add_StateChanged(eventHandler) => (ComCall(7, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2StateChangedEventHandler
remove_StateChanged(token) => ComCall(8, this, 'int64', token)
Uri => (ComCall(9, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
ContentDisposition => (ComCall(10, this, 'ptr*', &contentDisposition := 0), CoTaskMem_String(contentDisposition))
MimeType => (ComCall(11, this, 'ptr*', &mimeType := 0), CoTaskMem_String(mimeType))
TotalBytesToReceive => (ComCall(12, this, 'int64*', &totalBytesToReceive := 0), totalBytesToReceive)
BytesReceived => (ComCall(13, this, 'int64*', &bytesReceived := 0), bytesReceived)
EstimatedEndTime => (ComCall(14, this, 'ptr*', &estimatedEndTime := 0), CoTaskMem_String(estimatedEndTime))
ResultFilePath => (ComCall(15, this, 'ptr*', &resultFilePath := 0), CoTaskMem_String(resultFilePath))
State => (ComCall(16, this, 'int*', &downloadState := 0), downloadState) ; COREWEBVIEW2_DOWNLOAD_STATE
InterruptReason => (ComCall(17, this, 'int*', &interruptReason := 0), interruptReason) ; COREWEBVIEW2_DOWNLOAD_INTERRUPT_REASON
Cancel() => ComCall(18, this)
Pause() => ComCall(19, this)
Resume() => ComCall(20, this)
CanResume => (ComCall(21, this, 'int*', &canResume := 0), canResume)
}
class DownloadStartingEventArgs extends WebView2.Base {
static IID := '{e99bbe21-43e9-4544-a732-282764eafa60}'
DownloadOperation => (ComCall(3, this, 'ptr*', downloadOperation := WebView2.DownloadOperation()), downloadOperation)
Cancel {
get => (ComCall(4, this, 'int*', &cancel := 0), cancel)
set => ComCall(5, this, 'int', Value)
}
ResultFilePath {
get => (ComCall(6, this, 'ptr*', &resultFilePath := 0), CoTaskMem_String(resultFilePath))
set => ComCall(7, this, 'wstr', Value)
}
Handled {
get => (ComCall(8, this, 'int*', &handled := 0), handled)
set => ComCall(9, this, 'int', Value)
}
GetDeferral() => (ComCall(10, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class Environment extends WebView2.Base {
static IID := '{b96d755e-0319-4e92-a296-23436f46a1fc}'
CreateCoreWebView2Controller(parentWindow, handler) => ComCall(3, this, 'ptr', parentWindow, 'ptr', handler) ; ICoreWebView2CreateCoreWebView2ControllerCompletedHandler
CreateWebResourceResponse(content, statusCode, reasonPhrase, headers) => (ComCall(4, this, 'ptr', content, 'int', statusCode, 'wstr', reasonPhrase, 'wstr', headers, 'ptr*', response := WebView2.WebResourceResponse()), response)
BrowserVersionString => (ComCall(5, this, 'ptr*', &versionInfo := 0), CoTaskMem_String(versionInfo))
add_NewBrowserVersionAvailable(eventHandler) => (ComCall(6, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2NewBrowserVersionAvailableEventHandler
remove_NewBrowserVersionAvailable(token) => ComCall(7, this, 'int64', token)
static IID_2 := '{41F3632B-5EF4-404F-AD82-2D606C5A9A21}'
CreateWebResourceRequest(uri, method, postData, headers) => (ComCall(8, this, 'wstr', uri, 'wstr', method, 'ptr', postData, 'wstr', headers, 'ptr*', request := WebView2.WebResourceRequest()), request)
static IID_3 := '{80a22ae3-be7c-4ce2-afe1-5a50056cdeeb}'
CreateCoreWebView2CompositionController(parentWindow, handler) => ComCall(9, this, 'ptr', parentWindow, 'ptr', handler) ; ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler
CreateCoreWebView2PointerInfo() => (ComCall(10, this, 'ptr*', pointerInfo := WebView2.PointerInfo()), pointerInfo)
static IID_4 := '{20944379-6dcf-41d6-a0a0-abc0fc50de0d}'
GetAutomationProviderForWindow(hwnd) => (ComCall(11, this, 'ptr', hwnd, 'ptr*', &provider := 0), ComValue(0xd, provider))
static IID_5 := '{319e423d-e0d7-4b8d-9254-ae9475de9b17}'
add_BrowserProcessExited(eventHandler) => (ComCall(12, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2BrowserProcessExitedEventHandler
remove_BrowserProcessExited(token) => ComCall(13, this, 'int64', token)
static IID_6 := '{e59ee362-acbd-4857-9a8e-d3644d9459a9}'
CreatePrintSettings() => (ComCall(14, this, 'ptr*', printSettings := WebView2.PrintSettings()), printSettings)
static IID_7 := '{43C22296-3BBD-43A4-9C00-5C0DF6DD29A2}'
UserDataFolder => (ComCall(15, this, 'ptr*', &value := 0), CoTaskMem_String(value))
static IID_8 := '{D6EB91DD-C3D2-45E5-BD29-6DC2BC4DE9CF}'
add_ProcessInfosChanged(eventHandler) => (ComCall(16, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2ProcessInfosChangedEventHandler
remove_ProcessInfosChanged(token) => ComCall(17, this, 'int64', token)
GetProcessInfos() => (ComCall(18, this, 'ptr*', value := WebView2.ProcessInfoCollection()), value)
static IID_9 := '{f06f41bf-4b5a-49d8-b9f6-fa16cd29f274}'
CreateContextMenuItem(label, iconStream, kind) => (ComCall(19, this, 'wstr', label, 'ptr', iconStream, 'int', kind, 'ptr', item := WebView2.ContextMenuItem()), item) ; IStream*, COREWEBVIEW2_CONTEXT_MENU_ITEM_KIND
static IID_10 := '{ee0eb9df-6f12-46ce-b53f-3f47b9c928e0}'
CreateCoreWebView2ControllerOptions() => (ComCall(20, this, 'ptr*', options := WebView2.ControllerOptions()), options)
CreateCoreWebView2ControllerWithOptions(parentWindow, options, handler) => ComCall(21, this, 'ptr', parentWindow, 'ptr', options, 'ptr', handler) ; ICoreWebView2ControllerOptions, ICoreWebView2CreateCoreWebView2ControllerCompletedHandler
CreateCoreWebView2CompositionControllerWithOptions(parentWindow, options, handler) => ComCall(22, this, 'ptr', parentWindow, 'ptr', options, 'ptr', handler) ; ICoreWebView2ControllerOptions, ICoreWebView2CreateCoreWebView2CompositionControllerCompletedHandler
static IID_11 := '{F0913DC6-A0EC-42EF-9805-91DFF3A2966A}'
FailureReportFolderPath => (ComCall(23, this, 'ptr*', &value := 0), CoTaskMem_String(value))
static IID_12 := '{F503DB9B-739F-48DD-B151-FDFCF253F54E}'
CreateSharedBuffer(size) => (ComCall(24, this, 'uint64', size, 'ptr', shared_buffer := WebView2.SharedBuffer()), shared_buffer)
}
class EnvironmentOptions extends Buffer {
/**
* @param {Object} opts Options used to create WebView2 Environment.
* @param {String} opts.AdditionalBrowserArguments Changes the behavior of the WebView.
* @param {Bool} opts.AllowSingleSignOnUsingOSPrimaryAccount The AllowSingleSignOnUsingOSPrimaryAccount property is used to enable single sign on with Azure Active Directory (AAD) and personal Microsoft Account (MSA) resources inside WebView.
* @param {String} opts.Language The default display language for WebView.
* @param {String} opts.TargetCompatibleBrowserVersion Specifies the version of the WebView2 Runtime binaries required to be compatible with your app.
* @param {Bool} opts.ExclusiveUserDataFolderAccess Whether other processes can create WebView2 from WebView2Environment created with the same user data folder and therefore sharing the same WebView browser process instance.
* @param {Bool} opts.IsCustomCrashReportingEnabled When IsCustomCrashReportingEnabled is set to TRUE, Windows won't send crash data to Microsoft endpoint.
* @param {Array} opts.CustomSchemeRegistrations Array of custom scheme registrations.
* @param {Bool} opts.EnableTrackingPrevention The EnableTrackingPrevention property is used to enable/disable tracking prevention feature in WebView2.
*/
__New(opts) {
cbs := [
; options
QueryInterface, AddRef, Release,
get_xxx_str.Bind('AdditionalBrowserArguments'), put_xxx,
get_xxx_str.Bind('Language'), put_xxx,
get_xxx_str.Bind('TargetCompatibleBrowserVersion'), put_xxx,
get_xxx_bool.Bind('AllowSingleSignOnUsingOSPrimaryAccount'), put_xxx,
; options2
QueryInterface, AddRef, Release,
get_xxx_bool.Bind('ExclusiveUserDataFolderAccess'), put_xxx,
; options3
QueryInterface, AddRef, Release,
get_xxx_bool.Bind('IsCustomCrashReportingEnabled'), put_xxx,
; options4
QueryInterface, AddRef, Release,
GetCustomSchemeRegistrations, SetCustomSchemeRegistrations,
; options5
QueryInterface, AddRef, Release,
get_xxx_bool.Bind('EnableTrackingPrevention'), put_xxx,
]
n := 5, i := 0
super.__New((n + cbs.Length) * A_PtrSize)
p_this := ObjPtr(this), p_unk := this.Ptr, p := p_unk + n * A_PtrSize
mp := Map(), fnptrs := [], this.DefineProp('__Delete', { call: __Delete })
for cb in cbs {
if cb == QueryInterface
NumPut('ptr', p, this, (i++) * A_PtrSize)
p := NumPut('ptr', mp.Get(cb, 0) || mp[cb] := CallbackCreate(cb, , cb.MinParams || 2), p)
}
for _, p in mp
fnptrs.Push(p)
QueryInterface(this, riid, ppvObject) {
static iids := Map(
'{2FDE08A8-1E9A-4766-8C05-95A9CEB9D1C5}', 0, ; ICoreWebView2EnvironmentOptions
'{FF85C98A-1BA7-4A6B-90C8-2B752C89E9E2}', 1, ; ICoreWebView2EnvironmentOptions2
'{4A5C436E-A9E3-4A2E-89C3-910D3513F5CC}', 2, ; ICoreWebView2EnvironmentOptions3
'{AC52D13F-0D38-475A-9DCA-876580D6793E}', 3, ; ICoreWebView2EnvironmentOptions4
'{0AE35D64-C47F-4464-814E-259C345D1501}', 4, ; ICoreWebView2EnvironmentOptions5
)
DllCall("ole32.dll\StringFromGUID2", "ptr", riid, "ptr", buf := Buffer(78), "int", 39)
if (index := iids.Get(iid := StrUpper(StrGet(buf)), -1)) >= 0 {
ObjAddRef(p_this)
NumPut('ptr', p_unk + index * A_PtrSize, ppvObject)
return 0
}
NumPut('ptr', 0, ppvObject)
return 0x80004002
}
AddRef(this) => ObjAddRef(p_this)
Release(this) => ObjRelease(p_this)
put_xxx(this, value) => 0
get_xxx_str(prop, this, pvalue) {
if opts.HasOwnProp(prop) {
pm := DllCall('ole32\CoTaskMemAlloc', 'uptr', s := StrLen(v := opts.%prop%) * 2 + 2, 'ptr')
DllCall('RtlMoveMemory', 'ptr', pm, 'ptr', StrPtr(v), 'uptr', s)
} else pm := 0
return (NumPut('ptr', pm, pvalue), 0)
}
get_xxx_bool(prop, this, pvalue) {
if opts.HasOwnProp(prop)
v := !!opts.%prop%
else v := 0
return (NumPut('int', v, pvalue), 0)
}
GetCustomSchemeRegistrations(this, pcount, pschemeRegistrations) {
if opts.HasOwnProp('CustomSchemeRegistrations') && (csrs := opts.CustomSchemeRegistrations).Length {
NumPut('uint', csrs.Length, pcount)
NumPut('ptr', pm := DllCall('ole32\CoTaskMemAlloc', 'uptr', csrs.Length * A_PtrSize, 'ptr'), pschemeRegistrations)
for csr in csrs
ObjPtrAddRef(csr), pm := NumPut('ptr', csr.Ptr, pm)
} else NumPut('uint', 0, pcount), NumPut('ptr', 0, pschemeRegistrations)
return 0
}
SetCustomSchemeRegistrations(this, count, schemeRegistrations) => 0
__Delete(*) {
for ptr in fnptrs
CallbackFree(ptr)
}
}
}
class File extends WebView2.Base {
static IID := '{f2c19559-6bc1-4583-a757-90021be9afec}'
Path => (ComCall(3, this, 'ptr*', &path := 0), CoTaskMem_String(path))
}
class Frame extends WebView2.Base {
static IID := '{f1131a5e-9ba9-11eb-a8b3-0242ac130003}'
AddAHKObjHelper() => this.AddHostObjectToScriptWithOrigins('AHKObjHelper', WebView2.AHKObjHelper())
Name => (ComCall(3, this, 'ptr*', &name := 0), CoTaskMem_String(name))
add_NameChanged(eventHandler) => (ComCall(4, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameNameChangedEventHandler
remove_NameChanged(token) => ComCall(5, this, 'int64', token)
AddHostObjectToScriptWithOrigins(name, object, originsArr*) {
if originsCount := originsArr.Length {
p := (origins := Buffer(originsCount * A_PtrSize)).Ptr
loop originsCount
p := NumPut('ptr', StrPtr(originsArr[A_Index]), p)
}
ComCall(6, this, 'wstr', name, 'ptr', ComVar(object), 'uint', originsCount, 'ptr', origins) ; LPCWSTR*
}
RemoveHostObjectFromScript(name) => ComCall(7, this, 'wstr', name)
add_Destroyed(eventHandler) => (ComCall(8, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameDestroyedEventHandler
remove_Destroyed(token) => ComCall(9, this, 'int64', token)
IsDestroyed() => (ComCall(10, this, 'int*', &destroyed := 0), destroyed)
static IID_2 := '{7a6a5834-d185-4dbf-b63f-4a9bc43107d4}'
add_NavigationStarting(eventHandler) => (ComCall(11, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameNavigationStartingEventHandler
remove_NavigationStarting(token) => ComCall(12, this, 'int64', token)
add_ContentLoading(eventHandler) => (ComCall(13, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameContentLoadingEventHandler
remove_ContentLoading(token) => ComCall(14, this, 'int64', token)
add_NavigationCompleted(eventHandler) => (ComCall(15, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameNavigationCompletedEventHandler
remove_NavigationCompleted(token) => ComCall(16, this, 'int64', token)
add_DOMContentLoaded(eventHandler) => (ComCall(17, this, 'ptr', eventHandler, 'int64*', &token := 0), token) ; ICoreWebView2FrameDOMContentLoadedEventHandler
remove_DOMContentLoaded(token) => ComCall(18, this, 'int64', token)
ExecuteScript(javaScript, handler) => ComCall(19, this, 'wstr', javaScript, 'ptr', handler) ; ICoreWebView2ExecuteScriptCompletedHandler
PostWebMessageAsJson(webMessageAsJson) => ComCall(20, this, 'wstr', webMessageAsJson)
PostWebMessageAsString(webMessageAsString) => ComCall(21, this, 'wstr', webMessageAsString)
add_WebMessageReceived(handler) => (ComCall(22, this, 'ptr', handler, 'int64*', &token := 0), token) ; ICoreWebView2FrameWebMessageReceivedEventHandler
remove_WebMessageReceived(token) => ComCall(23, this, 'int64', token)
static IID_3 := '{b50d82cc-cc28-481d-9614-cb048895e6a0}'
add_PermissionRequested(handler) => (ComCall(24, this, 'ptr', handler, 'int64*', &token := 0), token) ; ICoreWebView2FramePermissionRequestedEventHandler
remove_PermissionRequested(token) => ComCall(25, this, 'int64', token)
static IID_4 := '{188782DC-92AA-4732-AB3C-FCC59F6F68B9}'
PostSharedBufferToScript(sharedBuffer, access, additionalDataAsJson) => ComCall(26, this, 'ptr', sharedBuffer, 'int', access, 'wstr', additionalDataAsJson)
}
class FrameCreatedEventArgs extends WebView2.Base {
static IID := '{4d6e7b5e-9baa-11eb-a8b3-0242ac130003}'
Frame => (ComCall(3, this, 'ptr*', frame := WebView2.Frame()), frame)
}
class FrameInfo extends WebView2.Base {
static IID := '{da86b8a1-bdf3-4f11-9955-528cefa59727}'
Name => (ComCall(3, this, 'ptr*', &name := 0), CoTaskMem_String(name))
Source => (ComCall(4, this, 'ptr*', &source := 0), CoTaskMem_String(source))
}
class FrameInfoCollection extends WebView2.Base {
static IID := '{8f834154-d38e-4d90-affb-6800a7272839}'
GetIterator() => (ComCall(3, this, 'ptr*', iterator := WebView2.FrameInfoCollectionIterator()), iterator)
}
class FrameInfoCollectionIterator extends WebView2.Base {
static IID := '{1bf89e2d-1b2b-4629-b28f-05099b41bb03}'
HasCurrent => (ComCall(3, this, 'int*', &hasCurrent := 0), hasCurrent)
GetCurrent() => (ComCall(4, this, 'ptr*', frameInfo := WebView2.FrameInfo()), frameInfo)
MoveNext() => (ComCall(5, this, 'int*', &hasNext := 0), hasNext)
}
class Handler extends Buffer {
/**
* Construct ICoreWebView2 Event or Completed Handler.
* @param invoke_cb Invoke function of handler.
* The first parameter of the callback function is the event interface pointer.
* @see https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2acceleratorkeypressedeventhandler
*/
__New(invoke_cb, paramcount?) {
super.__New(6 * A_PtrSize)
NumPut('ptr', this.Ptr + 2 * A_PtrSize, 'ptr', p := ObjPtr(this), this)
for cb in [QueryInterface, AddRef, Release]
NumPut('ptr', CallbackCreate(cb), this, (A_Index + 1) * A_PtrSize)
NumPut('ptr', CallbackCreate(invoke_cb, , paramcount?), this, 5 * A_PtrSize)
QueryInterface(interface, riid, ppvObject) {
}
AddRef(this) => ObjAddRef(NumGet(this, A_PtrSize, 'ptr'))
Release(this) => ObjRelease(NumGet(this, A_PtrSize, 'ptr'))
}
__Delete() {
loop 4
CallbackFree(NumGet(this, (A_Index + 1) * A_PtrSize, 'ptr'))
}
}
class HttpHeadersCollectionIterator extends WebView2.Base {
static IID := '{0702fc30-f43b-47bb-ab52-a42cb552ad9f}'
GetCurrentHeader(&name, &value) {
ComCall(3, this, 'ptr*', &name := 0, 'ptr*', &value := 0)
name := CoTaskMem_String(name), value := CoTaskMem_String(value)
}
HasCurrentHeader => (ComCall(4, this, 'int*', &hasCurrent := 0), hasCurrent)
MoveNext() => (ComCall(5, this, 'int*', &hasNext := 0), hasNext)
}
class HttpRequestHeaders extends WebView2.Base {
static IID := '{e86cac0e-5523-465c-b536-8fb9fc8c8c60}'
GetHeader(name) => (ComCall(3, this, 'wstr', name, 'ptr*', &value := 0), CoTaskMem_String(value))
GetHeaders(name) => (ComCall(4, this, 'wstr', name, 'ptr*', iterator := WebView2.HttpHeadersCollectionIterator()), iterator)
RetVal(name) => (ComCall(5, this, 'wstr', name, 'int*', &RetVal := 0), RetVal)
SetHeader(name, value) => ComCall(6, this, 'wstr', name, 'wstr', value)
RemoveHeader(name) => ComCall(7, this, 'wstr', name)
GetIterator() => (ComCall(8, this, 'ptr*', iterator := WebView2.HttpHeadersCollectionIterator()), iterator)
}
class HttpResponseHeaders extends WebView2.Base {
static IID := '{03c5ff5a-9b45-4a88-881c-89a9f328619c}'
AppendHeader(name, value) => ComCall(3, this, 'wstr', name, 'wstr', value)
RetVal(name) => (ComCall(4, this, 'wstr', name, 'int*', &RetVal := 0), RetVal)
GetHeader(name) => (ComCall(5, this, 'wstr', name, 'ptr*', &value := 0), CoTaskMem_String(value))
GetHeaders(name) => (ComCall(6, this, 'wstr', name, 'ptr*', iterator := WebView2.HttpHeadersCollectionIterator()), iterator)
GetIterator() => (ComCall(7, this, 'ptr*', iterator := WebView2.HttpHeadersCollectionIterator()), iterator)
}
class LaunchingExternalUriSchemeEventArgs extends WebView2.Base {
static IID := '{07D1A6C3-7175-4BA1-9306-E593CA07E46C}'
Uri => (ComCall(3, this, 'ptr*', value := 0), CoTaskMem_String(value))
InitiatingOrigin => (ComCall(4, this, 'ptr*', value := 0), CoTaskMem_String(value))
IsUserInitiated => (ComCall(5, this, 'int*', &value := 0), value)
Cancel {
get => (ComCall(6, this, 'int*', &value := 0), value)
set => ComCall(7, this, 'int', Value)
}
GetDeferral() => (ComCall(8, this, 'ptr', value := WebView2.Deferral()), value)
}
class MoveFocusRequestedEventArgs extends WebView2.Base {
static IID := '{2d6aa13b-3839-4a15-92fc-d88b3c0d9c9d}'
Reason => (ComCall(3, this, 'int*', &reason := 0), reason) ; COREWEBVIEW2_MOVE_FOCUS_REASON
Handled {
get => (ComCall(4, this, 'int*', &value := 0), value)
set => ComCall(5, this, 'int', Value)
}
}
class NavigationCompletedEventArgs extends WebView2.Base {
static IID := '{30d68b7d-20d9-4752-a9ca-ec8448fbb5c1}'
IsSuccess => (ComCall(3, this, 'int*', &isSuccess := 0), isSuccess)
WebErrorStatus => (ComCall(4, this, 'int*', &webErrorStatus := 0), webErrorStatus) ; COREWEBVIEW2_WEB_ERROR_STATUS
NavigationId => (ComCall(5, this, 'int64*', &navigationId := 0), navigationId)
static IID_2 := '{FDF8B738-EE1E-4DB2-A329-8D7D7B74D792}'
HttpStatusCode => (ComCall(6, this, 'int*', &http_status_code := 0), http_status_code)
}
class NavigationStartingEventArgs extends WebView2.Base {
static IID := '{5b495469-e119-438a-9b18-7604f25f2e49}'
Uri => (ComCall(3, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
IsUserInitiated => (ComCall(4, this, 'int*', &isUserInitiated := 0), isUserInitiated)
IsRedirected => (ComCall(5, this, 'int*', &isRedirected := 0), isRedirected)
RequestHeaders => (ComCall(6, this, 'ptr*', requestHeaders := WebView2.HttpRequestHeaders()), requestHeaders)
Cancel {
get => (ComCall(7, this, 'int*', &cancel := 0), cancel)
set => ComCall(8, this, 'int', Value)
}
NavigationId => (ComCall(9, this, 'int64*', &navigationId := 0), navigationId)
static IID_2 := '{9086BE93-91AA-472D-A7E0-579F2BA006AD}'
AdditionalAllowedFrameAncestors {
get => (ComCall(10, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(11, this, 'wstr', Value)
}
static IID_3 := '{DDFFE494-4942-4BD2-AB73-35B8FF40E19F}'
NavigationKind => (ComCall(12, this, 'int*', &navigation_kind := 0), navigation_kind)
}
class NewWindowRequestedEventArgs extends WebView2.Base {
static IID := '{34acb11c-fc37-4418-9132-f9c21d1eafb9}'
Uri => (ComCall(3, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
NewWindow {
set => ComCall(4, this, 'ptr', Value)
get => (ComCall(5, this, 'ptr*', newWindow := WebView2.Core()), newWindow)
}
Handled {
set => ComCall(6, this, 'int', Value)
get => (ComCall(7, this, 'int*', &handled := 0), handled)
}
IsUserInitiated => (ComCall(8, this, 'int*', &isUserInitiated := 0), isUserInitiated)
GetDeferral() => (ComCall(9, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
WindowFeatures => (ComCall(10, this, 'ptr*', value := WebView2.WindowFeatures()), value)
static IID_2 := '{bbc7baed-74c6-4c92-b63a-7f5aeae03de3}'
Name => (ComCall(11, this, 'ptr*', &value := 0), CoTaskMem_String(value))
static IID_3 := '{842bed3c-6ad6-4dd9-b938-28c96667ad66}'
OriginalSourceFrameInfo => (ComCall(12, this, 'ptr*', frameInfo := WebView2.FrameInfo()), frameInfo)
}
class ObjectCollectionView extends WebView2.Base {
static IID := '{0f36fd87-4f69-4415-98da-888f89fb9a33}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &value := 0), value)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr', value := ComValue(0xd, 0)), value)
}
class PermissionRequestedEventArgs extends WebView2.Base {
static IID := '{973ae2ef-ff18-4894-8fb2-3c758f046810}'
Uri => (ComCall(3, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
PermissionKind => (ComCall(4, this, 'int*', &permissionKind := 0), permissionKind) ; COREWEBVIEW2_PERMISSION_KIND
IsUserInitiated => (ComCall(5, this, 'int*', &isUserInitiated := 0), isUserInitiated)
State {
get => (ComCall(6, this, 'int*', &state := 0), state) ; COREWEBVIEW2_PERMISSION_STATE
set => ComCall(7, this, 'int', Value)
}
GetDeferral() => (ComCall(8, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
static IID_2 := '{74d7127f-9de6-4200-8734-42d6fb4ff741}'
Handled {
get => (ComCall(9, this, 'int*', &handled := 0), handled)
set => ComCall(10, this, 'int', Value)
}
static IID_3 := '{e61670bc-3dce-4177-86d2-c629ae3cb6ac}'
SavesInProfile {
get => (ComCall(11, this, 'int*', &value := 0), value)
set => ComCall(12, this, 'int', Value)
}
}
class PermissionSetting extends WebView2.Base {
static IID := '{792b6eca-5576-421c-9119-74ebb3a4ffb3}'
PermissionKind => (ComCall(3, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PERMISSION_KIND
PermissionOrigin => (ComCall(4, this, 'int*', &value := 0), CoTaskMem_String(value))
PermissionState => (ComCall(5, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PERMISSION_STATE
}
class PermissionSettingCollectionView extends WebView2.Base {
static IID := '{f5596f62-3de5-47b1-91e8-a4104b596b96}'
__Item[index] => this.GetValueAtIndex(index)
GetValueAtIndex(index) => (ComCall(3, this, 'ptr*', permissionSetting := WebView2.PermissionSetting()), permissionSetting)
Count => (ComCall(4, this, 'uint*', &value := 0), value)
}
class PointerInfo extends WebView2.Base {
static IID := '{e6995887-d10d-4f5d-9359-4ce46e4f96b9}'
PointerKind {
get => (ComCall(3, this, 'uint*', &pointerKind := 0), pointerKind)
set => ComCall(4, this, 'uint', Value)
}
PointerId {
get => (ComCall(5, this, 'uint*', &pointerId := 0), pointerId)
set => ComCall(6, this, 'uint', Value)
}
FrameId {
get => (ComCall(7, this, 'uint*', &frameId := 0), frameId)
set => ComCall(8, this, 'uint', Value)
}
PointerFlags {
get => (ComCall(9, this, 'uint*', &pointerFlags := 0), pointerFlags)
set => ComCall(10, this, 'uint', Value)
}
PointerDeviceRect {
get => (ComCall(11, this, 'ptr', pointerDeviceRect := Buffer(16)), pointerDeviceRect)
set => (A_PtrSize = 8 ? ComCall(12, this, 'ptr', Value) : ComCall(12, this, 'int64', NumGet(Value, 'int64'), 'int64', NumGet(Value, 8, 'int64')))
}
DisplayRect {
get => (ComCall(13, this, 'ptr', displayRect := Buffer(16)), displayRect)
set => (A_PtrSize = 8 ? ComCall(14, this, 'ptr', Value) : ComCall(14, this, 'int64', NumGet(Value, 'int64'), 'int64', NumGet(Value, 8, 'int64')))
}
PixelLocation {
get => (ComCall(15, this, 'int64*', &pixelLocation := 0), pixelLocation)
set => ComCall(16, this, 'int64', Value)
}
HimetricLocation {
get => (ComCall(17, this, 'int64*', &himetricLocation := 0), himetricLocation)
set => ComCall(18, this, 'int64', Value)
}
PixelLocationRaw {
get => (ComCall(19, this, 'int64*', &pixelLocationRaw := 0), pixelLocationRaw)
set => ComCall(20, this, 'int64', Value)
}
HimetricLocationRaw {
get => (ComCall(21, this, 'int64*', &himetricLocationRaw := 0), himetricLocationRaw)
set => ComCall(22, this, 'int64', Value)
}
Time {
get => (ComCall(23, this, 'uint*', &time := 0), time)
set => ComCall(24, this, 'uint', Value)
}
HistoryCount {
get => (ComCall(25, this, 'uint*', &historyCount := 0), historyCount)
set => ComCall(26, this, 'uint', Value)
}
InputData {
get => (ComCall(27, this, 'int*', &inputData := 0), inputData)
set => ComCall(28, this, 'int', Value)
}
KeyStates {
get => (ComCall(29, this, 'uint*', &keyStates := 0), keyStates)
set => ComCall(30, this, 'uint', Value)
}
PerformanceCount {
get => (ComCall(31, this, 'uint64*', &performanceCount := 0), performanceCount)
set => ComCall(32, this, 'uint64', Value)
}
ButtonChangeKind {
get => (ComCall(33, this, 'int*', &buttonChangeKind := 0), buttonChangeKind)
set => ComCall(34, this, 'int', Value)
}
PenFlags {
get => (ComCall(35, this, 'uint*', &penFLags := 0), penFLags)
set => ComCall(36, this, 'uint', Value)
}
PenMask {
get => (ComCall(37, this, 'uint*', &penMask := 0), penMask)
set => ComCall(38, this, 'uint', Value)
}
PenPressure {
get => (ComCall(39, this, 'uint*', &penPressure := 0), penPressure)
set => ComCall(40, this, 'uint', Value)
}
PenRotation {
get => (ComCall(41, this, 'uint*', &penRotation := 0), penRotation)
set => ComCall(42, this, 'uint', Value)
}
PenTiltX {
get => (ComCall(43, this, 'int*', &penTiltX := 0), penTiltX)
set => ComCall(44, this, 'int', Value)
}
PenTiltY {
get => (ComCall(45, this, 'int*', &penTiltY := 0), penTiltY)
set => ComCall(46, this, 'int', Value)
}
TouchFlags {
get => (ComCall(47, this, 'uint*', &touchFlags := 0), touchFlags)
set => ComCall(48, this, 'uint', Value)
}
TouchMask {
get => (ComCall(49, this, 'uint*', &touchMask := 0), touchMask)
set => ComCall(50, this, 'uint', Value)
}
TouchContact {
get => (ComCall(51, this, 'ptr', touchContact := Buffer(16)), touchContact)
set => (A_PtrSize = 8 ? ComCall(52, this, 'ptr', Value) : ComCall(52, this, 'int64', NumGet(Value, 'int64'), 'int64', NumGet(Value, 8, 'int64')))
}
TouchContactRaw {
get => (ComCall(53, this, 'ptr', touchContactRaw := Buffer(16)), touchContactRaw)
set => (A_PtrSize = 8 ? ComCall(54, this, 'ptr', Value) : ComCall(54, this, 'int64', NumGet(Value, 'int64'), 'int64', NumGet(Value, 8, 'int64')))
}
TouchOrientation {
get => (ComCall(55, this, 'uint*', &touchOrientation := 0), touchOrientation)
set => ComCall(56, this, 'uint', Value)
}
TouchPressure {
get => (ComCall(57, this, 'uint*', &touchPressure := 0), touchPressure)
set => ComCall(58, this, 'uint', Value)
}
}
class PrintSettings extends WebView2.Base {
static IID := '{377f3721-c74e-48ca-8db1-df68e51d60e2}'
Orientation {
get => (ComCall(3, this, 'int*', &orientation := 0), orientation)
set => ComCall(4, this, 'int', Value)
}
ScaleFactor {
get => (ComCall(5, this, 'double*', &scaleFactor := 0), scaleFactor)
set => ComCall(6, this, 'double', Value)
}
PageWidth {
get => (ComCall(7, this, 'double*', &pageWidth := 0), pageWidth)
set => ComCall(8, this, 'double', Value)
}
PageHeight {
get => (ComCall(9, this, 'double*', &pageHeight := 0), pageHeight)
set => ComCall(10, this, 'double', Value)
}
MarginTop {
get => (ComCall(11, this, 'double*', &marginTop := 0), marginTop)
set => ComCall(12, this, 'double', Value)
}
MarginBottom {
get => (ComCall(13, this, 'double*', &marginBottom := 0), marginBottom)
set => ComCall(14, this, 'double', Value)
}
MarginLeft {
get => (ComCall(15, this, 'double*', &marginLeft := 0), marginLeft)
set => ComCall(16, this, 'double', Value)
}
MarginRight {
get => (ComCall(17, this, 'double*', &marginRight := 0), marginRight)
set => ComCall(18, this, 'double', Value)
}
ShouldPrintBackgrounds {
get => (ComCall(19, this, 'int*', &shouldPrintBackgrounds := 0), shouldPrintBackgrounds)
set => ComCall(20, this, 'int', Value)
}
ShouldPrintSelectionOnly {
get => (ComCall(21, this, 'int*', &shouldPrintSelectionOnly := 0), shouldPrintSelectionOnly)
set => ComCall(22, this, 'int', Value)
}
ShouldPrintHeaderAndFooter {
get => (ComCall(23, this, 'int*', &shouldPrintHeaderAndFooter := 0), shouldPrintHeaderAndFooter)
set => ComCall(24, this, 'int', Value)
}
HeaderTitle {
get => (ComCall(25, this, 'ptr*', &headerTitle := 0), CoTaskMem_String(headerTitle))
set => ComCall(26, this, 'wstr', Value)
}
FooterUri {
get => (ComCall(27, this, 'ptr*', &footerUri := 0), CoTaskMem_String(footerUri))
set => ComCall(28, this, 'wstr', Value)
}
static IID_2 := '{CA7F0E1F-3484-41D1-8C1A-65CD44A63F8D}'
PageRanges {
get => (ComCall(29, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(30, this, 'wstr', Value)
}
PagesPerSide {
get => (ComCall(31, this, 'int*', &value := 0), value)
set => ComCall(32, this, 'int', Value)
}
Copies {
get => (ComCall(33, this, 'int*', &value := 0), value)
set => ComCall(34, this, 'int', Value)
}
Collation {
get => (ComCall(35, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PRINT_COLLATION
set => ComCall(36, this, 'int', Value)
}
ColorMode {
get => (ComCall(37, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PRINT_COLOR_MODE
set => ComCall(38, this, 'int', Value)
}
Duplex {
get => (ComCall(39, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PRINT_DUPLEX
set => ComCall(40, this, 'int', Value)
}
MediaSize {
get => (ComCall(41, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PRINT_MEDIA_SIZE
set => ComCall(42, this, 'int', Value)
}
PrinterName {
get => (ComCall(43, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(44, this, 'wstr', Value)
}
}
class ProcessInfo extends WebView2.Base {
static IID := '{84FA7612-3F3D-4FBF-889D-FAD000492D72}'
ProcessId => (ComCall(3, this, 'int*', &value := 0), value)
Kind => (ComCall(4, this, 'int*', &kind := 0), kind) ; COREWEBVIEW2_PROCESS_KIND
}
class ProcessInfoCollection extends WebView2.Base {
static IID := '{402B99CD-A0CC-4FA5-B7A5-51D86A1D2339}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &count := 0), count)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr*', processInfo := WebView2.ProcessInfo()), processInfo)
}
class Profile extends WebView2.Base {
static IID := '{79110ad3-cd5d-4373-8bc3-c60658f17a5f}'
ProfileName => (ComCall(3, this, 'ptr*', &value := 0), CoTaskMem_String(value))
IsInPrivateModeEnabled => (ComCall(4, this, 'int*', &value := 0), value)
ProfilePath => (ComCall(5, this, 'ptr*', &value := 0), CoTaskMem_String(value))
DefaultDownloadFolderPath {
get => (ComCall(6, this, 'ptr*', &value := 0), CoTaskMem_String(value))
set => ComCall(7, this, 'wstr', Value)
}
PreferredColorScheme {
get => (ComCall(8, this, 'int*', &value := 0), value) ; COREWEBVIEW2_PREFERRED_COLOR_SCHEME
set => ComCall(9, this, 'int', Value)
}
static IID_2 := '{fa740d4b-5eae-4344-a8ad-74be31925397}'
ClearBrowsingData(dataKinds, handler) => ComCall(10, this, 'int', dataKinds, 'ptr', handler) ; COREWEBVIEW2_BROWSING_DATA_KINDS, ICoreWebView2ClearBrowsingDataCompletedHandler
ClearBrowsingDataInTimeRange(dataKinds, startTime, endTime, handler) => ComCall(11, this, 'int', dataKinds, 'double', startTime, 'double', endTime, 'ptr', handler) ; COREWEBVIEW2_BROWSING_DATA_KINDS, ICoreWebView2ClearBrowsingDataCompletedHandler
ClearBrowsingDataAll(handler) => ComCall(12, this, 'ptr', handler) ; ICoreWebView2ClearBrowsingDataCompletedHandler
static IID_3 := '{B188E659-5685-4E05-BDBA-FC640E0F1992}'
PreferredTrackingPreventionLevel {
get => (ComCall(13, this, 'int*', &value := 0), value) ; COREWEBVIEW2_TRACKING_PREVENTION_LEVEL
set => ComCall(14, this, 'int', Value)
}
static IID_4 := '{8F4ae680-192e-4eC8-833a-21cfadaef628}'
SetPermissionState(permissionKind, origin, state, completedHandler) => ComCall(15, this, 'int', permissionKind, 'wstr', origin, 'int', state, 'ptr', completedHandler) ; COREWEBVIEW2_PERMISSION_KIND,, COREWEBVIEW2_PERMISSION_STATE, ICoreWebView2SetPermissionStateCompletedHandler
GetNonDefaultPermissionSettings(completedHandler) => ComCall(16, this, 'ptr', completedHandler) ; ICoreWebView2GetNonDefaultPermissionSettingsCompletedHandler
static IID_5 := '{2EE5B76E-6E80-4DF2-BCD3-D4EC3340A01B}'
CookieManager => (ComCall(17, this, 'ptr', cookieManager := WebView2.CookieManager()), cookieManager)
static IID_6 := '{BD82FA6A-1D65-4C33-B2B4-0393020CC61B}'
IsPasswordAutosaveEnabled {
get => (ComCall(18, this, 'int*', &value := 0), value)
set => ComCall(19, this, 'int', Value)
}
IsGeneralAutofillEnabled {
get => (ComCall(20, this, 'int*', &value := 0), value)
set => ComCall(21, this, 'int', Value)
}
}
class ProcessFailedEventArgs extends WebView2.Base {
static IID := '{8155a9a4-1474-4a86-8cae-151b0fa6b8ca}'
ProcessFailedKind => (ComCall(3, this, 'int*', &processFailedKind := 0), processFailedKind) ; COREWEBVIEW2_PROCESS_FAILED_KIND
static IID_2 := '{4dab9422-46fa-4c3e-a5d2-41d2071d3680}'
Reason => (ComCall(4, this, 'int*', &reason := 0), reason) ; COREWEBVIEW2_PROCESS_FAILED_REASON
ExitCode => (ComCall(5, this, 'int*', &exitCode := 0), exitCode)
ProcessDescription => (ComCall(6, this, 'ptr*', &processDescription := 0), CoTaskMem_String(processDescription))
FrameInfosForFailedProcess => (ComCall(7, this, 'ptr*', frames := WebView2.FrameInfoCollection()), frames)
}
class ScriptDialogOpeningEventArgs extends WebView2.Base {
static IID := '{7390bb70-abe0-4843-9529-f143b31b03d6}'
Uri => (ComCall(3, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
Kind => (ComCall(4, this, 'int*', &kind := 0), kind) ; COREWEBVIEW2_SCRIPT_DIALOG_KIND
Message => (ComCall(5, this, 'ptr*', &message := 0), CoTaskMem_String(message))
Accept() => ComCall(6, this)
DefaultText => (ComCall(7, this, 'ptr*', &defaultText := 0), CoTaskMem_String(defaultText))
ResultText {
get => (ComCall(8, this, 'ptr*', &resultText := 0), CoTaskMem_String(resultText))
set => ComCall(9, this, 'wstr', Value)
}
GetDeferral() => (ComCall(10, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class ServerCertificateErrorDetectedEventArgs extends WebView2.Base {
static IID := '{012193ED-7C13-48FF-969D-A84C1F432A14}'
ErrorStatus => (ComCall(3, this, 'int*', &value := 0), value)
RequestUri => (ComCall(4, this, 'ptr*', &value := 0), CoTaskMem_String(value))
ServerCertificate => (ComCall(5, this, 'ptr*', value := WebView2.Certificate()), value)
Action {
get => (ComCall(6, this, 'int*', &value := 0), value) ; COREWEBVIEW2_SERVER_CERTIFICATE_ERROR_ACTION
set => ComCall(7, this, 'int', Value)
}
GetDeferral() => (ComCall(8, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
}
class Settings extends WebView2.Base {
static IID := '{e562e4f0-d7fa-43ac-8d71-c05150499f00}'
IsScriptEnabled {
get => (ComCall(3, this, 'int*', &isScriptEnabled := 0), isScriptEnabled)
set => ComCall(4, this, 'int', Value)
}
IsWebMessageEnabled {
get => (ComCall(5, this, 'int*', &isWebMessageEnabled := 0), isWebMessageEnabled)
set => ComCall(6, this, 'int', Value)
}
AreDefaultScriptDialogsEnabled {
get => (ComCall(7, this, 'int*', &areDefaultScriptDialogsEnabled := 0), areDefaultScriptDialogsEnabled)
set => ComCall(8, this, 'int', Value)
}
IsStatusBarEnabled {
get => (ComCall(9, this, 'int*', &isStatusBarEnabled := 0), isStatusBarEnabled)
set => ComCall(10, this, 'int', Value)
}
AreDevToolsEnabled {
get => (ComCall(11, this, 'int*', &areDevToolsEnabled := 0), areDevToolsEnabled)
set => ComCall(12, this, 'int', Value)
}
AreDefaultContextMenusEnabled {
get => (ComCall(13, this, 'int*', &enabled := 0), enabled)
set => ComCall(14, this, 'int', Value)
}
AreHostObjectsAllowed {
get => (ComCall(15, this, 'int*', &allowed := 0), allowed)
set => ComCall(16, this, 'int', Value)
}
IsZoomControlEnabled {
get => (ComCall(17, this, 'int*', &enabled := 0), enabled)
set => ComCall(18, this, 'int', Value)
}
IsBuiltInErrorPageEnabled {
get => (ComCall(19, this, 'int*', &enabled := 0), enabled)
set => ComCall(20, this, 'int', Value)
}
static IID_2 := '{ee9a0f68-f46c-4e32-ac23-ef8cac224d2a}'
UserAgent {
get => (ComCall(21, this, 'ptr*', &userAgent := 0), CoTaskMem_String(userAgent))
set => ComCall(22, this, 'wstr', Value)
}
static IID_3 := '{fdb5ab74-af33-4854-84f0-0a631deb5eba}'
AreBrowserAcceleratorKeysEnabled {
get => (ComCall(23, this, 'int*', &areBrowserAcceleratorKeysEnabled := 0), areBrowserAcceleratorKeysEnabled)
set => ComCall(24, this, 'int', Value)
}
static IID_4 := '{cb56846c-4168-4d53-b04f-03b6d6796ff2}'
IsPasswordAutosaveEnabled {
get => (ComCall(25, this, 'int*', &value := 0), value)
set => ComCall(26, this, 'int', Value)
}
IsGeneralAutofillEnabled {
get => (ComCall(27, this, 'int*', &value := 0), value)
set => ComCall(28, this, 'int', Value)
}
static IID_5 := '{183e7052-1d03-43a0-ab99-98e043b66b39}'
IsPinchZoomEnabled {
get => (ComCall(29, this, 'int*', &enabled := 0), enabled)
set => ComCall(30, this, 'int', Value)
}
static IID_6 := '{11cb3acd-9bc8-43b8-83bf-f40753714f87}'
IsSwipeNavigationEnabled {
get => (ComCall(31, this, 'int*', &enabled := 0), enabled)
set => ComCall(32, this, 'int', Value)
}
static IID_7 := '{488dc902-35ef-42d2-bc7d-94b65c4bc49c}'
HiddenPdfToolbarItems {
get => (ComCall(33, this, 'int*', &hidden_pdf_toolbar_items := 0), hidden_pdf_toolbar_items) ; COREWEBVIEW2_PDF_TOOLBAR_ITEMS
set => ComCall(34, this, 'int', Value)
}
static IID_8 := '{9e6b0e8f-86ad-4e81-8147-a9b5edb68650}'
IsReputationCheckingRequired {
get => (ComCall(35, this, 'int*', &value := 0), value)
set => ComCall(36, this, 'int', Value)
}
}
class SharedBuffer extends WebView2.Base {
static IID := '{B747A495-0C6F-449E-97B8-2F81E9D6AB43}'
Size => (ComCall(3, this, 'uint64', &value := 0), value)
Buffer => (ComCall(4, this, 'ptr*', &value := 0), value)
OpenStream() => (ComCall(5, this, 'ptr*', value := ComValue(0xd, 0)), value)
FileMappingHandle => (ComCall(6, this, 'ptr*', &value := 0), value)
Close() => ComCall(7, this)
}
class SourceChangedEventArgs extends WebView2.Base {
static IID := '{31e0e545-1dba-4266-8914-f63848a1f7d7}'
IsNewDocument => (ComCall(3, this, 'int*', &isNewDocument := 0), isNewDocument)
}
class StringCollection extends WebView2.Base {
static IID := '{f41f3f8a-bcc3-11eb-8529-0242ac130003}'
__Item[index] => this.GetValueAtIndex(index)
Count => (ComCall(3, this, 'uint*', &value := 0), value)
GetValueAtIndex(index) => (ComCall(4, this, 'uint', index, 'ptr*', &value := 0), CoTaskMem_String(value))
}
class WebMessageReceivedEventArgs extends WebView2.Base {
static IID := '{0f99a40c-e962-4207-9e92-e3d542eff849}'
Source => (ComCall(3, this, 'ptr*', &source := 0), CoTaskMem_String(source))
WebMessageAsJson => (ComCall(4, this, 'ptr*', &webMessageAsJson := 0), CoTaskMem_String(webMessageAsJson))
TryGetWebMessageAsString() => (ComCall(5, this, 'ptr*', &webMessageAsString := 0), CoTaskMem_String(webMessageAsString))
static IID_2 := '{06fc7ab7-c90c-4297-9389-33ca01cf6d5e}'
AdditionalObjects => (ComCall(6, this, 'ptr', value := WebView2.ObjectCollectionView()), value)
}
class WebResourceRequest extends WebView2.Base {
static IID := '{97055cd4-512c-4264-8b5f-e3f446cea6a5}'
Uri {
get => (ComCall(3, this, 'ptr*', &uri := 0), CoTaskMem_String(uri))
set => ComCall(4, this, 'wstr', Value)
}
Method {
get => (ComCall(5, this, 'ptr*', &method := 0), CoTaskMem_String(method))
set => ComCall(6, this, 'wstr', Value)
}
Content {
get => (ComCall(7, this, 'ptr*', &content := 0), content) ; IStream*
set => ComCall(8, this, 'ptr', Value)
}
Headers => (ComCall(9, this, 'ptr*', headers := WebView2.HttpRequestHeaders()), headers)
}
class WebResourceRequestedEventArgs extends WebView2.Base {
static IID := '{453e667f-12c7-49d4-be6d-ddbe7956f57a}'
Request => (ComCall(3, this, 'ptr*', request := WebView2.WebResourceRequest()), request)
Response {
get => (ComCall(4, this, 'ptr*', response := WebView2.WebResourceResponse()), response)
set => ComCall(5, this, 'ptr', Value)
}
GetDeferral() => (ComCall(6, this, 'ptr*', deferral := WebView2.Deferral()), deferral)
ResourceContext => (ComCall(7, this, 'int*', &context := 0), context) ; COREWEBVIEW2_WEB_RESOURCE_CONTEXT
}
class WebResourceResponse extends WebView2.Base {
static IID := '{aafcc94f-fa27-48fd-97df-830ef75aaec9}'
Content {
get => (ComCall(3, this, 'ptr*', &content := 0), content) ; IStream*
set => ComCall(4, this, 'ptr', Value)
}
Headers => (ComCall(5, this, 'ptr*', headers := WebView2.HttpResponseHeaders()), headers)
StatusCode {
get => (ComCall(6, this, 'int*', &statusCode := 0), statusCode)
set => ComCall(7, this, 'int', Value)
}
ReasonPhrase {
get => (ComCall(8, this, 'ptr*', &reasonPhrase := 0), CoTaskMem_String(reasonPhrase))
set => ComCall(9, this, 'wstr', Value)
}
}
class WebResourceResponseReceivedEventArgs extends WebView2.Base {
static IID := '{D1DB483D-6796-4B8B-80FC-13712BB716F4}'
Request => (ComCall(3, this, 'ptr*', request := WebView2.WebResourceRequest()), request)
Response => (ComCall(4, this, 'ptr*', response := WebView2.WebResourceResponseView()), response)
}
class WebResourceResponseView extends WebView2.Base {
static IID := '{79701053-7759-4162-8F7D-F1B3F084928D}'
Headers => (ComCall(3, this, 'ptr*', headers := WebView2.HttpResponseHeaders()), headers)
StatusCode => (ComCall(4, this, 'int*', &statusCode := 0), statusCode)
ReasonPhrase => (ComCall(5, this, 'ptr*', &reasonPhrase := 0), CoTaskMem_String(reasonPhrase))
GetContent(handler) => ComCall(6, this, 'ptr', handler) ; ICoreWebView2WebResourceResponseViewGetContentCompletedHandler
}
class WindowFeatures extends WebView2.Base {
static IID := '{5eaf559f-b46e-4397-8860-e422f287ff1e}'
HasPosition => (ComCall(3, this, 'int*', &value := 0), value)
HasSize => (ComCall(4, this, 'int*', &value := 0), value)
Left => (ComCall(5, this, 'uint*', &value := 0), value)
Top => (ComCall(6, this, 'uint*', &value := 0), value)
Height => (ComCall(7, this, 'uint*', &value := 0), value)
Width => (ComCall(8, this, 'uint*', &value := 0), value)
ShouldDisplayMenuBar => (ComCall(9, this, 'int*', &value := 0), value)
ShouldDisplayStatus => (ComCall(10, this, 'int*', &value := 0), value)
ShouldDisplayToolbar => (ComCall(11, this, 'int*', &value := 0), value)
ShouldDisplayScrollBars => (ComCall(12, this, 'int*', &value := 0), value)
}
;#endregion
;#region structs
class PHYSICAL_KEY_STATUS extends Buffer {
__New() => super.__New(24, 0)
RepeatCount {
get => NumGet(this, 'uint')
set => NumPut('uint', Value, this)
}
ScanCode {
get => NumGet(this, 4, 'uint')
set => NumPut('uint', Value, this, 4)
}
IsExtendedKey {
get => NumGet(this, 8, 'int')
set => NumPut('int', Value, this, 8)
}
IsMenuKeyDown {
get => NumGet(this, 12, 'int')
set => NumPut('int', Value, this, 12)
}
WasKeyDown {
get => NumGet(this, 16, 'int')
set => NumPut('int', Value, this, 16)
}
IsKeyReleased {
get => NumGet(this, 20, 'int')
set => NumPut('int', Value, this, 20)
}
}
;#endregion
;#region constants
static CAPTURE_PREVIEW_IMAGE_FORMAT := { PNG: 0, JPEG: 1 }
static CONTEXT_MENU_TARGET_KIND := {
PAGE: 0,
IMAGE: 1,
SELECTED_TEXT: 2,
AUDIO: 3,
VIDEO: 4
}
static CONTEXT_MENU_ITEM_KIND := {
COMMAND: 0,
CHECK_BOX: 1,
RADIO: 2,
SEPARATOR: 3,
SUBMENU: 4
}
static PREFERRED_COLOR_SCHEME := { AUTO: 0, LIGHT: 1, DARK: 2 }
static BROWSING_DATA_KINDS := {
FILE_SYSTEMS: (1 << 0),
INDEXED_DB: (1 << 1),
LOCAL_STORAGE: (1 << 2),
WEB_SQL: (1 << 3),
CACHE_STORAGE: (1 << 4),
ALL_DOM_STORAGE: (1 << 5),
COOKIES: (1 << 6),
ALL_SITE: (1 << 7),
DISK_CACHE: (1 << 8),
DOWNLOAD_HISTORY: (1 << 9),
GENERAL_AUTOFILL: (1 << 10),
PASSWORD_AUTOSAVE: (1 << 11),
BROWSING_HISTORY: (1 << 12),
SETTINGS: (1 << 13),
ALL_PROFILE: (1 << 14),
SERVICE_WORKERS: (1 << 15)
}
static SERVER_CERTIFICATE_ERROR_ACTION := { ALWAYS_ALLOW: 0, CANCEL: 1, DEFAULT: 2 }
static FAVICON_IMAGE_FORMAT := { PNG: 0, JPEG: 1 }
static PRINT_DIALOG_KIND := { BROWSER: 0, SYSTEM: 1 }
static PRINT_DUPLEX := {
DEFAULT: 0,
ONE_SIDED: 1,
TWO_SIDED_LONG_EDGE: 2,
TWO_SIDED_SHORT_EDGE: 3
}
static PRINT_COLOR_MODE := { DEFAULT: 0, COLOR: 1, GRAYSCALE: 2 }
static PRINT_COLLATION := { DEFAULT: 0, COLLATED: 1, UNCOLLATED: 2 }
static PRINT_MEDIA_SIZE := { DEFAULT: 0, CUSTOM: 1 }
static PRINT_STATUS := { SUCCEEDED: 0, PRINTER_UNAVAILABLE: 1, OTHER_ERROR: 2 }
static TRACKING_PREVENTION_LEVEL := {
NONE: 0,
BASIC: 1,
BALANCED: 2,
STRICT: 3
}
static SHARED_BUFFER_ACCESS := { READ_ONLY: 0, READ_WRITE: 1 }
static MEMORY_USAGE_TARGET_LEVEL := { NORMAL: 0, LOW: 1 }
static NAVIGATION_KIND := { RELOAD: 0, BACK_OR_FORWARD: 1, NEW_DOCUMENT: 2 }
static COOKIE_SAME_SITE_KIND := { NONE: 0, LAX: 1, STRICT: 2 }
static HOST_RESOURCE_ACCESS_KIND := { DENY: 0, ALLOW: 1, DENY_CORS: 2 }
static SCRIPT_DIALOG_KIND := { ALERT: 0, CONFIRM: 1, PROMPT: 2, BEFOREUNLOAD: 3 }
static PDF_TOOLBAR_ITEMS := {
ITEMS_NONE: 0,
ITEMS_SAVE: 0x1,
ITEMS_PRINT: 0x2,
ITEMS_SAVE_AS: 0x4,
ITEMS_ZOOM_IN: 0x8,
ITEMS_ZOOM_OUT: 0x10,
ITEMS_ROTATE: 0x20,
ITEMS_FIT_PAGE: 0x40,
ITEMS_PAGE_LAYOUT: 0x80,
ITEMS_BOOKMARKS: 0x100,
ITEMS_PAGE_SELECTOR: 0x200,
ITEMS_SEARCH: 0x400,
ITEMS_FULL_SCREEN: 0x800,
ITEMS_MORE_SETTINGS: 0x1000
}
static PROCESS_FAILED_KIND := {
BROWSER_PROCESS_EXITED: 0,
RENDER_PROCESS_EXITED: 1,
RENDER_PROCESS_UNRESPONSIVE: 2,
FRAME_RENDER_PROCESS_EXITED: 3,
UTILITY_PROCESS_EXITED: 4,
SANDBOX_HELPER_PROCESS_EXITED: 5,
GPU_PROCESS_EXITED: 6,
PPAPI_PLUGIN_PROCESS_EXITED: 7,
PPAPI_BROKER_PROCESS_EXITED: 8,
UNKNOWN_PROCESS_EXITED: 9
}
static PROCESS_FAILED_REASON := {
UNEXPECTED: 0,
UNRESPONSIVE: 1,
TERMINATED: 2,
CRASHED: 3,
LAUNCH_FAILED: 4,
OUT_OF_MEMORY: 5,
PROFILE_DELETED: 6
}
static PERMISSION_KIND := {
UNKNOWN_PERMISSION: 0,
MICROPHONE: 1,
CAMERA: 2,
GEOLOCATION: 3,
NOTIFICATIONS: 4,
OTHER_SENSORS: 5,
CLIPBOARD_READ: 6,
MULTIPLE_AUTOMATIC_DOWNLOADS: 7,
FILE_READ_WRITE: 8,
AUTOPLAY: 9,
LOCAL_FONTS: 10,
MIDI_SYSTEM_EXCLUSIVE_MESSAGES: 11,
WINDOW_MANAGEMENT: 12
}
static PERMISSION_STATE := {
DEFAULT: 0,
ALLOW: 1,
DENY: 2
}
static PROCESS_KIND := {
BROWSER: 0,
RENDERER: 1,
UTILITY: 2,
SANDBOX_HELPER: 3,
GPU: 4,
PPAPI_PLUGIN: 5,
PPAPI_BROKER: 6
}
static WEB_ERROR_STATUS := {
UNKNOWN: 0,
CERTIFICATE_COMMON_NAME_IS_INCORRECT: 1,
CERTIFICATE_EXPIRED: 2,
CLIENT_CERTIFICATE_CONTAINS_ERRORS: 3,
CERTIFICATE_REVOKED: 4,
CERTIFICATE_IS_INVALID: 5,
SERVER_UNREACHABLE: 6,
TIMEOUT: 7,
ERROR_HTTP_INVALID_SERVER_RESPONSE: 8,
CONNECTION_ABORTED: 9,
CONNECTION_RESET: 10,
DISCONNECTED: 11,
CANNOT_CONNECT: 12,
HOST_NAME_NOT_RESOLVED: 13,
OPERATION_CANCELED: 14,
REDIRECT_FAILED: 15,
UNEXPECTED_ERROR: 16,
VALID_AUTHENTICATION_CREDENTIALS_REQUIRED: 17,
VALID_PROXY_AUTHENTICATION_REQUIRED: 18
}
static WEB_RESOURCE_CONTEXT := {
ALL: 0,
DOCUMENT: 1,
STYLESHEET: 2,
IMAGE: 3,
MEDIA: 4,
FONT: 5,
SCRIPT: 6,
XML_HTTP_REQUEST: 7,
FETCH: 8,
TEXT_TRACK: 9,
EVENT_SOURCE: 10,
WEBSOCKET: 11,
MANIFEST: 12,
SIGNED_EXCHANGE: 13,
PING: 14,
CSP_VIOLATION_REPORT: 15,
OTHER: 16
}
static MOVE_FOCUS_REASON := { PROGRAMMATIC: 0, NEXT: 1, PREVIOUS: 2 }
static KEY_EVENT_KIND := { KEY_DOWN: 0, KEY_UP: 1, SYSTEM_KEY_DOWN: 2, SYSTEM_KEY_UP: 3 }
static BROWSER_PROCESS_EXIT_KIND := { NORMAL: 0, FAILED: 1 }
static MOUSE_EVENT_KIND := {
HORIZONTAL_WHEEL: 0x20e,
LEFT_BUTTON_DOUBLE_CLICK: 0x203,
LEFT_BUTTON_DOWN: 0x201,
LEFT_BUTTON_UP: 0x202,
LEAVE: 0x2a3,
MIDDLE_BUTTON_DOUBLE_CLICK: 0x209,
MIDDLE_BUTTON_DOWN: 0x207,
MIDDLE_BUTTON_UP: 0x208,
MOVE: 0x200,
RIGHT_BUTTON_DOUBLE_CLICK: 0x206,
RIGHT_BUTTON_DOWN: 0x204,
RIGHT_BUTTON_UP: 0x205,
WHEEL: 0x20a,
X_BUTTON_DOUBLE_CLICK: 0x20d,
X_BUTTON_DOWN: 0x20b,
X_BUTTON_UP: 0x20c,
NON_CLIENT_RIGHT_BUTTON_DOWN: 0xa4,
NON_CLIENT_RIGHT_BUTTON_UP: 0xa5
}
static MOUSE_EVENT_VIRTUAL_KEYS := {
NONE: 0,
LEFT_BUTTON: 0x1,
RIGHT_BUTTON: 0x2,
SHIFT: 0x4,
CONTROL: 0x8,
MIDDLE_BUTTON: 0x10,
X_BUTTON1: 0x20,
X_BUTTON2: 0x40
}
static POINTER_EVENT_KIND := {
ACTIVATE: 0x24b,
DOWN: 0x246,
ENTER: 0x249,
LEAVE: 0x24a,
UP: 0x247,
UPDATE: 0x245
}
static BOUNDS_MODE := { USE_RAW_PIXELS: 0, USE_RASTERIZATION_SCALE: 1 }
static CLIENT_CERTIFICATE_KIND := { SMART_CARD: 0, PIN: 1, OTHER: 2 }
static DOWNLOAD_STATE := { IN_PROGRESS: 0, INTERRUPTED: 1, COMPLETED: 2 }
static DOWNLOAD_INTERRUPT_REASON := {
NONE: 0,
FILE_FAILED: 1,
FILE_ACCESS_DENIED: 2,
FILE_NO_SPACE: 3,
FILE_NAME_TOO_LONG: 4,
FILE_TOO_LARGE: 5,
FILE_MALICIOUS: 6,
FILE_TRANSIENT_ERROR: 7,
FILE_BLOCKED_BY_POLICY: 8,
FILE_SECURITY_CHECK_FAILED: 9,
FILE_TOO_SHORT: 10,
FILE_HASH_MISMATCH: 11,
NETWORK_FAILED: 12,
NETWORK_TIMEOUT: 13,
NETWORK_DISCONNECTED: 14,
NETWORK_SERVER_DOWN: 15,
NETWORK_INVALID_REQUEST: 16,
SERVER_FAILED: 17,
SERVER_NO_RANGE: 18,
SERVER_BAD_CONTENT: 19,
SERVER_UNAUTHORIZED: 20,
SERVER_CERTIFICATE_PROBLEM: 21,
SERVER_FORBIDDEN: 22,
SERVER_UNEXPECTED_RESPONSE: 23,
SERVER_CONTENT_LENGTH_MISMATCH: 24,
SERVER_CROSS_ORIGIN_REDIRECT: 25,
USER_CANCELED: 26,
USER_SHUTDOWN: 27,
USER_PAUSED: 28,
DOWNLOAD_PROCESS_CRASHED: 29
}
static PRINT_ORIENTATION := { PORTRAIT: 0, LANDSCAPE: 1 }
static DEFAULT_DOWNLOAD_DIALOG_CORNER_ALIGNMENT := { TOP_LEFT: 0, TOP_RIGHT: 1, BOTTOM_LEFT: 2, BOTTOM_RIGHT: 3 }
;#endregion
}
CoTaskMem_String(ptr) {
s := StrGet(ptr), DllCall('ole32\CoTaskMemFree', 'ptr', ptr)
return s
}
; Construction and deconstruction VARIANT struct
class ComVar {
/**
* Construction VARIANT struct, `ptr` property points to the address, `__Item` property returns var's Value
* @param vVal Values that need to be wrapped, supports String, Integer, Double, Array, ComValue, ComObjArray
* ### example
* `var1 := ComVar('string'), MsgBox(var1[])`
*
* `var2 := ComVar([1,2,3,4], , true)`
*
* `var3 := ComVar(ComValue(0xb, -1))`
* @param vType Variant's type, VT_VARIANT(default)
* @param convert Convert AHK's array to ComObjArray
*/
__New(vVal := unset, vType := 0xC, convert := false) {
static size := 8 + 2 * A_PtrSize
this.var := Buffer(size, 0), this.owner := true
this.ref := ComValue(0x4000 | vType, this.var.Ptr + (vType = 0xC ? 0 : 8))
if IsSet(vVal) {
if (Type(vVal) == "ComVar") {
this.var := vVal.var, this.ref := vVal.ref, this.obj := vVal, this.owner := false
} else {
if (IsObject(vVal)) {
if (vType != 0xC)
this.ref := ComValue(0x400C, this.var.ptr)
if convert && (vVal is Array) {
switch Type(vVal[1]) {
case "Integer": vType := 3
case "String": vType := 8
case "Float": vType := 5
case "ComValue", "ComObject": vType := ComObjType(vVal[1])
default: vType := 0xC
}
ComObjFlags(obj := ComObjArray(vType, vVal.Length), -1), i := 0, this.ref[] := obj
for v in vVal
obj[i++] := v
} else
this.ref[] := vVal
} else
this.ref[] := vVal
}
}
}
__Delete() => (this.owner ? DllCall("oleaut32\VariantClear", "ptr", this.var) : 0)
__Item {
get => this.ref[]
set => this.ref[] := value
}
Ptr => this.var.Ptr
Size => this.var.Size
Type {
get => NumGet(this.var, "ushort")
set {
if (!this.IsVariant)
throw PropertyError("VarType is not VT_VARIANT, Type is read-only.", -2)
NumPut("ushort", Value, this.var)
}
}
IsVariant => ComObjType(this.ref) & 0xC
}
Code: Select all
MemoryLoadLibrary(buf) {
;https://github.com/fancycode/MemoryModule
;https://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/
e_lfanew:=NumGet(buf,0x3c,"Int") ;IMAGE_DOS_HEADER::e_lfanew
optionalSectionSize:=NumGet(buf,e_lfanew+0x38,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SectionAlignment
NumberOfSections:=NumGet(buf,e_lfanew+0x6,"uShort") ;IMAGE_NT_HEADERS::FileHeader.NumberOfSections
SizeOfOptionalHeader:=NumGet(buf,e_lfanew+0x14,"uShort") ;IMAGE_NT_HEADERS::FileHeader.SizeOfOptionalHeader
lastSectionEnd:=0
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections
while (section < end) {
endOfSection:=NumGet(buf,section+0xc,"Uint") ;IMAGE_SECTION_HEADER::VirtualAddress
SizeOfRawData:=NumGet(buf,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
if (SizeOfRawData) {
endOfSection += SizeOfRawData
} else {
endOfSection += optionalSectionSize
}
if (endOfSection > lastSectionEnd) {
lastSectionEnd := endOfSection
}
section+=0x28
}
AlignValueUp(value, alignment) {
return (value + alignment - 1) & ~(alignment - 1)
}
AlignValueDown(value, alignment) {
return value & ~(alignment - 1)
}
SectionAlignment:=NumGet(buf,e_lfanew+0x38,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SectionAlignment
SizeOfImage:=NumGet(buf,e_lfanew+0x50,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfImage
alignedImageSize := AlignValueUp(SizeOfImage, SectionAlignment)
ImageBase:=NumGet(buf,e_lfanew-A_PtrSize+0x38,"Ptr") ;IMAGE_NT_HEADERS::OptionalHeader.ImageBase
code := DllCall("VirtualAlloc","Ptr",ImageBase,"Ptr",alignedImageSize,"Uint",0x00003000,"Uint",0x04,"Ptr") ;MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE
if (!code) {
throw "//unimplemented: try to allocate memory at arbitrary position"
}
if ((((code) >> 32) < (((code + alignedImageSize)) >> 32))) {
throw "//Memory block may not span 4 GB boundaries."
}
SizeOfHeaders:=NumGet(buf,e_lfanew+0x54,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfHeaders
headers := DllCall("VirtualAlloc","Ptr",code,"Ptr",SizeOfHeaders,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
DllCall("ntdll\memcpy","Ptr",headers,"Ptr",buf,"Ptr",SizeOfHeaders)
NumPut("Ptr",code,headers,e_lfanew-A_PtrSize+0x38) ;IMAGE_NT_HEADERS::OptionalHeader.ImageBase
;CopySections START
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections
while (section < end) {
SizeOfRawData:=NumGet(headers,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
VirtualAddress:=NumGet(headers,section+0xc,"Uint") ;IMAGE_SECTION_HEADER::VirtualAddress
if (!SizeOfRawData) {
if (SectionAlignment > 0) {
DllCall("VirtualAlloc","Ptr",code+VirtualAddress,"Ptr",SectionAlignment,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
; Always use position from file to support alignments smaller
; than page size (allocation above will align to page size).
dest:=code+VirtualAddress
; NOTE: On 64bit systems we truncate to 32bit here but expand
; again later when "PhysicalAddress" is used.
NumPut("Uint",dest & 0xffffffff,headers,section+0x8) ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
DllCall("ntdll\memset","Ptr",dest,"Int",0,"Ptr",SectionAlignment)
}
section+=0x28
continue
}
DllCall("VirtualAlloc","Ptr",code+VirtualAddress,"Ptr",SizeOfRawData,"Uint",0x00001000,"Uint",0x04,"Ptr") ;MEM_COMMIT, PAGE_READWRITE
; Always use position from file to support alignments smaller
; than page size (allocation above will align to page size).
dest:=code+VirtualAddress
PointerToRawData:=NumGet(headers,section+0x14,"Uint") ;IMAGE_SECTION_HEADER::PointerToRawData
DllCall("ntdll\memcpy","Ptr",dest,"Ptr",buf.Ptr+PointerToRawData,"Ptr",SizeOfRawData)
; NOTE: On 64bit systems we truncate to 32bit here but expand
; again later when "PhysicalAddress" is used.
NumPut("Uint",dest & 0xffffffff,headers,section+0x8) ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
section+=0x28
}
;CopySections END
locationDelta := code - ImageBase
if (locationDelta) {
throw "//unimplemented: PerformBaseRelocation()"
}
;BuildImportTable START
directory := e_lfanew+4*A_PtrSize+0x70 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
directory_Size:=NumGet(headers,directory+0x4,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size
if (directory_Size) {
directory_VirtualAddress:=NumGet(headers,directory+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
importDesc:=directory_VirtualAddress
loop {
importDesc_Name:=NumGet(code,importDesc+0xc,"Uint") ;IMAGE_IMPORT_DESCRIPTOR::Name
if (!importDesc_Name) {
break
}
handle := DllCall("LoadLibraryA","Ptr",code+importDesc_Name,"Ptr")
importDesc_OriginalFirstThunk:=NumGet(code,importDesc+0x0,"Uint") ; IMAGE_IMPORT_DESCRIPTOR::OriginalFirstThunk
importDesc_FirstThunk:=NumGet(code,importDesc+0x10,"Uint") ; IMAGE_IMPORT_DESCRIPTOR::FirstThunk
funcRef := code + importDesc_FirstThunk
if (importDesc_OriginalFirstThunk) {
thunkRef := code + importDesc_OriginalFirstThunk
} else {
; no hint table
thunkRef := funcRef
}
while (thunkRef_dereferenced:=NumGet(thunkRef,"Ptr")) {
if (thunkRef_dereferenced & (1<<(A_PtrSize<<3)-1)) {
NumPut("Ptr",DllCall("GetProcAddress","Ptr",handle,"Ptr",thunkRef_dereferenced & 0xffff,"Ptr"),funcRef)
} else {
NumPut("Ptr",DllCall("GetProcAddress","Ptr",handle,"Ptr",code+thunkRef_dereferenced+2,"Ptr"),funcRef)
}
thunkRef+=A_PtrSize, funcRef+=A_PtrSize
}
importDesc+=0x14
}
}
;BuildImportTable END
;FinalizeSections START
;READ
;COPY
;loop (Length-1) {
; READ
; UPDATE
; continue
;
; PROTECT
; COPY
;}
;PROTECT
;
;READ,(COPY,(READ,UPDATE)*,PROTECT)+
;
;possible:
;READ,UPDATE
;READ,UPDATE,PROTECT,COPY
;READ,COPY,PROTECT
;
;PROTECT:(i<=length) ? COPY : return
;COPY:(i<length) ? READ : ++i,PROTECT
;UPDATE:current_needs_to_be_copied ? PROTECT : ((i<length) ? READ : PROTECT)
;READ:(i==0) ? COPY : UPDATE
;ProtectionFlags:=[PAGE_NOACCESS,PAGE_EXECUTE,PAGE_READONLY,PAGE_EXECUTE_READ,PAGE_WRITECOPY,PAGE_EXECUTE_WRITECOPY,PAGE_READWRITE,PAGE_EXECUTE_READWRITE,]
ProtectionFlags:=[0x01,0x10,0x02,0x20,0x08,0x80,0x04,0x40,]
if (A_PtrSize==8) {
; "PhysicalAddress" might have been truncated to 32bit above, expand to
; 64bits again.
imageOffset := code & 0xffffffff00000000
} else {
imageOffset := 0
}
section:=e_lfanew+0x18+SizeOfOptionalHeader,end:=section + 0x28*NumberOfSections -0x28
start:=section
FinalizeSections_label:
while (section <= end) {
PhysicalAddress:=NumGet(headers,section+0x8,"Uint") ;IMAGE_SECTION_HEADER::Misc.PhysicalAddress
sectionAddress := PhysicalAddress | imageOffset
alignedAddress := AlignValueDown(sectionAddress, SectionAlignment)
sectionSize:=NumGet(headers,section+0x10,"Uint") ;IMAGE_SECTION_HEADER::SizeOfRawData
section_Characteristics:=NumGet(headers,section+0x24,"Uint") ;IMAGE_SECTION_HEADER::Characteristics
if (!sectionSize) {
if (section_Characteristics & 0x00000040) { ;IMAGE_SCN_CNT_INITIALIZED_DATA
sectionSize:=NumGet(headers,e_lfanew+0x20,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfInitializedData
} else if (section_Characteristics & 0x00000080) { ;IMAGE_SCN_CNT_UNINITIALIZED_DATA
sectionSize:=NumGet(headers,e_lfanew+0x24,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.SizeOfUninitializedData
}
}
loop {
if (section == start) {
sectionAddress_carry:=sectionAddress,alignedAddress_carry:=alignedAddress,sectionSize_carry:=sectionSize,section_Characteristics_carry:=section_Characteristics
if (section < end) {
section+=0x28
continue FinalizeSections_label
} else {
++section ;will trigger break FinalizeSections_label
}
} else {
; Combine access flags of all sections that share a page
; TODO(fancycode): We currently share flags of a trailing large section
; with the page of a first small section. This should be optimized.
if (alignedAddress_carry == alignedAddress || sectionAddress_carry + sectionSize_carry > alignedAddress) {
; Section shares page with previous
section_Characteristics_carry |= (section_Characteristics & 0xfdffffff) ;~IMAGE_SCN_MEM_DISCARDABLE
section_Characteristics_carry &= (section_Characteristics | 0xfdffffff) ;~IMAGE_SCN_MEM_DISCARDABLE
sectionSize_carry := sectionAddress + sectionSize - sectionAddress_carry
if (section < end) {
section+=0x28
continue FinalizeSections_label
}
}
}
;FinalizeSection START
loop 1 {
if (!sectionSize_carry) {
break
}
if (section_Characteristics_carry & 0x02000000) { ;IMAGE_SCN_MEM_DISCARDABLE
; section is not needed any more and can safely be freed
if (sectionAddress_carry == alignedAddress_carry) {
; Only allowed to decommit whole pages
DllCall("VirtualFree","Ptr",sectionAddress_carry,"Ptr",sectionSize_carry,"Uint",0x00004000) ;MEM_DECOMMIT
}
break
}
protect := ProtectionFlags[(section_Characteristics_carry >> 29)+1]
if (section_Characteristics_carry & 0x04000000) { ;IMAGE_SCN_MEM_NOT_CACHED
protect |= 0x200 ;PAGE_NOCACHE
}
DllCall("VirtualProtect","Ptr",sectionAddress_carry,"Ptr",sectionSize_carry,"Uint",protect,"Uint*",&oldProtect:=0)
}
if (section > end) {
break FinalizeSections_label
}
;FinalizeSection END
start:=section
}
}
;FinalizeSections END
;ExecuteTLS START
directory_TLS := e_lfanew+4*A_PtrSize+0xb0 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]
directory_TLS_VirtualAddress:=NumGet(headers,directory_TLS+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress
if (directory_TLS_VirtualAddress) {
tls := code + directory_TLS_VirtualAddress
callback:=NumGet(tls,3*A_PtrSize,"Ptr") ;IMAGE_TLS_DIRECTORY::AddressOfCallBacks
if (callback) {
while (callback_dereferenced:=NumGet(callback,"Ptr")) {
DllCall(callback_dereferenced,"Ptr",code,"Uint",1,"Ptr",0) ;DLL_PROCESS_ATTACH
callback+=A_PtrSize
}
}
}
;ExecuteTLS END
; get entry point of loaded library
AddressOfEntryPoint:=NumGet(headers,e_lfanew+0x28,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.AddressOfEntryPoint
FileHeader_Characteristics:=NumGet(buf,e_lfanew+0x16,"uShort") ;IMAGE_NT_HEADERS::FileHeader.Characteristics
if (AddressOfEntryPoint) {
if (FileHeader_Characteristics & 0x2000) { ;IMAGE_FILE_DLL
DllEntry := code + AddressOfEntryPoint
DllCall(DllEntry,"Ptr",code,"Uint",1,"Ptr",0) ;DLL_PROCESS_ATTACH
}
}
GetProcAddress_map:=Map()
directory_export := e_lfanew+4*A_PtrSize+0x68 ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
directory_export_VirtualAddress:=NumGet(headers,directory_export+0x0,"Uint") ;IMAGE_NT_HEADERS::OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress
exports:=code + directory_export_VirtualAddress
nameRef:=code + NumGet(exports,0x20,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfNames
ordinal:=code + NumGet(exports,0x24,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfNameOrdinals
NumberOfNames:=NumGet(exports,0x18,"Uint") ;IMAGE_EXPORT_DIRECTORY::NumberOfNames
AddressOfFunctions:=NumGet(exports,0x1c,"Uint") ;IMAGE_EXPORT_DIRECTORY::AddressOfFunctions
end:=nameRef+4*NumberOfNames
while (nameRef < end) {
name:=StrGet(code + NumGet(nameRef,"Uint"),"UTF-8")
GetProcAddress_map[name] := code + NumGet(code,AddressOfFunctions + NumGet(ordinal,"uShort")*4,"Uint")
nameRef+=4,ordinal+=2
}
return GetProcAddress_map
}
Code: Select all
crypt32_GetProcAddress_map:=MemoryLoadLibrary(FileRead("C:\Windows\System32\crypt32.dll","RAW"))
buf_for_u32:=Buffer(4)
NumPut("Uint",15 | 0xAA0000,buf_for_u32)
DllCall(crypt32_GetProcAddress_map["CryptBinaryToStringA"],"Ptr",buf_for_u32,"Uint",buf_for_u32.Size,"Uint",0x00000004,"Ptr",0,"Uint*",&bufAscii_Size:=0) ;CRYPT_STRING_HEX
bufAscii:=Buffer(bufAscii_Size)
DllCall(crypt32_GetProcAddress_map["CryptBinaryToStringA"],"Ptr",buf_for_u32,"Uint",buf_for_u32.Size,"Uint",0x00000004,"Ptr",bufAscii,"Uint*",&pcchString:=bufAscii.Size) ;CRYPT_STRING_HEX
MsgBox StrGet(bufAscii,"UTF-8")
Code: Select all
WindowsCodecs_GetProcAddress_map:=MemoryLoadLibrary(FileRead("C:\Windows\System32\WindowsCodecs.dll","RAW"))
DllCall("ole32\CLSIDFromString","WStr","{317d06e8-5f24-433d-bdf7-79ce68d8abc2}","Ptr",CLSID_WICImagingFactory:=Buffer(16))
DllCall("ole32\CLSIDFromString","WStr","{00000001-0000-0000-c000-000000000046}","Ptr",IID_IClassFactory:=Buffer(16))
DllCall(WindowsCodecs_GetProcAddress_map["DllGetClassObject"],"Ptr",CLSID_WICImagingFactory,"Ptr",IID_IClassFactory,"Ptr*",&IClassFactory:=0,"Ptr") ;0x180019290, 0XE06D7363
MsgBox IClassFactory