#if BF_PLATFORM_WINDOWS using System.IO; using System.Collections; using System.Text; namespace System { class Windows { public struct COM_IUnknown { public enum ClsContext : uint32 { NONE = 0, INPROC_SERVER = 0x1, INPROC_HANDLER = 0x2, LOCAL_SERVER = 0x4, INPROC_SERVER16 = 0x8, REMOTE_SERVER = 0x10, INPROC_HANDLER16 = 0x20, RESERVED1 = 0x40, RESERVED2 = 0x80, RESERVED3 = 0x100, RESERVED4 = 0x200, NO_CODE_DOWNLOAD = 0x400, RESERVED5 = 0x800, NO_CUSTOM_MARSHAL = 0x1000, ENABLE_CODE_DOWNLOAD = 0x2000, NO_FAILURE_LOG = 0x4000, DISABLE_AAA = 0x8000, ENABLE_AAA = 0x10000, FROM_DEFAULT_CONTEXT = 0x20000, ACTIVATE_X86_SERVER = 0x40000, #unwarn ACTIVATE_32_BIT_SERVER = ACTIVATE_X86_SERVER, ACTIVATE_64_BIT_SERVER = 0x80000, ENABLE_CLOAKING = 0x100000, APPCONTAINER = 0x400000, ACTIVATE_AAA_AS_IU = 0x800000, RESERVED6 = 0x01000000, ACTIVATE_ARM32_SERVER = 0x02000000, PS_DLL = 0x80000000, ALL = INPROC_SERVER | INPROC_HANDLER | LOCAL_SERVER | REMOTE_SERVER } public struct VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IUnknown* self, ref Guid riid, void** result) QueryInterface; public function [CallingConvention(.Stdcall)] uint32(COM_IUnknown* self) AddRef; public function [CallingConvention(.Stdcall)] uint32(COM_IUnknown* self) Release; } public enum HResult : int32 { case OK; public const HResult NOERROR = (.)0; public const HResult E_INVALIDARG = (.)0x80000003L; public const HResult E_ABORT = (.)0x80004004L; public const HResult E_FAIL = (.)0x80004005L; public const HResult E_ACCESSDENIED = (.)0x80070005L; public bool Failed { get { return this != .OK; } } } protected VTable* mVT; public VTable* VT { get { return (.)mVT; } } [Import("ole32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HResult CoCreateInstanceFromApp(ref Guid clsid, COM_IUnknown* unkOuter, ClsContext clsCtx, void* reserved, uint32 count, MULTI_QI* result); struct MULTI_QI { public Guid* mIID; public COM_IUnknown* mItf; public HResult mHR; } [Import("ole32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HResult CoCreateInstance(ref Guid clsId, COM_IUnknown* unkOuter, ClsContext clsCtx, ref Guid iid, void** result); [Import("ole32.lib"), CLink, CallingConvention(.Stdcall)] public static extern void CoTaskMemFree(void* ptr); } public struct COM_IBindCtx; public function int WndProc(HWnd hWnd, int32 msg, int wParam, int lParam); public delegate IntBool EnumThreadWindowsCallback(HWnd hWnd, void* extraParameter); public struct Rect : this(int32 left, int32 top, int32 right, int32 bottom) { public int32 Width => right - left; public int32 Height => bottom - top; } [CRepr] public struct OpenFileName { public int32 mStructSize = (int32)sizeof(OpenFileName); //ndirect.DllLib.sizeOf(this); public HWnd mHwndOwner; public HInstance mHInstance; public char16* mFilter; // use embedded nulls to separate filters public int mCustomFilter = 0; public int32 nMaxCustFilter = 0; public int32 nFilterIndex; public char16* mFile; public int32 nMaxFile = Windows.MAX_PATH; public int mFileTitle = 0; public int32 mMaxFileTitle = Windows.MAX_PATH; public char16* mInitialDir; public char16* mTitle; public int32 mFlags; public int16 mFileOffset = 0; public int16 mFileExtension = 0; public char16* mDefExt; public int mCustData = 0; public WndProc mHook; public char16* mTemplateName = null; public int mReserved1 = 0; public int32 mReserved2 = 0; public int32 mFlagsEx; } public enum BrowseInfos { NewDialogStyle = 0x0040, // Use the new dialog layout with the ability to resize HideNewFolderButton = 0x0200 // Don't display the 'New Folder' button } [CRepr] public struct BrowseInfo { public HWnd mHWndOwner; public int mIdlRoot; public char8* mDisplayName; public char8* mTitle; public int32 mFlags; public WndProc mCallback; public int mLParam; public int32 mImage; } [CRepr] public struct SHFileInfo { public Handle mHIcon; // out: icon public int32 mIIcon; // out: icon index public uint32 mAttributes; // out: SFGAO_ flags public char16[Windows.MAX_PATH] mDisplayName; // out: display name (or path) public char16[80] mTypeName; // out: type name } public const int32 SHGFI_ICON = 0x00000100; // get icon public const int32 SHGFI_DISPLAYNAME = 0x00000200; // get display name public const int32 SHGFI_TYPENAME = 0x00000400; // get type name public const int32 SHGFI_ATTRIBUTES = 0x00000800; // get attributes public const int32 SHGFI_ICONLOCATION = 0x00001000; // get icon location public const int32 SHGFI_EXETYPE = 0x00002000; // return exe type public const int32 SHGFI_SYSICONINDEX = 0x00004000; // get system icon index public const int32 SHGFI_LINKOVERLAY = 0x00008000; // put a link overlay on icon public const int32 SHGFI_SELECTED = 0x00010000; // show icon in selected state public const int32 SHGFI_ATTR_SPECIFIED = 0x00020000; // get only specified attributes public const int32 SHGFI_LARGEICON = 0x00000000; // get large icon public const int32 SHGFI_SMALLICON = 0x00000001; // get small icon public const int32 SHGFI_OPENICON = 0x00000002; // get open icon public const int32 SHGFI_SHELLICONSIZE = 0x00000004; // get shell size icon public const int32 SHGFI_PIDL = 0x00000008; // pszPath is a pidl public const int32 SHGFI_USEFILEATTRIBUTES = 0x00000010; // use passed dwFileAttribute public const int32 SHGFI_ADDOVERLAYS = 0x00000020; // apply the appropriate overlays public const int32 SHGFI_OVERLAYINDEX = 0x00000040; // Get the index of the overlay public const int32 REG_NONE = 0; // No value type public const int32 REG_SZ = 1; // Unicode nul terminated string public const int32 REG_EXPAND_SZ = 2; // Unicode nul terminated string // (with environment variable references) public const int32 REG_BINARY = 3; // Free form binary public const int32 REG_DWORD = 4; // 32-bit number public const int32 REG_DWORD_LITTLE_ENDIAN = 4; // 32-bit number (same as REG_DWORD) public const int32 REG_DWORD_BIG_ENDIAN = 5; // 32-bit number public const int32 REG_LINK = 6; // Symbolic Link (unicode) public const int32 REG_MULTI_SZ = 7; // Multiple Unicode strings public const int32 REG_RESOURCE_LIST = 8; // Resource list in the resource map public const int32 REG_FULL_RESOURCE_DESCRIPTOR = 9; // Resource list in the hardware description public const int32 REG_RESOURCE_REQUIREMENTS_LIST = 10; public const int32 REG_QWORD = 11; // 64-bit number public const int32 REG_QWORD_LITTLE_ENDIAN = 11; // 64-bit number (same as REG_QWORD) public const int32 REG_OPTION_NON_VOLATILE = 0; public const int32 MB_OK = 0; public const int32 MB_OKCANCEL = 1; public const int32 MB_YESNO = 4; public const int32 MB_ICONHAND = 0x10; public const int32 MB_ICONQUESTION = 0x20; public const int32 IDOK = 1; public const int32 IDYES = 6; public const int32 LOAD_LIBRARY_AS_DATAFILE = 0x00000002; public const int32 LOAD_STRING_MAX_LENGTH = 500; public const int32 MUI_PREFERRED_UI_LANGUAGES = 0x10; public const int32 SECTION_QUERY = 0x0001; public const int32 SECTION_MAP_WRITE = 0x0002; public const int32 SECTION_MAP_READ = 0x0004; public const int32 SECTION_MAP_EXECUTE = 0x0008; public const int32 SECTION_EXTEND_SIZE = 0x0010; public const int32 FILE_MAP_WRITE = SECTION_MAP_WRITE; public const int32 FILE_MAP_READ = SECTION_MAP_READ; //public const int32 FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS; public enum FOS : uint32 { FOS_OVERWRITEPROMPT = 0x00000002, FOS_STRICTFILETYPES = 0x00000004, FOS_NOCHANGEDIR = 0x00000008, FOS_PICKFOLDERS = 0x00000020, FOS_FORCEFILESYSTEM = 0x00000040, FOS_ALLNONSTORAGEITEMS = 0x00000080, FOS_NOVALIDATE = 0x00000100, FOS_ALLOWMULTISELECT = 0x00000200, FOS_PATHMUSTEXIST = 0x00000800, FOS_FILEMUSTEXIST = 0x00001000, FOS_CREATEPROMPT = 0x00002000, FOS_SHAREAWARE = 0x00004000, FOS_NOREADONLYRETURN = 0x00008000, FOS_NOTESTFILECREATE = 0x00010000, FOS_HIDEMRUPLACES = 0x00020000, FOS_HIDEPINNEDPLACES = 0x00040000, FOS_NODEREFERENCELINKS = 0x00100000, FOS_DONTADDTORECENT = 0x02000000, FOS_FORCESHOWHIDDEN = 0x10000000, FOS_DEFAULTNOMINIMODE = 0x20000000 } public struct Handle : int { public const Handle InvalidHandle = (Handle)-1; public const Handle NullHandle = (Handle)+0; public bool IsInvalid { get { return ((int)this == (int)(-1)) || ((int)this == (int)0); } } public void Close() { Windows.CloseHandle(this); } } public struct HKey : int { public bool IsInvalid { get { return ((int)this == (int)(-1)) || ((int)this == (int)0); } } public void Close() { Windows.RegCloseKey(this); } protected Result GetValue(StringView name, delegate void(uint32 regType, Span regData) onData) { uint8[4096] buffer; uint8* bufPtr = &buffer; int bufSize = sizeof(decltype(buffer)); defer { if (bufPtr != &buffer) delete bufPtr; } while (true) { uint32 regType = 0; uint32 newBufSize = (uint32)bufSize; int ret = Windows.RegQueryValueExW(this, name.ToScopedNativeWChar!(), null, ®Type, bufPtr, &newBufSize); if (ret == 0) { onData(regType, .(bufPtr, (int)newBufSize)); break; } if (ret != ERROR_MORE_DATA) return .Err; bufSize = (.)newBufSize; let newBuf = new uint8[bufSize]*; if (bufPtr != &buffer) delete bufPtr; bufPtr = newBuf; } return .Ok; } public Result GetValue(StringView name) { Variant val = default; GetValue(name, scope [&] (regType, regData) => { switch (regType) { case Windows.REG_DWORD: val = Variant.Create(*(int32*)regData.Ptr); case Windows.REG_SZ: var span = Span((char16*)regData.Ptr, regData.Length / 2); if ((span.Length > 0) && (span[span.Length - 1] == 0)) span.RemoveFromEnd(1); String str = scope String(span); val = Variant.Create(str); case Windows.REG_QWORD: val = Variant.Create(*(int64*)regData.Ptr); default: Runtime.NotImplemented(); } }).IgnoreError(); if (!val.HasValue) return .Err; return val; } public Result GetValue(StringView name, List outData) { bool gotData = false; GetValue(name, scope [?] (regType, regData) => { if (regType == Windows.REG_BINARY) { gotData = true; outData.AddRange(regData); } }).IgnoreError(); if (!gotData) return .Err; return .Ok; } public Result GetValue(StringView name, String outData) { bool gotData = false; GetValue(name, scope [?] (regType, regData) => { if ((regType == Windows.REG_SZ) || (regType == Windows.REG_EXPAND_SZ)) { gotData = true; var span = Span((char16*)regData.Ptr, regData.Length / 2); if ((span.Length > 0) && (span[span.Length - 1] == 0)) span.RemoveFromEnd(1); outData.Append(span); } }).IgnoreError(); if (!gotData) return .Err; return .Ok; } public Result GetValueT(StringView name, ref T data) { bool gotData = false; int sizeofT = sizeof(T); GetValue(name, scope [&] (regType, regData) => { if ((regType == Windows.REG_BINARY) && (regData.Length == sizeofT)) { Internal.MemCpy(&data, regData.Ptr, sizeofT); gotData = true; } }).IgnoreError(); if (!gotData) return .Err; return .Ok; } public Result EnumValue(int idx, String outName) { char16[2048] nameBuffer; uint8[4096] buffer; char16* namePtr = &nameBuffer; uint8* bufPtr = &buffer; uint32 nameSize = sizeof(decltype(nameBuffer)); uint32 bufSize = sizeof(decltype(buffer)); defer { if (bufPtr != &buffer) delete bufPtr; if (namePtr != &nameBuffer) delete namePtr; } while (true) { uint32 regType = 0; uint32 newNameSize = (.)nameSize; uint32 newBufSize = (.)bufSize; int ret = Windows.RegEnumValueW(this, (.)idx, namePtr, &newNameSize, null, ®Type, bufPtr, &newBufSize); if (ret == 0) break; if (ret != ERROR_MORE_DATA) return .Err; if (newNameSize > nameSize) { nameSize = newNameSize; let newBuf = new uint8*[(.)nameSize]*; if (namePtr != &nameBuffer) delete namePtr; namePtr = (char16*)newBuf; } if (newBufSize > bufSize) { bufSize = newBufSize; let newBuf = new uint8[(.)bufSize]*; if (bufPtr != &buffer) delete bufPtr; bufPtr = newBuf; } } Runtime.NotImplemented(); //return Variant.Create(1234); } public Result SetValue(StringView name, uint32 val) { var val; let result = Windows.RegSetValueExA(this, name.ToScopeCStr!(), 0, Windows.REG_DWORD, &val, 4); if (result != 0) return .Err; return .Ok; } public Result SetValue(StringView name, StringView strValue) { let result = Windows.RegSetValueExA(this, name.ToScopeCStr!(), 0, Windows.REG_SZ, strValue.ToScopeCStr!(), (uint32)strValue.Length + 1); if (result != 0) return .Err; return .Ok; } public Result SetValueExpand(StringView name, StringView strValue) { let result = Windows.RegSetValueExA(this, name.ToScopeCStr!(), 0, Windows.REG_EXPAND_SZ, strValue.ToScopeCStr!(), (uint32)strValue.Length + 1); if (result != 0) return .Err; return .Ok; } } public struct HWnd : int { public const HWnd Broadcast = (.)0xFFFF; } public struct HModule : int { public bool IsInvalid { get { return ((int)this == (int)(-1)) || ((int)this == (int)0); } } } public struct HInstance : HModule { } public struct FindHandle : int { public const FindHandle InvalidHandle = (FindHandle)-1; public const FindHandle NullHandle = (FindHandle)+0; public bool IsInvalid { get { return ((int)this == (int)(-1)) || ((int)this == (int)0); } } public void Close() { Windows.FindClose(this); } } public struct IntBool : int32 { public static implicit operator IntBool(bool value) { return (IntBool)(value ? 1 : 0); } public static implicit operator bool(IntBool value) { return value != 0; } } public struct FileHandle : Handle { public new const FileHandle InvalidHandle = (FileHandle)-1; } public struct EventHandle : Handle { } public struct ProcessHandle : Handle { } public struct IOCompletionHandle : Handle { public new const IOCompletionHandle NullHandle = (IOCompletionHandle)+0; } [CRepr] public struct FileNotifyInformation { public int32 mNextEntryOffset; public int32 mAction; public int32 mFileNameLength; public uint16 mFileName; } [CRepr] public struct Overlapped { public int mInternal; public int mInternalHigh; public uint32 mOffset; public uint32 mOffsetHigh; public Handle mHEvent; } [CRepr] public struct ShellExecuteInfo { public uint32 mSize = (uint32)sizeof(ShellExecuteInfo); public uint32 mMask; public Handle mHWnd; public char8* mVerb; public char8* mFile; public char8* mParameters; public char8* mDirectory; public int32 mShow; public Handle mInstApp; public void* mIDList; public char8* mClass; public Handle mHKeyClass; public uint32 mHotKey; public Handle mMonitorOrIcon; public ProcessHandle mProcess; } [CRepr] public struct StartupInfo { public int32 mCb = (int32)sizeof(StartupInfo); public char8* mReserved; public char8* mDesktop; public char8* mTitle; public int32 mX; public int32 mY; public int32 mXSize; public int32 mYSize; public int32 mXCountChars; public int32 mYCountChars; public int32 mFillAttribute; public int32 mFlags; public int16 mShowWindow; public int16 mReserved2; public uint8* mReserved3; public FileHandle mStdInput; public FileHandle mStdOutput; public FileHandle mStdError; } [CRepr] public struct ProcessInformation { public ProcessHandle mProcess; public Handle mThread; public int32 mProcessId; public int32 mThreadId; } [CRepr] public struct SystemTime { public uint16 mYear; public uint16 mMonth; public uint16 mDayOfWeek; public uint16 mDay; public uint16 mHour; public uint16 mMinute; public uint16 mSecond; public uint16 mMilliseconds; } [CRepr] public struct TimeZoneInformation { public int32 mBias; public char16[32] mStandardName; public SystemTime mStandardDate; public int32 mStandardBias; public char16[32] mDaylightName; public SystemTime mDaylightDate; public int32 mDaylightBias; public this() { this = default; } public this(DynamicTimeZoneInformation dtzi) { mBias = dtzi.mBias; mStandardName = dtzi.mStandardName; mStandardDate = dtzi.mStandardDate; mStandardBias = dtzi.mStandardBias; mDaylightName = dtzi.mDaylightName; mDaylightDate = dtzi.mDaylightDate; mDaylightBias = dtzi.mDaylightBias; } } [CRepr] public struct RegistryTimeZoneInformation { public int32 mBias; public int32 mStandardBias; public int32 mDaylightBias; public SystemTime mStandardDate; public SystemTime mDaylightDate; public this() { this = default; } public this(TimeZoneInformation tzi) { mBias = tzi.mBias; mStandardDate = tzi.mStandardDate; mStandardBias = tzi.mStandardBias; mDaylightDate = tzi.mDaylightDate; mDaylightBias = tzi.mDaylightBias; } } [CRepr] public struct DynamicTimeZoneInformation { public int32 mBias; public char16[32] mStandardName; public SystemTime mStandardDate; public int32 mStandardBias; public char16[32] mDaylightName; public SystemTime mDaylightDate; public int32 mDaylightBias; public char16[128] mTimeZoneKeyName; public IntBool mDynamicDaylightTimeDisabled; } public struct Int64_Rev { public int32 mHigh; public int32 mLow; public int64 Value { get { return ((int64)mHigh<<32) | mLow; } set mut { mLow = (int32)value; mHigh = (int32)(value >> 32); } } } [CRepr, Packed] public struct FileAttributeData { public int32 mFileAttributes; public uint64 mCreationTime; public uint64 mLastAccessTime; public uint64 mLastWriteTime; public Int64_Rev mFileSize; public void PopulateFrom(NativeFindDataA findData) mut { // Copy the information to data mFileAttributes = findData.mFileAttributes; mCreationTime = findData.mCreationTime; mLastAccessTime = findData.mLastAccessTime; mLastWriteTime = findData.mLastWriteTime; mFileSize = findData.mFileSize; } public void PopulateFrom(NativeFindData findData) mut { // Copy the information to data mFileAttributes = findData.mFileAttributes; mCreationTime = findData.mCreationTime; mLastAccessTime = findData.mLastAccessTime; mLastWriteTime = findData.mLastWriteTime; mFileSize = findData.mFileSize; } } [CRepr, Packed] public struct NativeFindDataA { public int32 mFileAttributes; public uint64 mCreationTime; public uint64 mLastAccessTime; public uint64 mLastWriteTime; public Int64_Rev mFileSize; public int32 mReserved0; public int32 mReserved1; public char8[260] mFileName; public char8[14] mAlternateFileName; } [CRepr, Packed] public struct NativeFindData { public int32 mFileAttributes; public uint64 mCreationTime; public uint64 mLastAccessTime; public uint64 mLastWriteTime; public Int64_Rev mFileSize; public int32 mReserved0; public int32 mReserved1; public char16[260] mFileName; public char16[14] mAlternateFileName; } public const int32 S_OK = 0; public const int32 MAX_PATH = 260; public const int32 SEE_MASK_DEFAULT = 0; public const int32 SEE_MASK_NOCLOSEPROCESS = 0x40; public const int32 SEE_MASK_FLAG_NO_UI = 0x400; public const int32 SEE_MASK_FLAG_DDEWAIT = 0x100; public const int32 FILE_ATTRIBUTE_READONLY = 0x00000001; public const int32 FILE_ATTRIBUTE_DIRECTORY = 0x00000010; public const int32 FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400; public const int32 GENERIC_READ = (.)0x80000000; public const int32 GENERIC_WRITE = 0x40000000; public const int32 GENERIC_EXECUTE = 0x20000000; public const int32 GENERIC_ALL = 0x10000000; public const int32 SW_HIDE = 0; public const int32 SW_MAXIMIZE = 3; public const int32 SW_MINIMIZE = 6; public const int32 SW_RESTORE = 9; public const int32 SW_SHOW = 5; public const int32 SW_SHOWDEFAULT = 10; public const int32 SW_SHOWMAXIMIZED = 3; public const int32 SW_SHOWMINIMIZED = 2; public const int32 SW_SHOWMINNOACTIVE = 7; public const int32 SW_SHOWNA = 8; public const int32 SW_SHOWNOACTIVATE = 4; public const int32 SW_SHOWNORMAL = 1; public const int32 GW_OWNER = 4; public const int32 STD_INPUT_HANDLE = -10; public const int32 STD_OUTPUT_HANDLE = -11; public const int32 STD_ERROR_HANDLE = -12; public const int32 CREATE_SUSPENDED = 0x00000004; public const int32 CREATE_NO_WINDOW = 0x08000000; // From WinBase.h public const int32 FILE_TYPE_DISK = 0x0001; public const int32 FILE_TYPE_CHAR = 0x0002; public const int32 FILE_TYPE_PIPE = 0x0003; public const int32 FILE_READ_DATA = (0x0001); public const int32 FILE_WRITE_DATA = (0x0002); public const int32 FILE_LIST_DIRECTORY = (0x0001); public const int32 FILE_SHARE_READ = 0x00000001; public const int32 FILE_SHARE_WRITE = 0x00000002; public const int32 FILE_SHARE_DELETE = 0x00000004; public const int32 FILE_BEGIN = 0; public const int32 FILE_CURRENT = 1; public const int32 FILE_END = 2; public const int32 FILE_FLAG_OVERLAPPED = 0x40000000; public const int32 FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; public const int32 FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000; public const int32 FILE_FLAG_WRITE_THROUGH = (int32)0x80000000; public const int32 DUPLICATE_CLOSE_SOURCE = 0x1; public const int32 DUPLICATE_SAME_ACCESS = 0x2; public const int32 WAIT_ABANDONED = 0x80; public const int32 WAIT_OBJECT_0 = 0; public const int32 WAIT_TIMEOUT = 0x102; public const int32 WAIT_FAILED = -1; public const int32 STARTF_USESTDHANDLES = 0x00000100; public const int32 ERROR_BAD_EXE_FORMAT = 193; public const int32 ERROR_EXE_MACHINE_TYPE_MISMATCH = 216; public const int32 ERROR_ABANDONED_WAIT_0 = 735; public const int32 ERROR_PIPE_CONNECTED = 535; public const int32 ERROR_BROKEN_PIPE = 109; public const int32 ERROR_MORE_DATA = 234; public const int32 ERROR_NO_DATA = 232; public const int32 ERROR_NO_MORE_ITEMS = 259; public const int32 PROCESS_QUERY_INFORMATION = 0x0400; public const int32 STATUS_PENDING = 0x00000103; public const int32 STILL_ACTIVE = STATUS_PENDING; public const int32 SYNCHRONIZE = 0x00100000; public const int32 SEM_FAILCRITICALERRORS = 1; public const int32 ERROR_SUCCESS = 0x0; public const int32 ERROR_INVALID_FUNCTION = 0x1; public const int32 ERROR_FILE_NOT_FOUND = 0x2; public const int32 ERROR_PATH_NOT_FOUND = 0x3; public const int32 ERROR_ACCESS_DENIED = 0x5; public const int32 ERROR_INVALID_HANDLE = 0x6; public const int32 ERROR_NOT_ENOUGH_MEMORY = 0x8; public const int32 ERROR_INVALID_DATA = 0xd; public const int32 ERROR_INVALID_DRIVE = 0xf; public const int32 ERROR_NO_MORE_FILES = 0x12; public const int32 ERROR_NOT_READY = 0x15; public const int32 ERROR_SHARING_VIOLATION = 32; public const int32 ERROR_ALREADY_EXISTS = 0xB7; public const int32 GetFileExInfoStandard = 0; public const int32 GWL_WNDPROC = (-4); public const int32 GWL_HWNDPARENT = (-8); public const int32 GWL_STYLE = (-16); public const int32 GWL_EXSTYLE = (-20); public const int32 GWL_ID = (-12); public const int32 GW_HWNDFIRST = 0; public const int32 GW_HWNDLAST = 1; public const int32 GW_HWNDNEXT = 2; public const int32 GW_HWNDPREV = 3; public const int32 OFN_READONLY = 0x00000001; public const int32 OFN_OVERWRITEPROMPT = 0x00000002; public const int32 OFN_HIDEREADONLY = 0x00000004; public const int32 OFN_NOCHANGEDIR = 0x00000008; public const int32 OFN_SHOWHELP = 0x00000010; public const int32 OFN_ENABLEHOOK = 0x00000020; public const int32 OFN_NOVALIDATE = 0x00000100; public const int32 OFN_ALLOWMULTISELECT = 0x00000200; public const int32 OFN_PATHMUSTEXIST = 0x00000800; public const int32 OFN_FILEMUSTEXIST = 0x00001000; public const int32 OFN_CREATEPROMPT = 0x00002000; public const int32 OFN_EXPLORER = 0x00080000; public const int32 OFN_NODEREFERENCELINKS = 0x00100000; public const int32 OFN_ENABLESIZING = 0x00800000; public const int32 OFN_USESHELLITEM = 0x01000000; public const int32 CSIDL_DESKTOP = 0x0000; public const int32 CSIDL_PROGRAMS = 0x0002; // Start Menu\Programs public const int32 CSIDL_PERSONAL = 0x0005; // My Documents public const int32 CSIDL_STARTUP = 0x0007; // Start Menu\Programs\Startup public const int32 CSIDL_LOCAL_APPDATA = 0x001c;// \Local Settings\Applicaiton Data (non roaming) public const int32 CSIDL_COMMON_APPDATA = 0x0023; // All Users\Application Data public const int32 CSIDL_PROGRAM_FILES = 0x0026; // C:\Program Files public const int32 WM_CLOSE = 0x0010; public const int32 WM_DESTROY = 0x0002; public const int32 WM_INITDIALOG = 0x0110; public const int32 WM_SETFOCUS = 0x0007; public const int32 WM_USER = 0x0400; public const int32 WM_KEYDOWN = 0x0100; public const int32 WM_KEYUP = 0x0101; public const int32 WM_CHAR = 0x0102; public const int32 WM_SETTINGCHANGE = 0x001A; public const int32 BFFM_INITIALIZED = 1; public const int32 BFFM_SELCHANGED = 2; public const int32 BFFM_SETSELECTIONA = 0x400 + 102; public const int32 BFFM_SETSELECTIONW = 0x400 + 103; public const int32 BFFM_ENABLEOK = 0x400 + 101; public const int32 STANDARD_RIGHTS_REQUIRED = 0x000F0000; public const int32 PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF; public const uint32 STATUS_INFO_LENGTH_MISMATCH = 0xC0000004; public const int32 PIPE_ACCESS_DUPLEX = 0x00000003; public const int32 PIPE_ACCESS_INBOUND = 0x00000001; public const int32 PIPE_ACCESS_OUTBOUND = 0x00000002; public const int32 WRITE_DAC = 0x00040000; public const int32 WRITE_OWNER = 0x00080000; public const int32 ACCESS_SYSTEM_SECURITY = 0x01000000; public const int32 PIPE_TYPE_BYTE = 0x00000000; public const int32 PIPE_TYPE_MESSAGE = 0x00000004; public const int32 PIPE_READMODE_BYTE = 0x00000000; public const int32 PIPE_READMODE_MESSAGE = 0x00000002; public const int32 PIPE_WAIT = 0x00000000; public const int32 PIPE_NOWAIT = 0x00000001; public const int32 PIPE_ACCEPT_REMOTE_CLIENTS = 0x00000000; public const int32 PIPE_REJECT_REMOTE_CLIENTS = 0x00000008; public const int32 PIPE_UNLIMITED_INSTANCES = 255; public const int32 MEM_COMMIT = 0x1000; public const int32 MEM_RESERVE = 0x2000; public const int32 MEM_DECOMMIT = 0x4000; public const int32 MEM_RELEASE = 0x8000; public const int32 PAGE_NOACCESS = 0x01; public const int32 PAGE_READONLY = 0x02; public const int32 PAGE_READWRITE = 0x04; public const int32 PAGE_WRITECOPY = 0x08; public const int32 KEY_EXECUTE = (0x20019); public const int32 KEY_READ = (0x20019); public const int32 KEY_WRITE = (0x20006); public const int32 KEY_ALL_ACCESS = (0xf003f); public const int32 KEY_QUERY_VALUE = (0x0001); public const int32 KEY_SET_VALUE = (0x0002); public const int32 KEY_CREATE_SUB_KEY = (0x0004); public const int32 KEY_ENUMERATE_SUB_KEYS = (0x0008); public const int32 KEY_NOTIFY = (0x0010); public const int32 KEY_CREATE_LINK = (0x0020); public const int32 KEY_WOW64_32KEY = (0x0200); public const int32 KEY_WOW64_64KEY = (0x0100); public const int32 KEY_WOW64_RES = (0x0300); public const HKey HKEY_CLASSES_ROOT = (HKey)0x80000000; public const HKey HKEY_CURRENT_USER = (HKey)0x80000001; public const HKey HKEY_LOCAL_MACHINE = (HKey)0x80000002; public const HKey HKEY_USERS = (HKey)0x80000003; public const HKey HKEY_PERFORMANCE_DATA = (HKey)0x80000004; public const HKey HKEY_PERFORMANCE_TEXT = (HKey)0x80000050; public const HKey HKEY_PERFORMANCE_NLSTEXT = (HKey)0x80000060; public const HKey HKEY_CURRENT_CONFIG = (HKey)0x80000005; public const HKey HKEY_DYN_DATA = (HKey)0x80000006; public const HKey HKEY_CURRENT_USER_LOCAL_SETTINGS = (HKey)0x80000007; public const int32 NtQueryProcessBasicInfo = 0; public const int32 NtQuerySystemProcessInformation = 5; public const int32 TIME_ZONE_ID_INVALID = -1; public const int32 OBJECT_INHERIT_ACE = 1; public const int32 CONTAINER_INHERIT_ACE = 2; public const int32 NO_PROPAGATE_INHERIT_ACE = 4; public const int32 INHERIT_ONLY_ACE = 8; public const int32 INHERITED_ACE = 0x10; public const int32 VALID_INHERIT_FLAGS = 0x1F; public const int32 SMTO_NORMAL = 0x0000; public const int32 SMTO_BLOCK = 0x0001; public const int32 SMTO_ABORTIFHUNG = 0x0002; public const int32 VS_FF_DEBUG = 0x00000001; public const int32 VS_FF_PRERELEASE = 0x00000002; public const int32 VS_FF_PATCHED = 0x00000004; public const int32 VS_FF_PRIVATEBUILD = 0x00000008; public const int32 VS_FF_INFOINFERRED = 0x00000010; public const int32 VS_FF_SPECIALBUILD = 0x00000020L; [CRepr] public struct VS_FIXEDFILEINFO { public uint32 dwSignature; /* e.g. 0xfeef04bd */ public uint32 dwStrucVersion; /* e.g. 0x00000042 = "0.42" */ public uint32 dwFileVersionMS; /* e.g. 0x00030075 = "3.75" */ public uint32 dwFileVersionLS; /* e.g. 0x00000031 = "0.31" */ public uint32 dwProductVersionMS; /* e.g. 0x00030010 = "3.10" */ public uint32 dwProductVersionLS; /* e.g. 0x00000031 = "0.31" */ public uint32 dwFileFlagsMask; /* = 0x3F for version "0.42" */ public uint32 dwFileFlags; /* e.g. VFF_DEBUG | VFF_PRERELEASE */ public uint32 dwFileOS; /* e.g. VOS_DOS_WINDOWS16 */ public uint32 dwFileType; /* e.g. VFT_DRIVER */ public uint32 dwFileSubtype; /* e.g. VFT2_DRV_KEYBOARD */ public uint32 dwFileDateMS; /* e.g. 0 */ public uint32 dwFileDateLS; /* e.g. 0 */ } enum SECURITY_INFORMATION : int32 { DACL_SECURITY_INFORMATION = 4 } enum SE_OBJECT_TYPE : int32 { SE_UNKNOWN_OBJECT_TYPE, SE_FILE_OBJECT, SE_SERVICE, SE_PRINTER, SE_REGISTRY_KEY, SE_LMSHARE, SE_KERNEL_OBJECT, SE_WINDOW_OBJECT, SE_DS_OBJECT, SE_DS_OBJECT_ALL, SE_PROVIDER_DEFINED_OBJECT, SE_WMIGUID_OBJECT, SE_REGISTRY_WOW64_32KEY, SE_REGISTRY_WOW64_64KEY } public struct SID; public struct SECURITY_DESCRIPTOR; [CRepr] public struct ACL { uint8 AclRevision; uint8 Sbz1; uint16 AclSize; uint16 AceCount; uint16 Sbz2; } public enum ACCESS_MODE : int32 { NOT_USED_ACCESS = 0, GRANT_ACCESS, SET_ACCESS, DENY_ACCESS, REVOKE_ACCESS, SET_AUDIT_SUCCESS, SET_AUDIT_FAILURE } public enum MULTIPLE_TRUSTEE_OPERATION : int32 { NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_IMPERSONATE, } public enum TRUSTEE_FORM : int32 { TRUSTEE_IS_SID, TRUSTEE_IS_NAME, TRUSTEE_BAD_FORM, TRUSTEE_IS_OBJECTS_AND_SID, TRUSTEE_IS_OBJECTS_AND_NAME } public enum TRUSTEE_TYPE : int32 { TRUSTEE_IS_UNKNOWN, TRUSTEE_IS_USER, TRUSTEE_IS_GROUP, TRUSTEE_IS_DOMAIN, TRUSTEE_IS_ALIAS, TRUSTEE_IS_WELL_KNOWN_GROUP, TRUSTEE_IS_DELETED, TRUSTEE_IS_INVALID, TRUSTEE_IS_COMPUTER } [CRepr] public struct TRUSTEE_W { TRUSTEE_W* pMultipleTrustee; MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation; TRUSTEE_FORM TrusteeForm; TRUSTEE_TYPE TrusteeType; char16* ptstrName; } [CRepr] public struct EXPLICIT_ACCESS_W { uint32 grfAccessPermissions; ACCESS_MODE grfAccessMode; uint32 grfInheritance; TRUSTEE_W Trustee; } struct COM_IFileDialogEvents : Windows.COM_IUnknown { struct FDE_SHAREVIOLATION_RESPONSE; struct FDE_OVERWRITE_RESPONSE; public struct VTable : Windows.COM_IUnknown.VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog) OnFileOk; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog, COM_IShellItem* psiFolder) OnFolderChanging; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog) OnFolderChange; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog) OnSelectionChange; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog, FDE_SHAREVIOLATION_RESPONSE* pResponse) OnShareViolation; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog) OnTypeChange; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialogEvents* self, COM_IFileDialog* fileDialog, COM_IShellItem* shellItem, FDE_OVERWRITE_RESPONSE* response) OnOverwrite; } } public struct COM_IShellItem : Windows.COM_IUnknown { public static Guid sIID = .(0x43826d1e, 0xe718, 0x42ee, 0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe); public enum SIGDN : uint32 { NORMALDISPLAY = 0x00000000, // SHGDN_NORMAL PARENTRELATIVEPARSING = 0x80018001, // SHGDN_INFOLDER | SHGDN_FORPARSING DESKTOPABSOLUTEPARSING = 0x80028000, // SHGDN_FORPARSING PARENTRELATIVEEDITING = 0x80031001, // SHGDN_INFOLDER | SHGDN_FOREDITING DESKTOPABSOLUTEEDITING = 0x8004c000, // SHGDN_FORPARSING | SHGDN_FORADDRESSBAR FILESYSPATH = 0x80058000, // SHGDN_FORPARSING URL = 0x80068000, // SHGDN_FORPARSING PARENTRELATIVEFORADDRESSBAR = 0x8007c001, // SHGDN_INFOLDER | SHGDN_FORPARSING | SHGDN_FORADDRESSBAR PARENTRELATIVE = 0x80080001 // SHGDN_INFOLDER } public struct VTable : Windows.COM_IUnknown.VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IShellItem* self, void* pbc, ref Guid bhid, ref Guid riid, void** ppv) BindToHandler; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItem* self, out COM_IShellItem* ppsi) GetParent; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItem* self, SIGDN sigdnName, out char16* ppszName) GetDisplayName; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItem* self, uint sfgaoMask, out uint psfgaoAttribs) GetAttributes; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItem* self, COM_IShellItem* psi, uint32 hint, out int32 piOrder) Compare; } public new VTable* VT { get { return (.)mVT; } } } public struct COM_IShellItemArray : Windows.COM_IUnknown { public enum GETPROPERTYSTOREFLAGS : uint { DEFAULT = 0x00000000, HANDLERPROPERTIESONLY = 0x00000001, READWRITE = 0x00000002, TEMPORARY = 0x00000004, FASTPROPERTIESONLY = 0x00000008, OPENSLOWITEM = 0x00000010, DELAYCREATION = 0x00000020, BESTEFFORT = 0x00000040, NO_OPLOCK = 0x00000080, PREFERQUERYPROPERTIES = 0x00000100, EXTRINSICPROPERTIES = 0x00000200, EXTRINSICPROPERTIESONLY = 0x00000400, VOLATILEPROPERTIES = 0x00000800, VOLATILEPROPERTIESONLY = 0x00001000, MASK_VALID = 0x00001FFF } [AllowDuplicates] public enum SIATTRIBFLAGS : uint { AND = 0x1, OR = 0x2, APPCOMPAT = 0x3, MASK = 0x3, ALLITEMS = 0x4000 } public struct PROPERTYKEY; public static Guid sIID = .(0xB63EA76D, 0x1F85, 0x456F, 0xA1, 0x9C, 0x48, 0x15, 0x9E, 0xFA, 0x85, 0x8B); public struct VTable : Windows.COM_IUnknown.VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, void* pbc, ref Guid rbhid, ref Guid riid, out void* ppvOut) BindToHandler; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, GETPROPERTYSTOREFLAGS flags, ref Guid riid, out void* ppv) GetPropertyStore; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, ref PROPERTYKEY keyType, ref Guid riid, out void* ppv) GetPropertyDescriptionList; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, SIATTRIBFLAGS dwAttribFlags, uint32 sfgaoMask, out uint32 psfgaoAttribs) GetAttributes; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, out uint32 pdwNumItems) GetCount; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, uint32 dwIndex, out COM_IShellItem* ppsi) GetItemAt; public function [CallingConvention(.Stdcall)] HResult(COM_IShellItemArray* self, out void* ppenumShellItems) EnumItems; } public new VTable* VT { get { return (.)mVT; } } } public struct COMDLG_FILTERSPEC { public char16* pszName; public char16* pszSpec; } enum FDAP : uint32 { FDAP_BOTTOM = 0x00000000, FDAP_TOP = 0x00000001, } public struct COM_IFileDialog : Windows.COM_IUnknown { public static Guid sIID = .(0x42f85136, 0xdb7e, 0x439c, 0x85, 0xf1, 0xe4, 0x07, 0x5d, 0x13, 0x5f, 0xc8); public static Guid sCLSID = .(0xdc1c5a9c, 0xe88a, 0x4dde, 0xa5, 0xa1, 0x60, 0xf8, 0x2a, 0x20, 0xae, 0xf7); ///s public enum FOS : uint32 { OVERWRITEPROMPT = 0x00000002, STRICTFILETYPES = 0x00000004, NOCHANGEDIR = 0x00000008, PICKFOLDERS = 0x00000020, FORCEFILESYSTEM = 0x00000040, ALLNONSTORAGEITEMS = 0x00000080, NOVALIDATE = 0x00000100, ALLOWMULTISELECT = 0x00000200, PATHMUSTEXIST = 0x00000800, FILEMUSTEXIST = 0x00001000, CREATEPROMPT = 0x00002000, SHAREAWARE = 0x00004000, NOREADONLYRETURN = 0x00008000, NOTESTFILECREATE = 0x00010000, HIDEMRUPLACES = 0x00020000, HIDEPINNEDPLACES = 0x00040000, NODEREFERENCELINKS = 0x00100000, DONTADDTORECENT = 0x02000000, FORCESHOWHIDDEN = 0x10000000, DEFAULTNOMINIMODE = 0x20000000 } public struct VTable : Windows.COM_IUnknown.VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, Windows.HWnd parent) Show; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, uint cFileTypes, COMDLG_FILTERSPEC* rgFilterSpec) SetFileTypes; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, uint iFileType) SetFileTypeIndex; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out uint piFileType) GetFileTypeIndex; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, COM_IFileDialogEvents* pfde, out uint pdwCookie) Advise; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, uint dwCookie) Unadvise; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, FOS fos) SetOptions; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out FOS pfos) GetOptions; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, COM_IShellItem* psi) SetDefaultFolder; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, COM_IShellItem* psi) SetFolder; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out COM_IShellItem* ppsi) GetFolder; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out COM_IShellItem* ppsi) GetCurrentSelection; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, char16* pszName) SetFileName; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out char16* pszName) GetFileName; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, char16* pszTitle) SetTitle; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, char16* pszText) SetOkButtonLabel; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, char16* pszLabel) SetFileNameLabel; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, out COM_IShellItem* ppsi) GetResult; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, COM_IShellItem* psi, FDAP fdap) AddPlace; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, char16* pszDefaultExtension) SetDefaultExtension; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, int hr) Close; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, ref Guid guid) SetClientGuid; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self) ClearClientData; public function [CallingConvention(.Stdcall)] HResult(COM_IFileDialog* self, void* pFilter) SetFilter; } public new VTable* VT { get { return (.)mVT; } } } public struct COM_IFileSaveDialog : COM_IFileDialog { public static new Guid sIID = .(0x84BCCD23, 0x5FDE, 0x4CDB, 0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB); public static new Guid sCLSID = .(0xC0B4E2F3, 0xBA21, 0x4773, 0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B); } public struct COM_IFileOpenDialog : COM_IFileDialog { public static new Guid sIID = .(0xD57C7288, 0xD4AD, 0x4768, 0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60); public struct VTable : COM_IFileDialog.VTable { public function [CallingConvention(.Stdcall)] HResult(COM_IFileOpenDialog* self, out COM_IShellItemArray* ppenum) GetResults; public function [CallingConvention(.Stdcall)] HResult(COM_IFileOpenDialog* self, out COM_IShellItemArray* ppsai) GetSelectedItems; } public new VTable* VT { get { return (.)mVT; } } } [Import("version.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool GetFileVersionInfoW(char16* lptstrFilename, uint32 dwHandle, uint32 dwLen, void* lpData); [Import("version.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 GetFileVersionInfoSizeW(char16* lptstrFilename, out uint32 lpdwHandle); [Import("version.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool VerQueryValueW(void* pBlock, char16* lpSubBlock, ref void* lplpBuffer, out int32 puLen); [Import("version.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 VerLanguageNameW(uint32 wLang, char16* szLang, uint32 cchLang); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 GetNamedSecurityInfoW( char16* pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, SID** ppsidOwner, SID** ppsidGroup, ACL** ppDacl, ACL** ppSacl, SECURITY_DESCRIPTOR* *ppSecurityDescriptor ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern void BuildExplicitAccessWithNameW( EXPLICIT_ACCESS_W* pExplicitAccess, char16* pTrusteeName, uint32 AccessPermissions, ACCESS_MODE AccessMode, uint32 Inheritance ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 SetEntriesInAclW( uint32 cCountOfExplicitEntries, EXPLICIT_ACCESS_W* pListOfExplicitEntries, ACL* OldAcl, ACL** NewAcl ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 SetNamedSecurityInfoW( char16* pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, SID* psidOwner, SID* psidGroup, ACL* pDacl, ACL* pSacl ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 GetExplicitEntriesFromAclW( ACL* pacl, uint32* pcCountOfExplicitEntries, EXPLICIT_ACCESS_W** pListOfExplicitEntries ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern uint32 GetEffectiveRightsFromAclW( ACL* pacl, TRUSTEE_W* pTrustee, uint32* pAccessRights ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool LookupAccountSidW( char16* lpSystemName, SID* Sid, char16* Name, uint32* cchName, char16* ReferencedDomainName, uint32* cchReferencedDomainName, int* peUse ); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool ConvertStringSidToSidW( char16* StringSid, SID** Sid ); [CLink, CallingConvention(.Stdcall)] public static extern void LocalFree(void* ptr); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetTimeZoneInformation(out TimeZoneInformation dynamicTimeZoneInformation); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetDynamicTimeZoneInformation(out DynamicTimeZoneInformation dynamicTimeZoneInformation); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegOpenKeyExW(HKey hKey, char16* lpSubKey, uint32 ulOptions, uint32 samDesired, out HKey phkResult); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegOpenKeyExA(HKey hKey, char8* lpSubKey, uint32 ulOptions, uint32 samDesired, out HKey phkResult); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegCreateKeyExW(HKey hKey, char16* lpSubKey, uint32 reserved, char16* lpClass, uint32 dwOptions, uint32 samDesired, SecurityAttributes* lpSecurityAttributes, out HKey phkResult, uint32* lpdwDisposition); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegCreateKeyExA(HKey hKey, char8* lpSubKey, uint32 reserved, char8* lpClass, uint32 dwOptions, uint32 samDesired, SecurityAttributes* lpSecurityAttributes, out HKey phkResult, uint32* lpdwDisposition); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegCloseKey(HKey hKey); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegDeleteKeyW(HKey hKey, char16* lpSubKey); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegDeleteKeyA(HKey hKey, char8* lpSubKey); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegDeleteValueW(HKey hKey, char16* lpSubKey); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegDeleteValueA(HKey hKey, char8* lpSubKey); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegQueryValueExW(HKey hKey, char16* lpValueName, uint32* lpReserved, uint32* lpType, void* lpData, uint32* lpcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegQueryValueExA(HKey hKey, char8* lpValueName, uint32* lpReserved, uint32* lpType, void* lpData, uint32* lpcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegEnumValueW(HKey hKey, int32 dwIndex, char16* lpValueName, uint32* lpcchValueName, uint32* lpReserved, uint32* lpType, void* lpData, uint32* lpcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegEnumValueA(HKey hKey, int32 dwIndex, char8* lpValueName, uint32* lpcchValueName, uint32* lpReserved, uint32* lpType, void* lpData, uint32* lpcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegGetValueW(HKey hkey, char16* lpSubKey, char16* lpValue, uint32 dwFlags, uint32* pdwType, void* pvData, uint32* pcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegGetValueA(HKey hkey, char8* lpSubKey, char8* lpValue, uint32 dwFlags, uint32* pdwType, void* pvData, uint32* pcbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegSetValueExW(HKey hkey, char16* lpValue, uint32 reserved, uint32 dwType, void* pvData, uint32 cbData); [Import("advapi32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 RegSetValueExA(HKey hkey, char8* lpValue, uint32 reserved, uint32 dwType, void* pvData, uint32 cbData); [Import("shell32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 SHGetSpecialFolderLocation(HWnd hwnd, int32 csidl, ref int ppidl); [Import("shell32.lib"), CLink, CallingConvention(.Stdcall)] public static extern bool SHGetPathFromIDList(int pidl, char8* path); [Import("shell32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int SHBrowseForFolder(ref BrowseInfo bi); [Import("shell32.lib"), CLink, CallingConvention(.Stdcall)] public static extern COM_IUnknown.HResult SHCreateItemFromParsingName(char16* pszPath, COM_IBindCtx *pbc, Guid riid, void **ppv); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetLastError(); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetExitCodeProcess(ProcessHandle process, out int32 exitCode); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetExitCodeThread(Handle process, out int32 exitCode); [Import("psapi.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 GetModuleFileNameExW(Handle process, Handle module, char16* filename, int32 size); [CLink, CallingConvention(.Stdcall)] public static extern int32 ResumeThread(Handle thread); [CLink, CallingConvention(.Stdcall)] public static extern ProcessHandle GetCurrentProcess(); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetCurrentProcessId(); [CLink, CallingConvention(.Stdcall)] public static extern ProcessHandle OpenProcess(int32 desiredAccess, IntBool inheritHandle, int32 processId); [CLink, CallingConvention(.Stdcall)] public static extern Handle CreateRemoteThread(ProcessHandle process, SecurityAttributes* threadAttributes, int stackSize, void* startAddress, void* parameter, int32 creationFlags, int32* threadId); [CLink, CallingConvention(.Stdcall)] public static extern IntBool ReadProcessMemory(ProcessHandle process, void* baseAddress, void* buffer, int size, int* numberOfBytesRead); [CLink, CallingConvention(.Stdcall)] public static extern IntBool WriteProcessMemory(ProcessHandle process, void* baseAddress, void* buffer, int size, int* numberOfBytesWritten); [CLink, CallingConvention(.Stdcall)] public static extern void* GetProcAddress(HModule module, char8* procName); [CLink, CallingConvention(.Stdcall)] public static extern void* VirtualAllocEx(ProcessHandle process, void* address, int size, int32 allocationType, int32 protect); [CLink, CallingConvention(.Stdcall)] public static extern void* VirtualFreeEx(ProcessHandle process, void* address, int size, int32 allocationType); [CLink, CallingConvention(.Stdcall)] public static extern FileHandle GetStdHandle(int32 stdHandle); [CLink, CallingConvention(.Stdcall)] public static extern Handle ShellExecuteW(Handle hwnd, char16* operation, char16* file, char16* parameters, char16* directory, int32 showCmd); [CLink, CallingConvention(.Stdcall)] public static extern Handle ShellExecuteA(Handle hwnd, char8* operation, char8* file, char8* parameters, char8* directory, int32 showCmd); [CLink, CallingConvention(.Stdcall)] public static extern IntBool ShellExecuteExA(ShellExecuteInfo* shellExecuteInfo); [CLink, CallingConvention(.Stdcall)] public static extern void GetStartupInfoA(StartupInfo* startupInfo); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CreateProcessW(char16* applicationName, char16* commandLine, SecurityAttributes* processAttributes, SecurityAttributes* threadAttributes, IntBool inheritHandles, int32 creationFlags, void* environment, char16* currentDirectory, StartupInfo* startupInfo, ProcessInformation* processInformation); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CreateProcessA(char8* applicationName, char8* commandLine, SecurityAttributes* processAttributes, SecurityAttributes* threadAttributes, IntBool inheritHandles, int32 creationFlags, void* environment, char8* currentDirectory, StartupInfo* startupInfo, ProcessInformation* processInformation); [CLink, CallingConvention(.Stdcall)] public static extern IntBool TerminateProcess(ProcessHandle process); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CreatePipe(out Handle readPipe, out Handle writePipe, SecurityAttributes* pipeAttributes, int32 size); [CLink, CallingConvention(.Stdcall)] public static extern Handle CreateNamedPipeA(char8* lpName, uint32 dwOpenMode, uint32 dwPipeMode, uint32 nMaxInstances, uint32 nOutBufferSize, uint32 nInBufferSize, uint32 nDefaultTimeOut, SecurityAttributes* lpSecurityAttributes); [CLink, CallingConvention(.Stdcall)] public static extern IntBool ConnectNamedPipe(Handle handle, Overlapped* overlapped); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CallNamedPipeA(char8* name, void* inBuffer, int32 inBufferSize, void* outBuffer, int32 outBufferSize, int32* bytesRead, int32 timeOut); [CLink, CallingConvention(.Stdcall)] public static extern IntBool DisconnectNamedPipe(Handle handle); [CLink, CallingConvention(.Stdcall)] public static extern EventHandle CreateEventA(SecurityAttributes* eventAttribuetes, IntBool manualReset, IntBool initialState, char8* name); [CLink, CallingConvention(.Stdcall)] public static extern EventHandle OpenEventA(uint32 dwDesiredAccess, IntBool bInheritHandle, char8* lpName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool SetEvent(EventHandle eventHandle); [CLink, CallingConvention(.Stdcall)] public static extern IntBool ResetEvent(EventHandle eventHandle); [CLink, CallingConvention(.Stdcall)] public static extern int32 WaitForSingleObject(Handle handle, int32 milliseconds); [CLink, CallingConvention(.Stdcall)] public static extern int32 WaitForMultipleObjects(int32 count, Handle* handles, IntBool waitAll, int32 milliseconds); [CLink, CallingConvention(.Stdcall)] public static extern IOCompletionHandle CreateIoCompletionPort(FileHandle fileHandle, IOCompletionHandle existingCompletionPort, int completionKey, int32 numberOfConcurrentThreads); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetQueuedCompletionStatus(IOCompletionHandle completionPort, out int32 numberOfBytes, out int completionKey, out Overlapped* overlapped, int32 milliseconds); [CLink, CallingConvention(.Stdcall)] public static extern IntBool PostQueuedCompletionStatus(IOCompletionHandle completionPort, int32 numberOfBytes, int completionKey, Overlapped* overlapped); [CLink, CallingConvention(.Stdcall)] public static extern IntBool DuplicateHandle(Handle sourceProcessHandle, Handle sourceHandle, Handle targetProcessHandle, Handle* targetHandle, int32 desiredAccess, IntBool inheritHandle, int32 options); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CloseHandle(Handle handle); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetFileType(FileHandle handle); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetFileSize(FileHandle handle, int32* sizeHigh); [CLink, CallingConvention(.Stdcall)] public static extern FileHandle CreateFileA(char8* lpFileName, int32 dwDesiredAccess, System.IO.FileShare dwShareMode, SecurityAttributes* securityAttrs, System.IO.FileMode dwCreationDisposition, int32 dwFlagsAndAttributes, Handle hTemplateFile); [CLink, CallingConvention(.Stdcall)] public static extern FileHandle CreateFileW(char16* lpFileName, int32 dwDesiredAccess, System.IO.FileShare dwShareMode, SecurityAttributes* securityAttrs, System.IO.FileMode dwCreationDisposition, int32 dwFlagsAndAttributes, Handle hTemplateFile); [CLink, CallingConvention(.Stdcall)] public static extern uint32 GetWindowsDirectoryW(char16* lpBuffer, uint32 uSize); [CLink, CallingConvention(.Stdcall)] public static extern uint32 GetWindowsDirectoryA(char8* lpBuffer, uint32 uSize); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CreateDirectoryW(char16* pathName, SecurityAttributes* securityAttributes); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CreateDirectoryA(char8* pathName, SecurityAttributes* securityAttributes); [CLink, CallingConvention(.Stdcall)] public static extern IntBool RemoveDirectoryW(char16* pathName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool RemoveDirectoryA(char8* pathName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool DeleteFileW(char16* pathName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool DeleteFileA(char8* pathName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CopyFileW(char16* srcName, char16* dstName, IntBool failIfExists); [CLink, CallingConvention(.Stdcall)] public static extern IntBool CopyFileA(char8* srcName, char8* dstName, IntBool failIfExists); [CLink, CallingConvention(.Stdcall)] public static extern IntBool MoveFileW(char16* srcName, char16* dstName); [CLink, CallingConvention(.Stdcall)] public static extern IntBool MoveFileA(char8* srcName, char8* dstName); [CLink, CallingConvention(.Stdcall)] public static extern int32 ReadFile(Handle handle, uint8* bytes, int32 numBytesToRead, out int32 numBytesRead, Overlapped* overlapped); [CLink, CallingConvention(.Stdcall)] public static extern int32 WriteFile(Handle handle, uint8* bytes, int32 numBytesToWrite, out int32 numBytesWritten, Overlapped* overlapped); [CLink, CallingConvention(.Stdcall)] public static extern Handle OpenFileMappingA(uint32 dwDesiredAccess, IntBool bInheritHandle, char8* lpName); [CLink, CallingConvention(.Stdcall)] public static extern Handle CreateFileMappingA(Handle hFile, SecurityAttributes* securityAttrs, uint32 flProtect, uint32 dwMaximumSizeHigh, uint32 dwMaximumSizeLow, char8* lpName); [CLink, CallingConvention(.Stdcall)] public static extern void* MapViewOfFile(Handle hFileMappingObject, uint32 dwDesiredAccess, uint32 dwFileOffsetHigh, uint32 dwFileOffsetLow, int dwNumberOfBytesToMap); [CLink, CallingConvention(.Stdcall)] public static extern FindHandle FindFirstFileW(char16* fileName, ref NativeFindData findFileData); [CLink, CallingConvention(.Stdcall)] public static extern IntBool FindNextFileW(FindHandle findHandle, ref NativeFindData findFileData); [CLink, CallingConvention(.Stdcall)] public static extern IntBool FindClose(FindHandle findHandle); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetFileAttributesExW(char16* name, int32 fileInfoLevel, FileAttributeData* fileInformation); [CLink, CallingConvention(.Stdcall)] public static extern IntBool SetFileAttributesW(char16* name, int32 attribs); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 MessageBoxA(HWnd hWnd, char8* text, char8* caption, int32 type); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 MessageBoxW(HWnd hWnd, char16* text, char16* caption, int32 type); [CLink, CallingConvention(.Stdcall)] public static extern int32 SetErrorMode(int32 errorMode); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HWnd GetActiveWindow(); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HWnd SetActiveWindow(HWnd wnd); [CLink, CallingConvention(.Stdcall)] public static extern int CallWindowProcA(int wndProc, HWnd hWnd, int32 msg, int wParam, int lParam); [CLink, CallingConvention(.Stdcall)] public static extern int CallWindowProcW(int wndProc, HWnd hWnd, int32 msg, int wParam, int lParam); public static int GetWindowLong(HWnd hWnd, int32 nIndex) { #if BF_32_BIT //if (sizeof(int) == 4) return (int)GetWindowLongA((int)hWnd, nIndex); #else //else return GetWindowLongPtrW((int)hWnd, nIndex); #endif } #if BF_32_BIT [CLink, CallingConvention(.Stdcall)] public static extern int GetWindowLongA(int hWnd, int nIndex); #else [CLink, CallingConvention(.Stdcall)] public static extern int GetWindowLongPtrW(int hWnd, int32 nIndex); #endif public static int SetWindowLong(HWnd hWnd, int32 nIndex, int value) { #if BF_32_BIT return (int)SetWindowLongA((int)hWnd, nIndex, value); #else return SetWindowLongPtrW((int)hWnd, nIndex, value); #endif } #if BF_32_BIT [CLink, CallingConvention(.Stdcall)] public static extern int SetWindowLongA(int hWnd, int nIndex, int value); #else [CLink, CallingConvention(.Stdcall)] public static extern int SetWindowLongPtrW(int hWnd, int32 nIndex, int value); #endif [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool SetWindowPos(HWnd hWnd, HWnd hWndAfter, int x, int y, int cx, int cy, int flags); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool PostMessageW(HWnd hWnd, int32 msg, int wParam, int lParam); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 SendMessageW(HWnd hWnd, int32 msg, int wParam, int lParam); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 SendMessageTimeoutW(HWnd hWnd, int32 msg, int wParam, int lParam, int32 flags, int32 timeout, int32* result); [Import("user32.lib "), CLink, CallingConvention(.Stdcall)] public static extern HWnd SetFocus(HWnd hWnd); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool EnumWindows(void* callback, void* extraData); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HWnd GetWindow(HWnd hWnd, int32 uCmd); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HWnd FindWindowW(char16* className, char16* windowName); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HWnd FindWindowA(char8* className, char8* windowName); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool IsWindowVisible(HWnd hWnd); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 GetWindowTextLengthW(HWnd hWnd); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 GetWindowTextW(HWnd hWnd, char16* ptr, int32 length); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 GetWindowTextA(HWnd hWnd, char8* ptr, int32 length); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool AdjustWindowRectEx(ref Rect rect, uint32 style, IntBool menu, uint32 exStyle); [CLink, CallingConvention(.Stdcall)] public static extern int32 GetWindowThreadProcessId(HWnd handle, out int32 processId); [Import("comdlg32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool GetOpenFileNameW(ref OpenFileName ofn); [Import("comdlg32.lib"), CLink, CallingConvention(.Stdcall)] public static extern IntBool GetSaveFileNameW(ref OpenFileName ofn); [CLink, CallingConvention(.Stdcall)] public static extern HModule GetModuleHandleW(char16* modName); [CLink, CallingConvention(.Stdcall)] public static extern HModule GetModuleHandleA(char8* modName); [CLink, CallingConvention(.Stdcall)] public static extern uint32 GetTempFileNameW(char16* tmpPath, char16* prefix, uint32 uniqueIdOrZero, char16* tmpFileName); [CLink, CallingConvention(.Stdcall)] public static extern uint32 GetTempFileNameA(char8* tmpPath, char8* prefix, uint32 uniqueIdOrZero, char8* tmpFileName); [CLink, CallingConvention(.Stdcall)] public static extern uint32 GetTempPathW(int32 bufferLen, char16* buffer); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetComputerNameA(char8* buffer, ref int32 size); [CLink, CallingConvention(.Stdcall)] public static extern int32 NtQuerySystemInformation(int32 query, void* dataPtr, int32 size, out int32 returnedSize); [CLink, CallingConvention(.Stdcall)] public static extern IntBool ReadDirectoryChangesW(FileHandle handle, uint8* buffer, int32 bufferLength, IntBool watchSubtree, NotifyFilters notifyFilter, out int32 bytesReturned, Overlapped* overlapped, void* completionRoutine); [CLink, CallingConvention(.Stdcall)] public static extern int32 SetFilePointer(FileHandle handle, int32 distanceToMove, int32* distanceToMoveHigh, int32 moveMethod); [CLink, CallingConvention(.Stdcall)] public static extern IntBool SHGetFileInfoW(char16* pszPath, uint32 fileAttributes, SHFileInfo* psfi, uint32 cbFileInfo, uint32 flags); [CLink, CallingConvention(.Stdcall)] public static extern char16* GetEnvironmentStringsW(); [CLink, CallingConvention(.Stdcall)] public static extern void FreeEnvironmentStringsW(char16* ptr); [CLink, CallingConvention(.Stdcall)] public static extern IntBool GetFileMUIPath(uint32 dwFlags, char16* pcwszFilePath, char16* pwszLanguage, uint32* pcchLanguage, char16* pwszFileMUIPath, uint32* pcchFileMUIPath, uint64* pululEnumerator); [CLink, CallingConvention(.Stdcall)] public static extern IntBool SetDllDirectoryW(char16* libFileName); [CLink, CallingConvention(.Stdcall)] public static extern HInstance LoadLibraryW(char16* libFileName); [Import("kernel32.lib"), CLink, CallingConvention(.Stdcall)] public static extern HInstance LoadLibraryA(char8* libFileName); [CLink, CallingConvention(.Stdcall)] public static extern HInstance LoadLibraryExW(char16* libFileName, HModule hFile, uint32 dwFlags); [CLink, CallingConvention(.Stdcall)] public static extern HInstance LoadLibraryExA(char8* libFileName, HModule hFile, uint32 dwFlags); [CLink, CallingConvention(.Stdcall)] public static extern IntBool FreeLibrary(HModule module); [Import("user32.lib"), CLink, CallingConvention(.Stdcall)] public static extern int32 LoadStringW(HInstance hInstance, uint32 uID, char16* lpBuffer, int32 cchBufferMax); public static Result SafeCreateFile(String lpFileName, int32 dwDesiredAccess, System.IO.FileShare dwShareMode, SecurityAttributes* securityAttrs, System.IO.FileMode dwCreationDisposition, int32 dwFlagsAndAttributes, Handle hTemplateFile) { FileHandle handle = CreateFileW(lpFileName.ToScopedNativeWChar!(), dwDesiredAccess, dwShareMode, securityAttrs, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); if (handle.IsInvalid) { int32 lastErr = GetLastError(); switch (lastErr) { case ERROR_FILE_NOT_FOUND: fallthrough; case ERROR_PATH_NOT_FOUND: return .Err(FileOpenError.NotFound); case ERROR_SHARING_VIOLATION: return .Err(FileOpenError.SharingViolation); default: return .Err(FileOpenError.Unknown); } } int32 fileType = GetFileType(handle); if (fileType != FILE_TYPE_DISK) { //return new NotSupportedException(Environment.GetResourceString("NotSupported_FileStreamOnNonFiles")); return .Err(FileOpenError.NotFile); } //if (handle.IsInvalid) return handle; } } } #endif