From f98c35d65d6847a108bf6b582ba67380cb8bace5 Mon Sep 17 00:00:00 2001 From: amirghadiri1987 <144431373+amirghadiri1987@users.noreply.github.com> Date: Fri, 7 Feb 2025 19:17:11 +0330 Subject: [PATCH] Add files via upload --- AutoPtr.mqh | 77 + Color.mqh | 139 ++ Colors.mqh | 27 + ComboBoxNew.mqh | 7 + Comment.mqh | 410 ++++ Common.mqh | Bin 0 -> 57692 bytes Control panel MCM.mqh | Bin 0 -> 121160 bytes CreateLicense.mqh | 111 ++ Defines.mqh | 200 ++ Dialog.mqh | 971 +++++++++ EAF.mqh | 10 + EnumToArray.mqh | 43 + Functions.mqh | Bin 0 -> 43154 bytes IniFile.mqh | Bin 0 -> 17062 bytes License.mqh | 144 ++ MatrixNet.mqh | 767 +++++++ MatrixNetStore.mqh | 116 ++ MovingAverages.mqh | 317 +++ Object.mqh | 33 + StdLibErr.mqh | 10 + Telegram.mqh | Bin 0 -> 65540 bytes TradeAlgorithms.mqh | 1592 +++++++++++++++ TypeToBytes.mqh | 1 + VirtualKeys.mqh | 200 ++ WinAPI/errhandlingapi.mqh | 28 + WinAPI/fileapi.mqh | 146 ++ WinAPI/handleapi.mqh | 21 + WinAPI/libloaderapi.mqh | 47 + WinAPI/memoryapi.mqh | 85 + WinAPI/processenv.mqh | 27 + WinAPI/processthreadsapi.mqh | 202 ++ WinAPI/securitybaseapi.mqh | 119 ++ WinAPI/sysinfoapi.mqh | 95 + WinAPI/winapi.mqh | 21 + WinAPI/winbase.mqh | 814 ++++++++ WinAPI/windef.mqh | 325 +++ WinAPI/wingdi.mqh | 2080 +++++++++++++++++++ WinAPI/winnt.mqh | 3642 ++++++++++++++++++++++++++++++++++ WinAPI/winreg.mqh | 77 + WinAPI/winuser.mqh | 1825 +++++++++++++++++ Window.mqh | 108 + ctradestatistics.mqh | Bin 0 -> 68322 bytes jason.mqh | Bin 0 -> 43822 bytes samplesignal.mqh | 314 +++ smoothalgorithms.mqh | 3478 ++++++++++++++++++++++++++++++++ socketlib.mqh | Bin 0 -> 72104 bytes test_color.mqh | 13 + tradestatisticspanel.mqh | Bin 0 -> 26110 bytes 48 files changed, 18642 insertions(+) create mode 100644 AutoPtr.mqh create mode 100644 Color.mqh create mode 100644 Colors.mqh create mode 100644 ComboBoxNew.mqh create mode 100644 Comment.mqh create mode 100644 Common.mqh create mode 100644 Control panel MCM.mqh create mode 100644 CreateLicense.mqh create mode 100644 Defines.mqh create mode 100644 Dialog.mqh create mode 100644 EAF.mqh create mode 100644 EnumToArray.mqh create mode 100644 Functions.mqh create mode 100644 IniFile.mqh create mode 100644 License.mqh create mode 100644 MatrixNet.mqh create mode 100644 MatrixNetStore.mqh create mode 100644 MovingAverages.mqh create mode 100644 Object.mqh create mode 100644 StdLibErr.mqh create mode 100644 Telegram.mqh create mode 100644 TradeAlgorithms.mqh create mode 100644 TypeToBytes.mqh create mode 100644 VirtualKeys.mqh create mode 100644 WinAPI/errhandlingapi.mqh create mode 100644 WinAPI/fileapi.mqh create mode 100644 WinAPI/handleapi.mqh create mode 100644 WinAPI/libloaderapi.mqh create mode 100644 WinAPI/memoryapi.mqh create mode 100644 WinAPI/processenv.mqh create mode 100644 WinAPI/processthreadsapi.mqh create mode 100644 WinAPI/securitybaseapi.mqh create mode 100644 WinAPI/sysinfoapi.mqh create mode 100644 WinAPI/winapi.mqh create mode 100644 WinAPI/winbase.mqh create mode 100644 WinAPI/windef.mqh create mode 100644 WinAPI/wingdi.mqh create mode 100644 WinAPI/winnt.mqh create mode 100644 WinAPI/winreg.mqh create mode 100644 WinAPI/winuser.mqh create mode 100644 Window.mqh create mode 100644 ctradestatistics.mqh create mode 100644 jason.mqh create mode 100644 samplesignal.mqh create mode 100644 smoothalgorithms.mqh create mode 100644 socketlib.mqh create mode 100644 test_color.mqh create mode 100644 tradestatisticspanel.mqh diff --git a/AutoPtr.mqh b/AutoPtr.mqh new file mode 100644 index 0000000..37da5f4 --- /dev/null +++ b/AutoPtr.mqh @@ -0,0 +1,77 @@ +//+------------------------------------------------------------------+ +//| AutoPtr.mqh | +//| Copyright (c) 2019-2021, Marketeer | +//| https://www.mql5.com/en/users/marketeer | +//+------------------------------------------------------------------+ + +#define FREE(P) { if(CheckPointer(P) == POINTER_DYNAMIC) delete P; } + +//+------------------------------------------------------------------+ +//| Safe-pointer templated class | +//+------------------------------------------------------------------+ +template +class AutoPtr +{ +private: + T *ptr; + +public: + AutoPtr() : ptr(NULL) + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": NULL"); + #endif + } + + AutoPtr(T *p) : ptr(p) + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": ", ptr); + #endif + } + + AutoPtr(AutoPtr &p) + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": ", ptr, " -> ", p.ptr); + #endif + FREE(ptr); + ptr = p.ptr; + p.ptr = NULL; + } + + ~AutoPtr() + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": ", ptr); + #endif + FREE(ptr); + } + + AutoPtr *operator=(AutoPtr &ref) + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": ", ptr, " -> ", ref.ptr); + #endif + FREE(ptr); + ptr = ref.ptr; + ref.ptr = NULL; + return &this; + } + + T *operator=(const T *n) + { + #ifdef DEBUG_PRINT + Print(__FUNCSIG__, " ", &this, ": ", ptr, " -> ", n); + #endif + FREE(ptr); + ptr = (T *)n; + return ptr; + } + + T *operator[](int x = 0) const + { + return ptr; + } +}; +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/Color.mqh b/Color.mqh new file mode 100644 index 0000000..3521332 --- /dev/null +++ b/Color.mqh @@ -0,0 +1,139 @@ + +class ColorThemes +{ +public: + + color CONTROLS_EDIT_ENABLE_COLOR, CONTROLS_EDIT_DISABLE_COLOR, CONTROLS_EDIT_BORDER_COLOR, CONTROLS_EDIT_BACKGROUND_COLOR, CONTROLS_BUTTON_ENABLE_COLOR, + CONTROLS_BUTTON_DISABLE_COLOR, CONTROLS_BUTTON_TEXT_COLOR, CONTROLS_BUTTON_BORDER_COLOR, CONTROLS_BUTTON_BACKGROUND_COLOR, CONTROLS_BORDER_COLOR, + CONTROLS_BACK_COLOR, CONTROLS_CLIENTBACK_COLOR, CONTROLS_CAPTION_TEXT_COLOR, CONTROLS_CAPTION_MAIN_BACKGROUND_COLOR, CONTROLS_CAPTION_BACK_BACKGROUND_COLOR, + CONTROLS_LABEL_TEXT_COLOR, CONTROLS_LABEL_TEXT_CAPION_COLOR, CONTROLS_LABEL_TEXT_TITLE_COLOR, CONTROLS_LABEL_TEXT_CONFIRMATION_COLOR, CONTROLS_PICTURE_BORDER_COLOR; + + // enum SET_COLOR_THEMES + // { + // SET_COLOR_THEMES_ABSENT, + // SET_COLOR_THEMES_BANNER, + // SET_COLOR_THEMES_BRAVE, + // SET_COLOR_THEMES_BLINK, + // SET_COLOR_THEMES_CODECOURSE, + // SET_COLOR_THEMES_DOWNPOUR, + // SET_COLOR_THEMES_FODDER, + // SET_COLOR_THEMES_MUD, + // SET_COLOR_THEMES_VIOLACEOUS, + // SET_COLOR_THEMES_VISION, + // }; + + // enum TYPE_THEMES + // { + // Dark, + // Light + // }; + + void ApplyTheme(int theme,int type) + { + switch (theme) + { + default: + case SET_COLOR_THEMES_VISION: + + if (type == Light) + { + CONTROLS_EDIT_ENABLE_COLOR = C'255,255,255'; + CONTROLS_EDIT_DISABLE_COLOR = C'255,255,255'; + CONTROLS_EDIT_BORDER_COLOR = C'255,255,255'; + CONTROLS_EDIT_BACKGROUND_COLOR = C'255,255,255'; + + CONTROLS_BUTTON_ENABLE_COLOR = C'161,212,236'; //. + CONTROLS_BUTTON_DISABLE_COLOR = C'255,255,255'; + CONTROLS_BUTTON_TEXT_COLOR = C'53,47,212'; //. + CONTROLS_BUTTON_BORDER_COLOR = C'40,40,41'; //. + CONTROLS_BUTTON_BACKGROUND_COLOR = C'255,255,255'; //. + + CONTROLS_BORDER_COLOR = C'174,170,185'; //. + CONTROLS_BACK_COLOR = clrBlue; //. + CONTROLS_CLIENTBACK_COLOR = C'255,255,255'; //. + + CONTROLS_CAPTION_TEXT_COLOR = C'12,12,12'; //. + CONTROLS_CAPTION_MAIN_BACKGROUND_COLOR = C'189,172,238'; //. + CONTROLS_CAPTION_BACK_BACKGROUND_COLOR = C'165,243,19'; //. + + CONTROLS_LABEL_TEXT_COLOR = C'12,12,12'; //. + CONTROLS_LABEL_TEXT_CAPION_COLOR = C'53,47,212'; //. + CONTROLS_LABEL_TEXT_TITLE_COLOR = C'0,8,210'; //. + + CONTROLS_LABEL_TEXT_CONFIRMATION_COLOR = C'25,140,25'; //. + + CONTROLS_PICTURE_BORDER_COLOR = C'25,140,25'; //. + + } + else + { + CONTROLS_EDIT_ENABLE_COLOR = C'255,255,255'; + CONTROLS_EDIT_DISABLE_COLOR = C'255,255,255'; + CONTROLS_EDIT_BORDER_COLOR = C'255,255,255'; + CONTROLS_EDIT_BACKGROUND_COLOR = C'255,255,255'; + + CONTROLS_BUTTON_ENABLE_COLOR = C'255,255,255'; + CONTROLS_BUTTON_DISABLE_COLOR = C'255,255,255'; + CONTROLS_BUTTON_TEXT_COLOR = C'255,255,255'; + CONTROLS_BUTTON_BORDER_COLOR = C'255,255,255'; + CONTROLS_BUTTON_BACKGROUND_COLOR = C'255,255,255'; + + CONTROLS_BORDER_COLOR = C'255,255,255'; + CONTROLS_BACK_COLOR = C'255,255,255'; + CONTROLS_CLIENTBACK_COLOR = C'85,111,228'; + + CONTROLS_CAPTION_TEXT_COLOR = C'255,255,255'; + CONTROLS_CAPTION_MAIN_BACKGROUND_COLOR = C'255,255,255'; + CONTROLS_CAPTION_BACK_BACKGROUND_COLOR = C'255,255,255'; + CONTROLS_LABEL_TEXT_TITLE_COLOR = C'255,255,255'; + + CONTROLS_LABEL_TEXT_COLOR = C'255,255,255'; + CONTROLS_LABEL_TEXT_CAPION_COLOR = C'255,255,255'; + + CONTROLS_LABEL_TEXT_CONFIRMATION_COLOR = C'255,255,255'; + + CONTROLS_PICTURE_BORDER_COLOR = C'255,255,255'; + } + + break; + + + } + } +}; + +/* +CCTR_EDIT_EN_COL = C'64,240,102'; + CCTR_EDIT_DIS_COL = C'238,182,182'; + CCTR_EDIT_BOR_COL = C'248,5,5'; + CCTR_EDIT_BG_COL = C'39,51,231'; + + CCTR_BUTTON_EN_COL = C'161,212,236'; //. + CCTR_BUTTON_DIS_COL = C'255,255,255'; + CCTR_BUTTON_TXT_COL = C'0,165,243'; // + CCTR_BUTTON_BOR_COL = C'40,40,41'; // + CCTR_BUTTON_BG_COL = C'255,255,255'; // + + CCTR_BOR_COL = C'174,170,185'; + CCTR_BACK_COL = C'65,64,64'; + CCTR_CLIENTBACK_COL = C'255,255,255'; + + CCTR_CAP_TXT_COL = C'12,12,12'; // + CCTR_CAP_MAIN_BG_COL = C'189,172,238'; // + CCTR_CAP_BACK_BG_COL = C'165,243,19'; // + + CCTR_LBL_TXT_COL = C'12,12,12'; // + CCTR_LBL_TXT_CAP_COL = C'0,165,243'; + + +ColorThemes myThemes; + +// Apply the SET_COLOR_THEMES_VISION theme +myThemes.ApplyTheme(SET_COLOR_THEMES_VISION); + +// Access individual color properties if needed +color editEnCol = myThemes.CCTR_EDIT_EN_COL; +color buttonTxtCol = myThemes.CCTR_BUTTON_TXT_COL; + +// Apply the SET_COLOR_THEMES_BANNER theme +myThemes.ApplyTheme(SET_COLOR_THEMES_BANNER); diff --git a/Colors.mqh b/Colors.mqh new file mode 100644 index 0000000..069c657 --- /dev/null +++ b/Colors.mqh @@ -0,0 +1,27 @@ +//+------------------------------------------------------------------+ +//| Colors.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +// #define MacrosHello "Hello, world!" +// #define MacrosYear 2010 +//+------------------------------------------------------------------+ +//| DLL imports | +//+------------------------------------------------------------------+ +// #import "user32.dll" +// int SendMessageA(int hWnd,int Msg,int wParam,int lParam); +// #import "my_expert.dll" +// int ExpertRecalculate(int wParam,int lParam); +// #import +//+------------------------------------------------------------------+ +//| EX5 imports | +//+------------------------------------------------------------------+ +// #import "stdlib.ex5" +// string ErrorDescription(int error_code); +// #import +//+------------------------------------------------------------------+ diff --git a/ComboBoxNew.mqh b/ComboBoxNew.mqh new file mode 100644 index 0000000..77c529a --- /dev/null +++ b/ComboBoxNew.mqh @@ -0,0 +1,7 @@ +//+------------------------------------------------------------------+ +//| ComboBoxNew.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include diff --git a/Comment.mqh b/Comment.mqh new file mode 100644 index 0000000..e392240 --- /dev/null +++ b/Comment.mqh @@ -0,0 +1,410 @@ +//+------------------------------------------------------------------+ +//| Comment.mqh | +//| avoitenko | +//| https://login.mql5.com/en/users/avoitenko | +//+------------------------------------------------------------------+ +#property copyright "avoitenko" +#property link "https://login.mql5.com/en/users/avoitenko" +#property version "1.00" +#property strict + +#include +#include + +//--- +#define EVENT_NO_EVENTS 0 +#define EVENT_MOVE 1 +#define EVENT_CHANGE 2 +//+------------------------------------------------------------------+ +//| TComment | +//+------------------------------------------------------------------+ +class TComment : public CObject +{ +public: + string text; + color colour; +}; +//+------------------------------------------------------------------+ +//| CComment | +//+------------------------------------------------------------------+ +class CComment +{ +private: + CPoint m_temp; + CCanvas m_comment; + CPoint m_pos; + CList m_list; + CSize m_size; + //--- + string m_name; + string m_font_name; + int m_font_size; + bool m_font_bold; + double m_font_interval; + color m_border_color; + color m_back_color; + uchar m_back_alpha; + bool m_graph_mode; + bool m_auto_colors; + color m_auto_back_color; + color m_auto_text_color; + color m_auto_border_color; + color m_chart_back_color; + //+------------------------------------------------------------------+ + color Color2Gray(const color value) + { + int gray=(int)round(0.3*GETRGBR(value)+0.59*GETRGBG(value)+0.11*GETRGBB(value)); + if(gray>255) gray=255; + return((color)ARGB(0,gray,gray,gray)); + } + //+------------------------------------------------------------------+ + uchar GrayChannel(const color value) + { + int gray=(int)round(0.3*GETRGBR(value)+0.59*GETRGBG(value)+0.11*GETRGBB(value)); + if(gray>255) gray=255; + return((uchar)gray); + } + //+------------------------------------------------------------------+ + color Bright(const color value,const int percent) + { + int r,g,b; + //--- + r=GETRGBR(value); + g=GETRGBG(value); + b=GETRGBB(value); + //--- + if(percent>=0) + { + r+=(255-r)*percent/100; + if(r>255)r=255; + + g+=(255-g)*percent/100; + if(g>255)g=255; + + b+=(255-b)*percent/100; + if(b>255)b=255; + } + else + { + r+=r*percent/100; + if(r<0)r=0; + + g+=g*percent/100; + if(g<0)g=0; + + b+=b*percent/100; + if(b<0)b=0; + } + //--- + return(ARGB(0,r,g,b)); + } + //+------------------------------------------------------------------+ + void CalcColors() + { + m_auto_back_color=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND); + color m_back_gray=Color2Gray(m_auto_back_color); + uchar channel=GrayChannel(m_back_gray); + //--- + if(channel>120) + { + if(m_back_color==clrNONE) + m_auto_border_color=clrNONE; + else + m_auto_border_color=Bright(m_back_gray,-30); + + m_auto_text_color=Bright(m_back_gray,-80); + } + else + { + if(m_back_color==clrNONE) + m_auto_border_color=clrNONE; + else + m_auto_border_color=Bright(m_back_gray,30); + + m_auto_text_color=Bright(m_back_gray,80); + } + } +public: + //+------------------------------------------------------------------+ + void CComment(void) + { + m_name=NULL; + m_font_name="Lucida Console"; + m_font_size=14; + m_font_bold=false; + m_font_interval=1.7; + m_border_color=clrNONE; + m_back_color=clrBlack; + m_back_alpha=255; + m_graph_mode=true; + m_auto_colors=false; + m_chart_back_color=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND); + m_auto_back_color=clrBlack; + m_auto_border_color=clrNONE; + //--- + ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true); + }; + //+------------------------------------------------------------------+ + void Create(const string name,const uint x,const uint y) + { + m_name=name; + m_pos.x=(int)x; + m_pos.y=(int)y; + }; + //+------------------------------------------------------------------+ + int CoordY() + { + return(m_pos.y); + } + //+------------------------------------------------------------------+ + int CoordX() + { + return(m_pos.x); + } + //+------------------------------------------------------------------+ + void Move(const uint x,const uint y) + { + m_pos.x=(int)x; + m_pos.y=(int)y; + + if(ObjectGetInteger(0,m_name,OBJPROP_XDISTANCE)!=m_pos.x) + ObjectSetInteger(0,m_name,OBJPROP_XDISTANCE,m_pos.x); + + if(ObjectGetInteger(0,m_name,OBJPROP_YDISTANCE)!=m_pos.y) + ObjectSetInteger(0,m_name,OBJPROP_YDISTANCE,m_pos.y); + }; + //+------------------------------------------------------------------+ + void SetAutoColors(const bool value) + { + m_auto_colors=value; + if(value) + CalcColors(); + } + //+------------------------------------------------------------------+ + void SetGraphMode(const bool value) + { + m_graph_mode=value; + }; + //+------------------------------------------------------------------+ + void SetText(const int row,const string text,const color colour) + { + if(row<0) + return; + + //--- + int total=m_list.Total(); + + if(row=pan.x && p.x=pan.y && p.y=pan.x && p.x=pan.y && p.y=0 && m_temp.y>=0) + { + int new_x=p.x-m_temp.x; + if(new_x>screen.cx-psize.cx)new_x=screen.cx-psize.cx; + if(new_x<0)new_x=0; + + int new_y=p.y-m_temp.y; + if(new_y>screen.cy-psize.cy)new_y=screen.cy-psize.cy; + if(new_y<0)new_y=0; + //--- + ObjectSetInteger(0,m_name,OBJPROP_XDISTANCE,new_x); + m_pos.x=new_x; + ObjectSetInteger(0,m_name,OBJPROP_YDISTANCE,new_y); + m_pos.y=new_y; + ChartSetInteger(0,CHART_MOUSE_SCROLL,false); +#ifdef __MQL5__ + ChartRedraw(); +#endif + return(EVENT_MOVE); + } + } + else + { + m_temp.x=-1; + m_temp.y=-1; + ChartSetInteger(0,CHART_MOUSE_SCROLL,true); + } + } + //--- + if(m_auto_colors && id==CHARTEVENT_CHART_CHANGE) + { + //--- changing background color event + if(m_chart_back_color!=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND)) + { + CalcColors(); + m_chart_back_color=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND); + Show(); + return(EVENT_CHANGE); + } + } + //--- + return(EVENT_NO_EVENTS); + } + //+------------------------------------------------------------------+ + void Show() + { + int rows=m_list.Total(); + + //--- text mode + if(!m_graph_mode) + { + string text; + for(int i=0; imax_width) max_width=width; + } + max_width+=text_height*2; + + //--- create panel + if(ObjectFind(0,m_name)==-1) + { + m_comment.CreateBitmapLabel(0,0,m_name,m_pos.x,m_pos.y,max_width,max_height,COLOR_FORMAT_ARGB_NORMALIZE); + ObjectSetString(0,m_name,OBJPROP_TOOLTIP,"\n"); + } + else + { + //--- resize panel + if(m_comment.Height()!=max_height || + m_comment.Width()!=max_width) + { + if(!m_comment.Resize(max_width,max_height)) + { + ObjectDelete(0,m_name); + ChartRedraw(); + } + } + + } + //--- + m_comment.Erase(ColorToARGB(m_auto_colors?m_auto_back_color:m_back_color,m_back_alpha)); + m_comment.Rectangle(0,0,max_width-1,max_height-1,ColorToARGB(m_auto_colors?m_auto_border_color:m_border_color)); + //--- + int h=text_height; + for(int i=0; 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 Fe*uw+PyPS^ literal 0 HcmV?d00001 diff --git a/Control panel MCM.mqh b/Control panel MCM.mqh new file mode 100644 index 0000000000000000000000000000000000000000..758b884cd1318ab694fa34ecb03154122cf4d1ad GIT binary patch literal 121160 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 literal 0 HcmV?d00001 diff --git a/CreateLicense.mqh b/CreateLicense.mqh new file mode 100644 index 0000000..e568006 --- /dev/null +++ b/CreateLicense.mqh @@ -0,0 +1,111 @@ +//+------------------------------------------------------------------+ +//| CreateLicense.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +class CreateLicense +{ +private: + string mProductName; + string mProductKey; + string mExpiry; + string mUserID; + string mAccount; +public: + CreateLicense(void); + ~CreateLicense(void); + + void initalization(string productName, string productKey, datetime expiry, long userid, long account); + string KeyGen( string data ); // Allow account to pass in + string Hash( string data ); + bool FileGen( string data ); + void CreateTestLicenseFile(); +}; + +CreateLicense::CreateLicense(void) +{ +} + +CreateLicense::~CreateLicense(void) +{ +} + +void CreateLicense::initalization(string productName, string productKey, datetime expiry, long userid, long account) +{ + mProductName = productName; + mProductKey = productKey; + mExpiry = TimeToString(expiry,TIME_DATE); + mUserID = IntegerToString(userid); + mAccount = IntegerToString(account); +} + +string CreateLicense::Hash( string data ) { + uchar dataCharArray[]; + StringToCharArray(data, dataCharArray); + + uchar combinedCharArray[]; + int combinedSize = ArraySize(dataCharArray); + ArrayResize(combinedCharArray, combinedSize); + ArrayCopy(combinedCharArray, dataCharArray, 0, 0, ArraySize(dataCharArray)); + + // Generate SHA-256 hash + uchar hashResult[]; + if (!CryptEncode(CRYPT_HASH_SHA256, combinedCharArray, combinedCharArray, hashResult)) { + Print("Error generating SHA-256 hash."); + return ""; + } + + // Base64 encode the hash result + uchar base64Result[]; + if (!CryptEncode(CRYPT_BASE64, hashResult, hashResult, base64Result)) { + Print("Error encoding to Base64."); + return ""; + } + + // Convert Base64 result to string for the final passcode + string result = CharArrayToString(base64Result); + + return result; +} + +bool CreateLicense::FileGen( string data ) { + + string licencePath = Hash( mProductName + "_" + mAccount ) + ".lic"; + + int handle = FileOpen( licencePath, FILE_WRITE | FILE_BIN | FILE_ANSI ); + if ( handle == INVALID_HANDLE ) { + PrintFormat( "Could not create licence file %s", licencePath ); + return ( false ); + } + string data_hash = Hash(mAccount + "_" + mExpiry + "_" + mUserID + "_" + mProductName + "_" + mProductKey); + string signature = KeyGen(data_hash); + string contents = signature + data_hash + "\n" + mExpiry; + FileWriteString( handle, contents ); + FileFlush( handle ); + FileClose( handle ); + + Print( "Licence file '" + licencePath + "' created" ); + return ( true ); +} + +string CreateLicense::KeyGen( string data ) { + string keyString = data + mProductName; + return Hash( keyString ); +} + + +void CreateLicense::CreateTestLicenseFile() { + string data = Hash(mAccount + "_" + mExpiry + "_" + mUserID + "_" + mProductName + "_" + mProductKey); + // Create the file to ship to the customer + if ( !FileGen( data ) ) { + Print( "Failed to create licence file" ); + return; + } + + Print( "Created licence file" ); +} + + diff --git a/Defines.mqh b/Defines.mqh new file mode 100644 index 0000000..30a0892 --- /dev/null +++ b/Defines.mqh @@ -0,0 +1,200 @@ +//+------------------------------------------------------------------+ +//| Defines.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Enumerations | +//+------------------------------------------------------------------+ +//--- properties flags +enum ENUM_WND_PROP_FLAGS + { + WND_PROP_FLAG_CAN_DBL_CLICK = 1, // can be double clicked by mouse + WND_PROP_FLAG_CAN_DRAG = 2, // can be dragged by mouse + WND_PROP_FLAG_CLICKS_BY_PRESS= 4, // generates the "click" event series on pressing left mouse button + WND_PROP_FLAG_CAN_LOCK = 8, // control with fixed state (usually it is a button) + WND_PROP_FLAG_READ_ONLY =16 // read only (usually it is a edit) + }; +//--- state flags +enum ENUM_WND_STATE_FLAGS + { + WND_STATE_FLAG_ENABLE = 1, // "object is enabled" flag + WND_STATE_FLAG_VISIBLE = 2, // "object is visible" flag + WND_STATE_FLAG_ACTIVE = 4, // "object is active" flag + }; +//--- mouse flags +enum ENUM_MOUSE_FLAGS + { + MOUSE_INVALID_FLAGS =-1, // no buttons state + MOUSE_EMPTY = 0, // buttons are not pressed + MOUSE_LEFT = 1, // left button pressed + MOUSE_RIGHT = 2 // right button pressed + }; +//--- alignment flags +enum ENUM_WND_ALIGN_FLAGS + { + WND_ALIGN_NONE = 0, // no alignment + WND_ALIGN_LEFT = 1, // align by left border + WND_ALIGN_TOP = 2, // align by top border + WND_ALIGN_RIGHT = 4, // align by right border + WND_ALIGN_BOTTOM = 8, // align by bottom border + WND_ALIGN_WIDTH = WND_ALIGN_LEFT|WND_ALIGN_RIGHT, // justify + WND_ALIGN_HEIGHT = WND_ALIGN_TOP|WND_ALIGN_BOTTOM, // align by top and bottom border + WND_ALIGN_CLIENT = WND_ALIGN_WIDTH|WND_ALIGN_HEIGHT // align by all sides + }; + +//+------------------------------------------------------------------+ +//| Drawing styles and colors | +//+------------------------------------------------------------------+ +//--- common +#define CONTROLS_FONT_NAME "Trebuchet MS" +#define CONTROLS_FONT_SIZE (10) +//--- Text +#define CONTROLS_COLOR_TEXT C'0x3B,0x29,0x28' +#define CONTROLS_COLOR_TEXT_SEL White +#define CONTROLS_COLOR_BG White +#define CONTROLS_COLOR_BG_SEL C'0x33,0x99,0xFF' +//--- Button +#define CONTROLS_BUTTON_COLOR C'0x3B,0x29,0x28' +#define CONTROLS_BUTTON_COLOR_BG C'0xDD,0xE2,0xEB' +#define CONTROLS_BUTTON_COLOR_BORDER C'0xB2,0xC3,0xCF' +//--- Label +#define CONTROLS_LABEL_COLOR C'0x3B,0x29,0x28' +//--- Edit +#define CONTROLS_EDIT_COLOR C'0x3B,0x29,0x28' +#define CONTROLS_EDIT_COLOR_BG White +#define CONTROLS_EDIT_COLOR_BORDER C'0xB2,0xC3,0xCF' +//--- Scrolls +#define CONTROLS_SCROLL_COLOR_BG C'0xEC,0xEC,0xEC' +#define CONTROLS_SCROLL_COLOR_BORDER C'0xD3,0xD3,0xD3' +//--- Client +#define CONTROLS_CLIENT_COLOR_BG C'0xDE,0xDE,0xDE' +#define CONTROLS_CLIENT_COLOR_BORDER C'0x2C,0x2C,0x2C' +//--- ListView +#define CONTROLS_LISTITEM_COLOR_TEXT C'0x3B,0x29,0x28' +#define CONTROLS_LISTITEM_COLOR_TEXT_SEL White +#define CONTROLS_LISTITEM_COLOR_BG White +#define CONTROLS_LISTITEM_COLOR_BG_SEL C'0x33,0x99,0xFF' +#define CONTROLS_LIST_COLOR_BG White +#define CONTROLS_LIST_COLOR_BORDER C'0xB2,0xC3,0xCF' +//--- CheckGroup +#define CONTROLS_CHECKGROUP_COLOR_BG C'0xF7,0xF7,0xF7' +#define CONTROLS_CHECKGROUP_COLOR_BORDER C'0xB2,0xC3,0xCF' +//--- RadioGroup +#define CONTROLS_RADIOGROUP_COLOR_BG C'0xF7,0xF7,0xF7' +#define CONTROLS_RADIOGROUP_COLOR_BORDER C'0xB2,0xC3,0xCF' +//--- Dialog +#define CONTROLS_DIALOG_COLOR_BORDER_LIGHT White +#define CONTROLS_DIALOG_COLOR_BORDER_DARK C'0xB6,0xB6,0xB6' +#define CONTROLS_DIALOG_COLOR_BG C'0xF0,0xF0,0xF0' +#define CONTROLS_DIALOG_COLOR_CAPTION_TEXT C'0x28,0x29,0x3B' +#define CONTROLS_DIALOG_COLOR_CLIENT_BG C'0xF7,0xF7,0xF7' +#define CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8' +//+------------------------------------------------------------------+ +//| Constants for the controls | +//+------------------------------------------------------------------+ +//--- common +#define CONTROLS_INVALID_ID (-1) // invalid ID +#define CONTROLS_INVALID_INDEX (-1) // invalid index of array +#define CONTROLS_SELF_MESSAGE (-1) // message to oneself +#define CONTROLS_MAXIMUM_ID (10000) // maximum number of IDs in application +#define CONTROLS_BORDER_WIDTH (1) // border width +#define CONTROLS_SUBWINDOW_GAP (3) // gap between sub-windows along the Y axis +#define CONTROLS_DRAG_SPACING (50) // sensitivity threshold for dragging +#define CONTROLS_DBL_CLICK_TIME (100) // double click interval +//--- BmpButton +#define CONTROLS_BUTTON_SIZE (16) // default size of button (16 x 16) +//--- Scrolls +#define CONTROLS_SCROLL_SIZE (18) // default lateral size of scrollbar +#define CONTROLS_SCROLL_THUMB_SIZE (22) // default length of scroll box +//--- RadioButton +#define CONTROLS_RADIO_BUTTON_X_OFF (3) // X offset of radio button (for RadioButton) +#define CONTROLS_RADIO_BUTTON_Y_OFF (3) // Y offset of radio button (for RadioButton) +#define CONTROLS_RADIO_LABEL_X_OFF (20) // X offset of label (for RadioButton) +#define CONTROLS_RADIO_LABEL_Y_OFF (0) // Y offset of label (for RadioButton) +//--- CheckBox +#define CONTROLS_CHECK_BUTTON_X_OFF (3) // X offset of check button (for CheckBox) +#define CONTROLS_CHECK_BUTTON_Y_OFF (3) // Y offset of check button (for CheckBox) +#define CONTROLS_CHECK_LABEL_X_OFF (20) // X offset of label (for CheckBox) +#define CONTROLS_CHECK_LABEL_Y_OFF (0) // Y offset of label (for CheckBox) +//--- Spin +#define CONTROLS_SPIN_BUTTON_X_OFF (2) // X offset of button from right (for SpinEdit) +#define CONTROLS_SPIN_MIN_HEIGHT (18) // minimal height (for SpinEdit) +#define CONTROLS_SPIN_BUTTON_SIZE (8) // default size of button (16 x 8) (for SpinEdit) +//--- Combo +#define CONTROLS_COMBO_BUTTON_X_OFF (2) // X offset of button from right (for ComboBox) +#define CONTROLS_COMBO_MIN_HEIGHT (18) // minimal height (for ComboBox) +#define CONTROLS_COMBO_ITEM_HEIGHT (18) // height of combo box item (for ComboBox) +#define CONTROLS_COMBO_ITEMS_VIEW (18) // number of items in combo box (for ComboBox) +//--- ListView +#define CONTROLS_LIST_ITEM_HEIGHT (18) // height of list item (for ListView) +#define CONTROLS_LIST_ITEM_CLICK (19) +//--- Dialog +#define CONTROLS_DIALOG_CAPTION_HEIGHT (22) // height of dialog header +#define CONTROLS_DIALOG_BUTTON_OFF (3) // offset of dialog buttons +#define CONTROLS_DIALOG_CLIENT_OFF (2) // offset of dialog client area +#define CONTROLS_DIALOG_MINIMIZE_LEFT (10) // left coordinate of dialog in minimized state +#define CONTROLS_DIALOG_MINIMIZE_TOP (10) // top coordinate of dialog in minimized state +#define CONTROLS_DIALOG_MINIMIZE_WIDTH (100) // width of dialog in minimized state +#define CONTROLS_DIALOG_MINIMIZE_HEIGHT (4*CONTROLS_BORDER_WIDTH+CONTROLS_DIALOG_CAPTION_HEIGHT) // height of dialog in minimized state +//+------------------------------------------------------------------+ +//| Macro | +//+------------------------------------------------------------------+ +//--- check properties +#define IS_CAN_DBL_CLICK ((m_prop_flags&WND_PROP_FLAG_CAN_DBL_CLICK)!=0) +#define IS_CAN_DRAG ((m_prop_flags&WND_PROP_FLAG_CAN_DRAG)!=0) +#define IS_CLICKS_BY_PRESS ((m_prop_flags&WND_PROP_FLAG_CLICKS_BY_PRESS)!=0) +#define IS_CAN_LOCK ((m_prop_flags&WND_PROP_FLAG_CAN_LOCK)!=0) +#define IS_READ_ONLY ((m_prop_flags&WND_PROP_FLAG_READ_ONLY)!=0) +//--- check state +#define IS_ENABLED ((m_state_flags&WND_STATE_FLAG_ENABLE)!=0) +#define IS_VISIBLE ((m_state_flags&WND_STATE_FLAG_VISIBLE)!=0) +#define IS_ACTIVE ((m_state_flags&WND_STATE_FLAG_ACTIVE)!=0) +//+------------------------------------------------------------------+ +//| Macro of event handling map | +//+------------------------------------------------------------------+ +#define INTERNAL_EVENT (-1) +//--- beginning of map +#define EVENT_MAP_BEGIN(class_name) bool class_name::OnEvent(const int id,const long& lparam,const double& dparam,const string& sparam) { +//--- end of map +#define EVENT_MAP_END(parent_class_name) return(parent_class_name::OnEvent(id,lparam,dparam,sparam)); } +//--- event handling by numeric ID +#define ON_EVENT(event,control,handler) if(id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(); return(true); } +//--- event handling by numeric ID by pointer of control +#define ON_EVENT_PTR(event,control,handler) if(control!=NULL && id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(); return(true); } +//--- event handling without ID analysis +#define ON_NO_ID_EVENT(event,handler) if(id==(event+CHARTEVENT_CUSTOM)) { return(handler()); } +//--- event handling by row ID +#define ON_NAMED_EVENT(event,control,handler) if(id==(event+CHARTEVENT_CUSTOM) && sparam==control.Name()) { handler(); return(true); } +//--- handling of indexed event +#define ON_INDEXED_EVENT(event,controls,handler) { int total=ArraySize(controls); for(int i=0;i +//+------------------------------------------------------------------+ +//| Resources | +//+------------------------------------------------------------------+ +#resource "res\\Close.bmp" +#resource "res\\Restore.bmp" +#resource "res\\Turn.bmp" +//+------------------------------------------------------------------+ +//| Class CDialog | +//| Usage: base class to create dialog boxes | +//| and indicator panels | +//+------------------------------------------------------------------+ +class CDialog : public CWndContainer + { +private: + //--- dependent controls + CPanel m_white_border; // the "white border" object + CPanel m_background; // the background object + CEdit m_caption; // the window title object + CBmpButton m_button_close; // the "Close" button object + CWndClient m_client_area; // the client area object + +protected: + //--- flags + bool m_panel_flag; // the "panel in a separate window" flag + //--- flags + bool m_minimized; // "create in minimized state" flag + //--- additional areas + CRect m_min_rect; // minimal area coordinates + CRect m_norm_rect; // normal area coordinates + +public: + CDialog(void); + ~CDialog(void); + //--- create + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + //--- set up + string Caption(void) const { return(m_caption.Text()); } + bool Caption(const string text) { return(m_caption.Text(text)); } + //--- fill + bool Add(CWnd *control); + bool Add(CWnd &control); + //--- methods for working with files + virtual bool Save(const int file_handle); + virtual bool Load(const int file_handle); + +protected: + //--- create dependent controls + virtual bool CreateWhiteBorder(void); + virtual bool CreateBackground(void); + virtual bool CreateCaption(void); + virtual bool CreateButtonClose(void); + virtual bool CreateClientArea(void); + //--- handlers of the dependent controls events + virtual void OnClickCaption(void); + virtual void OnClickButtonClose(void); + //--- access properties of caption + void CaptionAlignment(const int flags,const int left,const int top,const int right,const int bottom) + { m_caption.Alignment(flags,left,top,right,bottom); } + //--- access properties of client area + bool ClientAreaVisible(const bool visible) { return(m_client_area.Visible(visible)); } + int ClientAreaLeft(void) const { return(m_client_area.Left()); } + int ClientAreaTop(void) const { return(m_client_area.Top()); } + int ClientAreaRight(void) const { return(m_client_area.Right()); } + int ClientAreaBottom(void) const { return(m_client_area.Bottom()); } + int ClientAreaWidth(void) const { return(m_client_area.Width()); } + int ClientAreaHeight(void) const { return(m_client_area.Height()); } + //--- handlers of drag + virtual bool OnDialogDragStart(void); + virtual bool OnDialogDragProcess(void); + virtual bool OnDialogDragEnd(void); + }; +//+------------------------------------------------------------------+ +//| Common handler of events | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CDialog) + ON_EVENT(ON_CLICK,m_button_close,OnClickButtonClose) + ON_EVENT(ON_CLICK,m_caption,OnClickCaption) + ON_EVENT(ON_DRAG_START,m_caption,OnDialogDragStart) + ON_EVENT_PTR(ON_DRAG_PROCESS,m_drag_object,OnDialogDragProcess) + ON_EVENT_PTR(ON_DRAG_END,m_drag_object,OnDialogDragEnd) +EVENT_MAP_END(CWndContainer) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CDialog::CDialog(void) : m_panel_flag(false), + m_minimized(false) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CDialog::~CDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Create a control | +//+------------------------------------------------------------------+ +bool CDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { +//--- call method of parent class + if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2)) + return(false); +//--- create dependent controls + if(!m_panel_flag && !CreateWhiteBorder()) + return(false); + if(!CreateBackground()) + return(false); + if(!CreateCaption()) + return(false); + if(!CreateButtonClose()) + return(false); + if(!CreateClientArea()) + return(false); +//--- set up additional areas + m_norm_rect.SetBound(m_rect); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Add control to the client area (by pointer) | +//+------------------------------------------------------------------+ +bool CDialog::Add(CWnd *control) + { + return(m_client_area.Add(control)); + } +//+------------------------------------------------------------------+ +//| Add control to the client area (by reference) | +//+------------------------------------------------------------------+ +bool CDialog::Add(CWnd &control) + { + return(m_client_area.Add(control)); + } +//+------------------------------------------------------------------+ +//| Save | +//+------------------------------------------------------------------+ +bool CDialog::Save(const int file_handle) + { +//--- check + if(file_handle==INVALID_HANDLE) + return(false); +//--- save + FileWriteStruct(file_handle,m_norm_rect); + FileWriteInteger(file_handle,m_min_rect.left); + FileWriteInteger(file_handle,m_min_rect.top); + FileWriteInteger(file_handle,m_minimized); +//--- result + return(CWndContainer::Save(file_handle)); + } +//+------------------------------------------------------------------+ +//| Load | +//+------------------------------------------------------------------+ +bool CDialog::Load(const int file_handle) + { + if(file_handle==INVALID_HANDLE) + return(false); +//--- load + if(!FileIsEnding(file_handle)) + { + FileReadStruct(file_handle,m_norm_rect); + int left=FileReadInteger(file_handle); + int top=FileReadInteger(file_handle); + m_min_rect.Move(left,top); + m_minimized=FileReadInteger(file_handle); + } +//--- result + return(CWndContainer::Load(file_handle)); + } +//+------------------------------------------------------------------+ +//| Create "white border" | +//+------------------------------------------------------------------+ +bool CDialog::CreateWhiteBorder(void) + { +//--- coordinates + int x1=0; + int y1=0; + int x2=Width(); + int y2=Height(); +//--- create + if(!m_white_border.Create(m_chart_id,m_name+"Border",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_white_border.ColorBackground(CONTROLS_DIALOG_COLOR_BG)) + return(false); + if(!m_white_border.ColorBorder(CONTROLS_DIALOG_COLOR_BORDER_LIGHT)) + return(false); + if(!CWndContainer::Add(m_white_border)) + return(false); + m_white_border.Alignment(WND_ALIGN_CLIENT,0,0,0,0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create background | +//+------------------------------------------------------------------+ +bool CDialog::CreateBackground(void) + { + int off=(m_panel_flag) ? 0:CONTROLS_BORDER_WIDTH; +//--- coordinates + int x1=off; + int y1=off; + int x2=Width()-off; + int y2=Height()-off; +//--- create + if(!m_background.Create(m_chart_id,m_name+"Back",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_background.ColorBackground(CONTROLS_DIALOG_COLOR_BG)) + return(false); + color border=(m_panel_flag) ? CONTROLS_DIALOG_COLOR_BG : CONTROLS_DIALOG_COLOR_BORDER_DARK; + if(!m_background.ColorBorder(border)) + return(false); + if(!CWndContainer::Add(m_background)) + return(false); + m_background.Alignment(WND_ALIGN_CLIENT,off,off,off,off); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create window title | +//+------------------------------------------------------------------+ +bool CDialog::CreateCaption(void) + { + int off=(m_panel_flag) ? 0:2*CONTROLS_BORDER_WIDTH; +//--- coordinates + int x1=off; + int y1=off; + int x2=Width()-off; + int y2=y1+CONTROLS_DIALOG_CAPTION_HEIGHT; +//--- create + if(!m_caption.Create(m_chart_id,m_name+"Caption",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_caption.Color(CONTROLS_DIALOG_COLOR_CAPTION_TEXT)) + return(false); + if(!m_caption.ColorBackground(CONTROLS_DIALOG_COLOR_BG)) + return(false); + if(!m_caption.ColorBorder(CONTROLS_DIALOG_COLOR_BG)) + return(false); + if(!m_caption.ReadOnly(true)) + return(false); + if(!m_caption.Text(m_name)) + return(false); + if(!CWndContainer::Add(m_caption)) + return(false); + m_caption.Alignment(WND_ALIGN_WIDTH,off,0,off,0); + if(!m_panel_flag) + m_caption.PropFlags(WND_PROP_FLAG_CAN_DRAG); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create the "Close" button | +//+------------------------------------------------------------------+ +bool CDialog::CreateButtonClose(void) + { + int off=(m_panel_flag) ? 0 : 2*CONTROLS_BORDER_WIDTH; +//--- coordinates + int x1=Width()-off-(CONTROLS_BUTTON_SIZE+CONTROLS_DIALOG_BUTTON_OFF); + int y1=off+CONTROLS_DIALOG_BUTTON_OFF; + int x2=x1+CONTROLS_BUTTON_SIZE; + int y2=y1+CONTROLS_BUTTON_SIZE; +//--- create + if(!m_button_close.Create(m_chart_id,m_name+"Close",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button_close.BmpNames("::res\\Close.bmp")) + return(false); + if(!CWndContainer::Add(m_button_close)) + return(false); + m_button_close.Alignment(WND_ALIGN_RIGHT,0,0,off+CONTROLS_DIALOG_BUTTON_OFF,0); +//--- change caption + CaptionAlignment(WND_ALIGN_WIDTH,off,0,off+(CONTROLS_BUTTON_SIZE+CONTROLS_DIALOG_BUTTON_OFF),0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Create client area | +//+------------------------------------------------------------------+ +bool CDialog::CreateClientArea(void) + { + int off=(m_panel_flag) ? 0:2*CONTROLS_BORDER_WIDTH; +//--- coordinates + int x1=off+CONTROLS_DIALOG_CLIENT_OFF; + int y1=off+CONTROLS_DIALOG_CAPTION_HEIGHT; + int x2=Width()-(off+CONTROLS_DIALOG_CLIENT_OFF); + int y2=Height()-(off+CONTROLS_DIALOG_CLIENT_OFF); +//--- create + if(!m_client_area.Create(m_chart_id,m_name+"Client",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_client_area.ColorBackground(CONTROLS_DIALOG_COLOR_CLIENT_BG)) + return(false); + if(!m_client_area.ColorBorder(CONTROLS_DIALOG_COLOR_CLIENT_BORDER)) + return(false); + CWndContainer::Add(m_client_area); + m_client_area.Alignment(WND_ALIGN_CLIENT,x1,y1,x1,x1); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Handler of click on the window title | +//+------------------------------------------------------------------+ +void CDialog::OnClickCaption(void) + { + } +//+------------------------------------------------------------------+ +//| Handler of click on the "Close" button | +//+------------------------------------------------------------------+ +void CDialog::OnClickButtonClose(void) + { + Visible(false); + } +//+------------------------------------------------------------------+ +//| Start dragging the dialog box | +//+------------------------------------------------------------------+ +bool CDialog::OnDialogDragStart(void) + { + if(m_drag_object==NULL) + { + m_drag_object=new CDragWnd; + if(m_drag_object==NULL) + return(false); + } +//--- calculate coordinates + int x1=Left()-CONTROLS_DRAG_SPACING; + int y1=Top()-CONTROLS_DRAG_SPACING; + int x2=Right()+CONTROLS_DRAG_SPACING; + int y2=Bottom()+CONTROLS_DRAG_SPACING; +//--- create + m_drag_object.Create(m_chart_id,"",m_subwin,x1,y1,x2,y2); + m_drag_object.PropFlags(WND_PROP_FLAG_CAN_DRAG); +//--- constraints + CChart chart; + chart.Attach(m_chart_id); + m_drag_object.Limits(-CONTROLS_DRAG_SPACING,-CONTROLS_DRAG_SPACING, + chart.WidthInPixels()+CONTROLS_DRAG_SPACING, + chart.HeightInPixels(m_subwin)+CONTROLS_DRAG_SPACING); + chart.Detach(); +//--- set mouse params + m_drag_object.MouseX(m_caption.MouseX()); + m_drag_object.MouseY(m_caption.MouseY()); + m_drag_object.MouseFlags(m_caption.MouseFlags()); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Continue dragging the dialog box | +//+------------------------------------------------------------------+ +bool CDialog::OnDialogDragProcess(void) + { +//--- checking + if(m_drag_object==NULL) + return(false); +//--- calculate coordinates + int x=m_drag_object.Left()+50; + int y=m_drag_object.Top()+50; +//--- move dialog + Move(x,y); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| End dragging the dialog box | +//+------------------------------------------------------------------+ +bool CDialog::OnDialogDragEnd(void) + { + if(m_drag_object!=NULL) + { + m_caption.MouseFlags(m_drag_object.MouseFlags()); + delete m_drag_object; + m_drag_object=NULL; + } +//--- set up additional areas + if(m_minimized) + m_min_rect.SetBound(m_rect); + else + m_norm_rect.SetBound(m_rect); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Class CAppDialog | +//| Usage: main dialog box of MQL5 application | +//+------------------------------------------------------------------+ +class CAppDialog : public CDialog + { +private: + //--- dependent controls + CBmpButton m_button_minmax; // the "Minimize/Maximize" button object + //--- variables + string m_program_name; // name of program + string m_instance_id; // unique string ID + ENUM_PROGRAM_TYPE m_program_type; // type of program + string m_indicator_name; + int m_deinit_reason; + //--- for mouse + int m_subwin_Yoff; // subwindow Y offset + CWnd* m_focused_wnd; // pointer to object that has mouse focus + CWnd* m_top_wnd; // pointer to object that has priority over mouse events handling + +protected: + CChart m_chart; // object to access chart + +public: + CAppDialog(void); + ~CAppDialog(void); + //--- main application dialog creation and destroy + virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); + virtual void Destroy(const int reason=REASON_PROGRAM); + //--- chart event handler + virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + //--- dialog run + bool Run(void); + //--- chart events processing + void ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam); + //--- set up + void Minimized(const bool flag) { m_minimized=flag; } + //--- to save/restore state + void IniFileSave(void); + void IniFileLoad(void); + virtual string IniFileName(void) const; + virtual string IniFileExt(void) const { return(".dat"); } + virtual bool Load(const int file_handle); + virtual bool Save(const int file_handle); + +private: + bool CreateCommon(const long chart,const string name,const int subwin); + bool CreateExpert(const int x1,const int y1,const int x2,const int y2); + bool CreateIndicator(const int x1,const int y1,const int x2,const int y2); + +protected: + //--- create dependent controls + virtual bool CreateButtonMinMax(void); + //--- handlers of the dependent controls events + virtual void OnClickButtonClose(void); + virtual void OnClickButtonMinMax(void); + //--- external event handlers + virtual void OnAnotherApplicationClose(const long &lparam,const double &dparam,const string &sparam); + //--- methods + virtual bool Rebound(const CRect &rect); + virtual void Minimize(void); + virtual void Maximize(void); + string CreateInstanceId(void); + string ProgramName(void) const { return(m_program_name); } + void SubwinOff(void); + }; +//+------------------------------------------------------------------+ +//| Common handler of events | +//+------------------------------------------------------------------+ +EVENT_MAP_BEGIN(CAppDialog) +ON_EVENT(ON_CLICK,m_button_minmax,OnClickButtonMinMax) +ON_EXTERNAL_EVENT(ON_APP_CLOSE,OnAnotherApplicationClose) +EVENT_MAP_END(CDialog) +//+------------------------------------------------------------------+ +//| Constructor | +//+------------------------------------------------------------------+ +CAppDialog::CAppDialog(void) : m_program_type(WRONG_VALUE), + m_deinit_reason(WRONG_VALUE), + m_subwin_Yoff(0), + m_focused_wnd(NULL), + m_top_wnd(NULL) + { + } +//+------------------------------------------------------------------+ +//| Destructor | +//+------------------------------------------------------------------+ +CAppDialog::~CAppDialog(void) + { + } +//+------------------------------------------------------------------+ +//| Application dialog initialization function | +//+------------------------------------------------------------------+ +bool CAppDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) + { + if(!CreateCommon(chart,name,subwin)) + return(false); +//--- + switch(m_program_type) + { + case PROGRAM_EXPERT: + if(!CreateExpert(x1,y1,x2,y2)) + return(false); + break; + case PROGRAM_INDICATOR: + if(!CreateIndicator(x1,y1,x2,y2)) + return(false); + break; + default: + Print("CAppDialog: invalid program type"); + return(false); + } +//--- Title of dialog window + if(!Caption(m_program_name)) + return(false); +//--- create dependent controls + if(!CreateButtonMinMax()) + return(false); +//--- get subwindow offset + SubwinOff(); +//--- if flag is set, minimize the dialog + if(m_minimized) + Minimize(); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Initialize common area | +//+------------------------------------------------------------------+ +bool CAppDialog::CreateCommon(const long chart,const string name,const int subwin) + { +//--- save parameters + m_chart_id =chart; + m_name =name; + m_subwin =subwin; + m_program_name =name; + m_deinit_reason=WRONG_VALUE; +//--- get unique ID + m_instance_id=CreateInstanceId(); +//--- initialize chart object + m_chart.Attach(chart); +//--- determine type of program + m_program_type=(ENUM_PROGRAM_TYPE)MQL5InfoInteger(MQL5_PROGRAM_TYPE); +//--- specify object and mouse events + if(!m_chart.EventObjectCreate() || !m_chart.EventObjectDelete() || !m_chart.EventMouseMove()) + { + Print("CAppDialog: object events specify error"); + m_chart.Detach(); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Initialize in Expert Advisor | +//+------------------------------------------------------------------+ +bool CAppDialog::CreateExpert(const int x1,const int y1,const int x2,const int y2) + { +//--- EA works only in main window + m_subwin=0; +//--- geometry for the minimized state + m_min_rect.SetBound(CONTROLS_DIALOG_MINIMIZE_LEFT, + CONTROLS_DIALOG_MINIMIZE_TOP, + CONTROLS_DIALOG_MINIMIZE_LEFT+CONTROLS_DIALOG_MINIMIZE_WIDTH, + CONTROLS_DIALOG_MINIMIZE_TOP+CONTROLS_DIALOG_MINIMIZE_HEIGHT); +//--- call method of the parent class + if(!CDialog::Create(m_chart.ChartId(),m_instance_id,m_subwin,x1,y1,x2,y2)) + { + Print("CAppDialog: expert dialog create error"); + m_chart.Detach(); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Initialize in Indicator | +//+------------------------------------------------------------------+ +bool CAppDialog::CreateIndicator(const int x1,const int y1,const int x2,const int y2) + { + int width=m_chart.WidthInPixels(); +//--- geometry for the minimized state + m_min_rect.LeftTop(0,0); + m_min_rect.Width(width); + m_min_rect.Height(CONTROLS_DIALOG_MINIMIZE_HEIGHT-2*CONTROLS_BORDER_WIDTH); +//--- determine subwindow + m_subwin=ChartWindowFind(); + if(m_subwin==-1) + { + Print("CAppDialog: find subwindow error"); + m_chart.Detach(); + return(false); + } +//--- + int total=ChartIndicatorsTotal(m_chart.ChartId(),m_subwin); + m_indicator_name=ChartIndicatorName(m_chart.ChartId(),m_subwin,total-1); +//--- if subwindow number is 0 (main window), then our program is +//--- not an indicator panel, but is an indicator with built-in settings dialog +//--- dialog of such an indicator should behave as an Expert Advisor dialog + if(m_subwin==0) + return(CreateExpert(x1,y1,x2,y2)); +//--- if subwindow number is not 0, then our program is an indicator panel +//--- check if subwindow is not occupied by other indicators + if(total!=1) + { + Print("CAppDialog: subwindow busy"); + ChartIndicatorDelete(m_chart.ChartId(),m_subwin,ChartIndicatorName(m_chart.ChartId(),m_subwin,total-1)); + m_chart.Detach(); + return(false); + } +//--- resize subwindow by dialog height + if(!IndicatorSetInteger(INDICATOR_HEIGHT,(y2-y1)+1)) + { + Print("CAppDialog: subwindow resize error"); + ChartIndicatorDelete(m_chart.ChartId(),m_subwin,ChartIndicatorName(m_chart.ChartId(),m_subwin,total-1)); + m_chart.Detach(); + return(false); + } +//--- indicator short name + m_indicator_name=m_program_name+IntegerToString(m_subwin); + if(!IndicatorSetString(INDICATOR_SHORTNAME,m_indicator_name)) + { + Print("CAppDialog: shortname error"); + ChartIndicatorDelete(m_chart.ChartId(),m_subwin,ChartIndicatorName(m_chart.ChartId(),m_subwin,total-1)); + m_chart.Detach(); + return(false); + } +//--- set flag + m_panel_flag=true; +//--- call method of the parent class + if(!CDialog::Create(m_chart.ChartId(),m_instance_id,m_subwin,0,0,width,y2-y1)) + { + Print("CAppDialog: indicator dialog create error"); + ChartIndicatorDelete(m_chart.ChartId(),m_subwin,ChartIndicatorName(m_chart.ChartId(),m_subwin,total-1)); + m_chart.Detach(); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Application dialog deinitialization function | +//+------------------------------------------------------------------+ +void CAppDialog::Destroy(const int reason) + { +//--- destroyed already? + if(m_deinit_reason!=WRONG_VALUE) + return; +//--- + m_deinit_reason=reason; + IniFileSave(); +//--- detach chart object from chart + m_chart.Detach(); +//--- call parent destroy + CDialog::Destroy(); +//--- + if(reason==REASON_PROGRAM) + { + if(m_program_type==PROGRAM_EXPERT) + ExpertRemove(); + if(m_program_type==PROGRAM_INDICATOR) + ChartIndicatorDelete(m_chart_id,m_subwin,m_indicator_name); + } +//--- send message + EventChartCustom(CONTROLS_SELF_MESSAGE,ON_APP_CLOSE,m_subwin,0.0,m_program_name); + } +//+------------------------------------------------------------------+ +//| Calculate subwindow offset | +//+------------------------------------------------------------------+ +void CAppDialog::SubwinOff(void) + { + m_subwin_Yoff=m_chart.SubwindowY(m_subwin); + } +//+------------------------------------------------------------------+ +//| Create the "Minimize/Maximize" button | +//+------------------------------------------------------------------+ +bool CAppDialog::CreateButtonMinMax(void) + { + int off=(m_panel_flag) ? 0:2*CONTROLS_BORDER_WIDTH; +//--- coordinates + int x1=Width()-off-2*(CONTROLS_BUTTON_SIZE+CONTROLS_DIALOG_BUTTON_OFF); + int y1=off+CONTROLS_DIALOG_BUTTON_OFF; + int x2=x1+CONTROLS_BUTTON_SIZE; + int y2=y1+CONTROLS_BUTTON_SIZE; +//--- create + if(!m_button_minmax.Create(m_chart_id,m_name+"MinMax",m_subwin,x1,y1,x2,y2)) + return(false); + if(!m_button_minmax.BmpNames("::res\\Turn.bmp","::res\\Restore.bmp")) + return(false); + if(!CWndContainer::Add(m_button_minmax)) + return(false); + m_button_minmax.Locking(true); + m_button_minmax.Alignment(WND_ALIGN_RIGHT,0,0,off+CONTROLS_BUTTON_SIZE+2*CONTROLS_DIALOG_BUTTON_OFF,0); +//--- change caption + CaptionAlignment(WND_ALIGN_WIDTH,off,0,off+2*(CONTROLS_BUTTON_SIZE+CONTROLS_DIALOG_BUTTON_OFF),0); +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Charts event processing | +//+------------------------------------------------------------------+ +void CAppDialog::ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) + { + int mouse_x=(int)lparam; + int mouse_y=(int)dparam-m_subwin_Yoff; +//--- separate mouse events from others + switch(id) + { + case CHARTEVENT_CHART_CHANGE: + //--- assumed that the CHARTEVENT_CHART_CHANGE event can handle only the application dialog + break; + case CHARTEVENT_OBJECT_CLICK: + //--- we won't handle the CHARTEVENT_OBJECT_CLICK event, as we are working with the CHARTEVENT_MOUSE_MOVE events + return; + case CHARTEVENT_CUSTOM+ON_MOUSE_FOCUS_SET: + //--- the CHARTEVENT_CUSTOM + ON_MOUSE_FOCUS_SET event + if(CheckPointer(m_focused_wnd)!=POINTER_INVALID) + { + //--- if there is an element with focus, try to take its focus away + if(!m_focused_wnd.MouseFocusKill(lparam)) + return; + } + m_focused_wnd=ControlFind(lparam); + return; + case CHARTEVENT_CUSTOM+ON_BRING_TO_TOP: + m_top_wnd=ControlFind(lparam); + return; + case CHARTEVENT_MOUSE_MOVE: + //--- the CHARTEVENT_MOUSE_MOVE event + if(CheckPointer(m_top_wnd)!=POINTER_INVALID) + { + //--- if a priority element already exists, pass control to it + if(m_top_wnd.OnMouseEvent(mouse_x,mouse_y,(int)StringToInteger(sparam))) + { + //--- event handled + m_chart.Redraw(); + return; + } + } + if(OnMouseEvent(mouse_x,mouse_y,(int)StringToInteger(sparam))) + m_chart.Redraw(); + return; + default: + //--- call event processing and redraw chart if event handled + if(OnEvent(id,lparam,dparam,sparam)) + m_chart.Redraw(); + return; + } +//--- if event was not handled, try to handle the CHARTEVENT_CHART_CHANGE event + if(id==CHARTEVENT_CHART_CHANGE) + { + //--- if subwindow number is not 0, and dialog subwindow has changed its number, then restart + if(m_subwin!=0 && m_subwin!=ChartWindowFind()) + { + long fiction=1; + OnAnotherApplicationClose(fiction,dparam,sparam); + } + //--- if subwindow height is less that dialog height, minimize application window (always) + if(m_chart.HeightInPixels(m_subwin)CONTROLS_MAXIMUM_ID) + { + Print("CAppDialog: too many objects"); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Stop application | +//+------------------------------------------------------------------+ +void CAppDialog::OnClickButtonClose(void) + { +//--- destroy application + Destroy(); + } +//+------------------------------------------------------------------+ +//| Handler of click on the "Minimize/Maximize" button | +//+------------------------------------------------------------------+ +void CAppDialog::OnClickButtonMinMax(void) + { + if(m_button_minmax.Pressed()) + Minimize(); + else + Maximize(); +//--- get subwindow offset + SubwinOff(); + } +//+------------------------------------------------------------------+ +//| Resize | +//+------------------------------------------------------------------+ +bool CAppDialog::Rebound(const CRect &rect) + { + if(!Move(rect.LeftTop())) + return(false); + if(!Size(rect.Size())) + return(false); +//--- resize subwindow + if(m_program_type==PROGRAM_INDICATOR && !IndicatorSetInteger(INDICATOR_HEIGHT,rect.Height()+1)) + { + Print("CAppDialog: subwindow resize error"); + return(false); + } +//--- succeed + return(true); + } +//+------------------------------------------------------------------+ +//| Minimize dialog window | +//+------------------------------------------------------------------+ +void CAppDialog::Minimize(void) + { +//--- set flag + m_minimized=true; +//--- resize + Rebound(m_min_rect); +//--- hide client area + ClientAreaVisible(false); + } +//+------------------------------------------------------------------+ +//| Restore dialog window | +//+------------------------------------------------------------------+ +void CAppDialog::Maximize(void) + { +//--- reset flag + m_minimized=false; +//--- resize + Rebound(m_norm_rect); +//--- show client area + ClientAreaVisible(true); + } +//+------------------------------------------------------------------+ +//| Create unique prefix for object names | +//+------------------------------------------------------------------+ +string CAppDialog::CreateInstanceId(void) + { + return(IntegerToString(rand(),5,'0')); + } +//+------------------------------------------------------------------+ +//| Handler of the ON_APP_CLOSE external event | +//+------------------------------------------------------------------+ +void CAppDialog::OnAnotherApplicationClose(const long &lparam,const double &dparam,const string &sparam) + { +//--- exit if we are in the main window + if(m_subwin==0) + return; +//--- exit if external program was closed in main window + if(lparam==0) + return; +//--- get subwindow offset + SubwinOff(); +//--- exit if external program was closed in subwindow with greater number + if(lparam>=m_subwin) + return; +//--- after all the checks we must change the subwindow +//--- get the new number of subwindow + m_subwin=ChartWindowFind(); +//--- change short name + m_indicator_name=m_program_name+IntegerToString(m_subwin); + IndicatorSetString(INDICATOR_SHORTNAME,m_indicator_name); +//--- change dialog title + Caption(m_program_name); +//--- reassign IDs + Run(); + } +//+------------------------------------------------------------------+ +//| Save the current state of the program | +//+------------------------------------------------------------------+ +void CAppDialog::IniFileSave(void) + { + string filename=IniFileName()+IniFileExt(); + int handle=FileOpen(filename,FILE_WRITE|FILE_BIN|FILE_ANSI); +//--- + if(handle!=INVALID_HANDLE) + { + Save(handle); + FileClose(handle); + } + } +//+------------------------------------------------------------------+ +//| Read the previous state of the program | +//+------------------------------------------------------------------+ +void CAppDialog::IniFileLoad(void) + { + string filename=IniFileName()+IniFileExt(); + int handle=FileOpen(filename,FILE_READ|FILE_BIN|FILE_ANSI); +//--- + if(handle!=INVALID_HANDLE) + { + Load(handle); + FileClose(handle); + } + } +//+------------------------------------------------------------------+ +//| Generate the filename | +//+------------------------------------------------------------------+ +string CAppDialog::IniFileName(void) const + { + string name; +//--- + name=(m_indicator_name!=NULL) ? m_indicator_name : m_program_name; +//--- + name+="_"+Symbol(); + name+="_Ini"; +//--- + return(name); + } +//+------------------------------------------------------------------+ +//| Load data | +//+------------------------------------------------------------------+ +bool CAppDialog::Load(const int file_handle) + { + if(CDialog::Load(file_handle)) + { + if(m_minimized) + { + m_button_minmax.Pressed(true); + Minimize(); + } + else + { + m_button_minmax.Pressed(false); + Maximize(); + } + int prev_deinit_reason=FileReadInteger(file_handle); + if(prev_deinit_reason==REASON_CHARTCLOSE || prev_deinit_reason==REASON_CLOSE) + { + //--- if the previous time program ended after closing the chart window, + //--- delete object left since the last start of the program + string prev_instance_id=IntegerToString(FileReadInteger(file_handle),5,'0'); + if(prev_instance_id!=m_instance_id) + { + long chart_id=m_chart.ChartId(); + int total=ObjectsTotal(chart_id,m_subwin); + for(int i=total-1;i>=0;i--) + { + string obj_name=ObjectName(chart_id,i,m_subwin); + if(StringFind(obj_name,prev_instance_id)==0) + ObjectDelete(chart_id,obj_name); + } + } + } + return(true); + } +//--- failure + return(false); + } +//+------------------------------------------------------------------+ +//| Save data | +//+------------------------------------------------------------------+ +bool CAppDialog::Save(const int file_handle) + { + if(CDialog::Save(file_handle)) + { + FileWriteInteger(file_handle,m_deinit_reason); + FileWriteInteger(file_handle,(int)StringToInteger(m_instance_id)); + return(true); + } +//--- failure + return(false); + } +//+------------------------------------------------------------------+ diff --git a/EAF.mqh b/EAF.mqh new file mode 100644 index 0000000..6c5dda2 --- /dev/null +++ b/EAF.mqh @@ -0,0 +1,10 @@ +//+------------------------------------------------------------------+ +//| EAF.mqh | +//| Copyright 2022, Anatoli Kazharski | +//| https://www.mql5.com/ru/users/tol64 | +//+------------------------------------------------------------------+ + +// Unzip the archive you downloaded from the library page and +// place the library files in similar directories + +//+------------------------------------------------------------------+ diff --git a/EnumToArray.mqh b/EnumToArray.mqh new file mode 100644 index 0000000..fd24e34 --- /dev/null +++ b/EnumToArray.mqh @@ -0,0 +1,43 @@ +//+------------------------------------------------------------------+ +//| EnumToArray.mqh | +//| Copyright (c) 2022, MetaQuotes Ltd. | +//| https://www.mql5.com/ | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Convert enum E elements into array of ints (correponding to IDs) | +//| Return number of elements in the enum E | +//+------------------------------------------------------------------+ +template +int EnumToArray(E /*dummy*/, int &values[], + const int start = INT_MIN, const int stop = INT_MAX) +{ + const static string t = "::"; + + ArrayResize(values, 0); + int count = 0; + + for(int i = start; i < stop && !IsStopped(); i++) + { + E e = (E)i; + if(StringFind(EnumToString(e), t) == -1) + { + ArrayResize(values, count + 1); + values[count++] = i; + } + } + return count; +} + +//+------------------------------------------------------------------+ +//| Shorthand version of enum E elements detection as array of ints | +//+------------------------------------------------------------------+ +template +int EnumToArray(int &values[], + const int start = INT_MIN, const int stop = INT_MAX) +{ + static E e; + return EnumToArray(e, values, start, stop); +} + +//+------------------------------------------------------------------+ diff --git a/Functions.mqh b/Functions.mqh new file mode 100644 index 0000000000000000000000000000000000000000..b3533d396589e24d56fbdb7481c12ec349ec9aff GIT binary patch literal 43154 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 QN#%!YD|nJVTTcD{U&fFE=l}o! literal 0 HcmV?d00001 diff --git a/IniFile.mqh b/IniFile.mqh new file mode 100644 index 0000000000000000000000000000000000000000..4c45fafbfa51fc68c960754f293b21035c90f523 GIT binary patch literal 17062 zcmeHOYfl?T6rInN`X9DNLN+)+Q$B~5=&|76>9 z=I-@8c8xLE?m{ffuie?Xk2&`-cV_Cu~{=;o2RCV-|OI{Yrk7)H7R~b zs}I^e^PSc8rQu7YZkZ?ebqwC#<6Z-LSvBWq*#I9s{64fC9YRkbKSjdN0%Yr2?UL(0 zbevd;Vr`eq_+wDAh{&TrjkL`>&~mSm9oI?ddN|#SbZkx`aXY150)kd7lGe=dC+m2! z2h9+HXV8=OPy+4}JHkh}cZfGN*hl|Ks@V&)<d&_ z1zc;|z8d&W%%<7K`;Ga{e*cQ^m-zP+KG)3#K6mhM6Tf(keJogso0cC+KJN3%$EsPv z(_84r*X}D=S=;g~qd?o#Cx|EdMDft1O#b`OEBSbbPmT|Dm!OXh?ueGzW8L}@ZQDiL zJ}7l@r(v~w0j;)hg*{0R+t9=oUMrS9X&<4_4qEZ|kG2Q#mp|h-DQ910iv*5B8%Q8G z;#s#rjhLWs({Yj(^e`MTkv@B0q~!HIycaP#p(MW#t;Gv5S@(mnNYV-+Rc&zPA1Ac%CAw$sb+E$K*BRqG6uihK+EDYGS>pGsBx@A)$Ym z>_0a%EYi$}x#dzCTbO0eHdFLHB#{&6cpcaRy-^FEi@6vP=Ikdsrm?@sW|5&kiSvN) zu0*-m9!6)9#Lb_Bcpb~cjJlV4pjw(8??AfCL7a4UULN>%^{wQ_&%&x{Hm^QcV=?on zCj6)Gy|(aV8`pdeD&_^M2QK>(%=_HSmDnpfe^Cqib9std52@)4f|(Gd)^>^c z%hMUN2TJPXVY~78(s{{fo){B^-gR6Ff9mC2rdkY?YP6l>lk-#`pXD@CY8YZ8 zi-x#X%L<~??`#pR)kmV%|NXEKJnQ&z{}3!1x*Kw1T+7PDZ1F5K9}=2b`#p`;lZWr3 za9(tBzlx6LQ5w1%s`K$1uEB*K{LLUwl3hc7wMW-KxD%E8*!q}p_$!2Atkw0j9`cRY zBh%XaxZzXP^&z(|CA$-Kje)B|HLR#TgV#Sb&k=o;8@aNKebY{EL6V!&Z@Y+=yS_D!uWG3Cr_N=<*$tuJJS-}iszlJMXPVPAC{ff(A_M0oH!NQxkMM= z(zw@V9Qzho#<6Q%JNK#1(!TR#_U&5k&+R$fLp;ontL07SyO{P&udQ+KX0a}`y1dBe zcAs$9wALl!UAlhE3U|>RA^N&qgimp<;9Kl&3~hNGwLb3oze=l6Tq%$fBHUwG#)_Tm zqiXl3h$nDSN~M;w0z7G=(f+nOBtx1!r9fV|yE5dbf_;Or-m+dJjG~M|Jn_)M&V)v= z2Z8xVNSV9Mb!RlQZ6~2pA;OCte|;>*etA0f8TWd>>^0WWWTWuIvts9?WGAej|5m+f zi>teYHa55J@y>3Br!1LWvy#o->-5^J!-Z#&Vr!iA|6*Eq7+b{$4&T`swvHo8oJogs zy!ftWiW(np8l4~G?Bj!oRCoEik!##$(uogW*5Jvm^6Vc~3AA3ykiJFIApW%fW@?wBOIa3naOdPS@NgO{L z%(M2eAGez4+nMt0YEw0wVAYI#2llFVQ4VrZ?h_xDhx23;b8uF^lrOhKn)~m#x0I(! z;~p+?P0o6jkt4GgR?T<)hyObxx*-zP{t#XG?Em(Z;%r?&{%Sn*Cp1%GM0m?J# literal 0 HcmV?d00001 diff --git a/License.mqh b/License.mqh new file mode 100644 index 0000000..3bbf485 --- /dev/null +++ b/License.mqh @@ -0,0 +1,144 @@ +//+------------------------------------------------------------------+ +//| License.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#property strict + +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ + +#define LICENSED_TRADE_MODES {ACCOUNT_TRADE_MODE_DEMO}//{ACCOUNT_TRADE_MODE_CONTEST,ACCOUNT_TRADE_MODE_DEMO} +#define LICENSED_EXPIRY_DATE D'2025.06.01' +#define LICENSED_EXPIRY_DAYS 30 +#define LICENSED_EXPIRY_DATE_START D'2025.05.01' +#define LICENSED_EXPIRY_DATE_START_COMPILE_TIME __DATETIME__ +#define LICENSED_PRIVATE_KEY "Activation Key E" + +class License +{ +protected: + string M_ProductName; + long m_AccountLogin; + int m_UserID; + datetime m_Expiry; + virtual string LicencePath(); + bool FileGen(string data); + +public: + License(); + ~License(); + + string GeneratePasscode(string data); + void ClinetProgram(string NameExpert, int UserID, datetime Expiry, long LoginAccount = -1); +}; + +License::License() +{ +} + +License::~License() +{ +} + +//+------------------------------------------------------------------+ +//| DLL imports | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| EX5 imports | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| create hash | +//+------------------------------------------------------------------+ +string License::GeneratePasscode(string data) +{ + uchar dataChar[]; + StringToCharArray( data, dataChar, 0, StringLen( data ) ); + + uchar cryptChar[]; + CryptEncode( CRYPT_HASH_SHA256, dataChar, dataChar, cryptChar ); + + uchar resCharArray[]; + ArrayResize(resCharArray, ArraySize(cryptChar)); + ArrayCopy(resCharArray, cryptChar, 0, 0, ArraySize(cryptChar)); + + uchar base64Result[]; + CryptEncode(CRYPT_BASE64, resCharArray, resCharArray, base64Result); + + string result = CharArrayToString(base64Result); + + return result; +} + +//+------------------------------------------------------------------+ +//| create file name to hash | +//+------------------------------------------------------------------+ +string License::LicencePath() {return ("License\\"+M_ProductName+"\\"+GeneratePasscode(IntegerToString(m_AccountLogin)+"_"+IntegerToString(m_UserID))+"lic");} + +//+------------------------------------------------------------------+ +//| set to name prognam, login number, expirytion, user id | +//+------------------------------------------------------------------+ +void License::ClinetProgram(string NameExpert, int UserID, datetime Expiry, long LoginAccount = -1) +{ + if(LoginAccount < 0) {LoginAccount = AccountInfoInteger(ACCOUNT_LOGIN);} + m_AccountLogin = LoginAccount; + M_ProductName = NameExpert; + m_UserID = UserID; + m_Expiry = Expiry; +} + +//+------------------------------------------------------------------+ +//| create file to hash | +//+------------------------------------------------------------------+ +bool License::FileGen(string data) +{ + string licencePath = LicencePath(); + int handle = FileOpen( licencePath, FILE_WRITE | FILE_BIN | FILE_ANSI ); + if ( handle == INVALID_HANDLE ) { + PrintFormat( "Could not create licence file %s", licencePath ); + return ( false ); + } + + return true; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MatrixNet.mqh b/MatrixNet.mqh new file mode 100644 index 0000000..1d5f676 --- /dev/null +++ b/MatrixNet.mqh @@ -0,0 +1,767 @@ +//+------------------------------------------------------------------+ +//| MatrixNet.mqh | +//| Copyright (c) 2023, Marketeer | +//| https://www.mql5.com/ru/articles/12187/ | +//+------------------------------------------------------------------+ +#include +#define PUSH(A,V) (A[ArrayResize(A, ArrayRange(A, 0) + 1, ArrayRange(A, 0) * 2) - 1] = V) + +// In your source code you can enable RPROP mode (recommended) +// by placing the following macro in front of #include +// +// #define BATCH_PROP + +//+------------------------------------------------------------------+ +//| Main class for backpropagation NN on matrices | +//+------------------------------------------------------------------+ +class MatrixNet +{ +protected: + const int n; // number of layers with weights (excluding input layer) + matrix weights[/* n */]; + matrix outputs[/* n + 1 */]; + ENUM_ACTIVATION_FUNCTION af; // default activation function for all layers + ENUM_ACTIVATION_FUNCTION of; // output layer activation function (if specified) + bool ready; + int dropOutRate; + +public: + // data stats and custom info + struct Stats + { + double bestLoss; + int bestEpoch; + int trainingSet; + int validationSet; + int epochsDone; + }; + + Stats getStats() const + { + return stats; + } + +protected: + // save best weights every time we got new minimum of loss + matrix bestWeights[]; + Stats stats; + + #ifdef BATCH_PROP + matrix speed[]; + matrix deltas[]; + #else + double speed; + #endif + + void allocate() + { + ArrayResize(weights, n); + ArrayResize(outputs, n + 1); + ArrayResize(bestWeights, n); + dropOutRate = 0; + #ifdef BATCH_PROP + ArrayResize(speed, n); + ArrayResize(deltas, n); + plus = 1.1; + minus = 0.1; + max = 50; + min = 0.0; + #endif + } + + template + struct SubArray + { + T data[]; + }; + + class DropOutState + { + SubArray indices[]; + matrix weights[]; + const int percent; + public: + DropOutState(const int p = 10 /* subject of practical selection */): percent(p) { } + + bool restoreState(matrix &parent[], const bool cleanup = true) + { + const int n = ArraySize(parent); + + if(ArraySize(weights) == n) + { + for(int i = 0; i < n; ++i) + { + for(int j = 0; j < ArraySize(indices[i].data); ++j) + { + parent[i].Flat(indices[i].data[j], weights[i].Flat(indices[i].data[j])); + } + if(cleanup) ArrayResize(indices[i].data, 0); + } + return true; + } + return false; + } + + bool switchState(matrix &parent[]) + { + const int n = ArraySize(parent); + + if(ArraySize(weights) == 0) + { + ArrayResize(weights, n); + ArrayResize(indices, n); + } + else if(!restoreState(parent)) + { + return false; + } + + for(int i = 0; i < n; ++i) + { + weights[i].Assign(parent[i]); // save current state + const int m = (int)(parent[i].Rows() * parent[i].Cols()); + int k = 0; + while(k++ < m * percent / 100) + { + const uint p = (rand() | (rand() << 16)) % m; + parent[i].Flat(p, 0); + PUSH(indices[i].data, p); + } + } + return true; + } + }; + +public: + MatrixNet(const int &layers[], const ENUM_ACTIVATION_FUNCTION f1 = AF_TANH, + const ENUM_ACTIVATION_FUNCTION f2 = AF_NONE): + ready(false), af(f1), of(f2), n(ArraySize(layers) - 1) + { + if(n < 2) return; + + allocate(); + for(int i = 1; i <= n; ++i) + { + // NB: weights are transposed, that is [row][column] hold [synapse][neuron] + weights[i - 1].Init(layers[i - 1] + 1, layers[i]); + #ifdef BATCH_PROP + speed[i - 1] = weights[i - 1]; + deltas[i - 1] = weights[i - 1]; + #endif + } + ready = true; + randomize(); + } + + MatrixNet(const matrix &w[], const ENUM_ACTIVATION_FUNCTION f1 = AF_TANH, + const ENUM_ACTIVATION_FUNCTION f2 = AF_NONE): + ready(false), af(f1), of(f2), n(ArraySize(w)) + { + if(n < 2) return; + + allocate(); + for(int i = 0; i < n; ++i) + { + weights[i] = w[i]; + #ifdef BATCH_PROP + speed[i] = weights[i]; + deltas[i] = weights[i]; + #endif + } + + ready = true; + } + + bool isReady() const + { + return ready; + } + + void enableDropOut(const uint percent = 10 /* 0 means disable */) + { + dropOutRate = (int)percent; + } + + void setActivationFunction(const ENUM_ACTIVATION_FUNCTION f1, ENUM_ACTIVATION_FUNCTION f2 = AF_NONE) + { + af = f1; + of = f2; + } + + ENUM_ACTIVATION_FUNCTION getActivationFunction(const bool output = false) const + { + return output ? of : af; + } + + bool getWeights(matrix &array[]) const + { + if(!ready) return false; + + ArrayResize(array, n); + for(int i = 0; i < n; ++i) + { + array[i] = weights[i]; + } + + return true; + } + + bool setWeights(matrix &array[]) + { + if(!ready) return false; + + if(ArraySize(array) != n) + { + PrintFormat("Number of layers mismatches: got %d, expected %d", + ArraySize(array), n); + return false; + } + + for(int i = 0; i < n; ++i) + { + if(array[i].Rows() != weights[i].Rows() + || array[i].Cols() != weights[i].Cols()) + { + PrintFormat("%d-th layer dimensions mismatch: got %dx%d, expected %dx%d", + i, array[i].Rows(), array[i].Cols(), weights[i].Rows(), weights[i].Cols()); + return false; + } + } + + ArraySwap(array, weights); + + return true; + } + + bool getBestWeights(matrix &array[]) const + { + if(!ready) return false; + if(!n || !bestWeights[0].Rows()) return false; + + ArrayResize(array, n); + for(int i = 0; i < n; ++i) + { + array[i] = bestWeights[i]; + } + + return true; + } + + // NB: change values to appropriate distribution for specific activation function + void randomize(const double from = -0.5, const double to = +0.5) + { + if(!ready) return; + + for(int i = 0; i < n; ++i) + { + weights[i].Random(from, to); + } + } + + double train(const matrix &data, const matrix &target, + const matrix &validation, const matrix &check, + const int epochs = 1000, const double accuracy = 0.001, + const ENUM_LOSS_FUNCTION lf = LOSS_MSE) + { + if(!ready) return NaN(); + + #ifdef BATCH_PROP + for(int i = 0; i < n; ++i) + { + speed[i].Fill(accuracy); // will adjust the speeds on the fly + deltas[i].Fill(0); + } + #else + speed = accuracy; + #endif + + double mse = DBL_MAX; + double msev = DBL_MAX; + double msema = 0; // averaged training MSE + double msemap = 0; // averaged training MSE on previous epoch + double msevma = 0; // averaged validation MSE + double msevmap = 0; // averaged validation MSE on previous epoch + double ema = 0; // exponentional averaging coefficient + int p = 0, grow = 0; // ema period + const int scale = (int)(data.Rows() / (validation.Rows() + 1)) + 1; + + p = (int)sqrt(epochs); // FIXME: rule of thumb - reconsider as appropriate + ema = 2.0 / (p + 1); + PrintFormat("EMA for early stopping: %d (%f)", p, ema); + + stats.bestLoss = DBL_MAX; + stats.bestEpoch = -1; + + DropOutState state(dropOutRate); + + int ep = 0; + for(; ep < epochs; ep++) + { + // NB: on each epoch entire dataset is processed as is, + // no batches or shuffling - implement yourself + if(validation.Rows() && check.Rows()) + { + // if validation is enabled, run it before normal/training pass + msev = test(validation, check, lf); + // smooth error stat through epochs + msevma = (msevma ? msevma : msev) * (1 - ema) + ema * msev; + } + + if(dropOutRate > 0) + { + state.restoreState(weights); + } + + mse = test(data, target, lf); // invokes feedForward(data) + msema = (msema ? msema : mse) * (1 - ema) + ema * mse; + + const double candidate = (msev != DBL_MAX) ? msev : mse; + if(candidate < stats.bestLoss) + { + stats.bestLoss = candidate; + stats.bestEpoch = ep; + // get all 'weights' (which can be partially dropped) into 'bestWeights' + for(int i = 0; i < n; ++i) + { + bestWeights[i].Assign(weights[i]); + } + } + + if(!progress(ep, epochs, mse, msev, msema, msevma)) + { + PrintFormat("Interrupted by user at epoch %d", ep); + break; + } + + if(!MathIsValidNumber(mse)) + { + PrintFormat("NaN at epoch %d", ep); + break; // will return NaN as error indication + } + + if(ep > p && candidate > stats.bestLoss * 10) + { + PrintFormat("Too big errors at epoch %d", ep); + break; + } + + if(msema > msemap) + { + if(++grow > p) + { + PrintFormat("Stop by growing error at epoch %d", ep); + break; + } + } + else + { + grow = 0; + } + + if(msevmap != 0 && ep > p && msevma > msevmap + scale * (msemap - msema)) + { + // skip first p epochs to accumulate values for smoothing + PrintFormat("Stop by validation at %d, v: %f > %f, t: %f vs %f", ep, msevma, msevmap, msema, msemap); + break; + } + + msevmap = msevma; + msemap = msema; + + if(mse <= accuracy) + { + PrintFormat("Done by accuracy limit %f at epoch %d", accuracy, ep); + break; + } + + if(dropOutRate > 0) + { + state.switchState(weights); + } + + if(!backProp(target)) + { + mse = NaN(); // error flag + break; + } + } + + if(ep == epochs) + { + PrintFormat("Done by epoch limit %d with accuracy %f", ep, mse); + } + + stats.trainingSet = (int)data.Rows(); + stats.validationSet = (int)validation.Rows(); + stats.epochsDone = ep; + + if(dropOutRate > 0) state.restoreState(weights); + return mse; + } + + double train(const matrix &data, const matrix &target, + const int epochs = 1000, const double accuracy = 0.001, + const ENUM_LOSS_FUNCTION lf = LOSS_MSE) + { + matrix dummy = {}, fake = {}; + return train(data, target, dummy, fake, epochs, accuracy, lf); + } + + virtual bool progress(const int epoch, const int total, + const double error, const double valid = DBL_MAX, + const double ma = DBL_MAX, const double mav = DBL_MAX) + { + static uint trap; + if(GetTickCount() > trap) // by default log every second + { + PrintFormat("Epoch %d of %d, loss %.5f%s%s%s", epoch, total, error, + ma == DBL_MAX ? "" : StringFormat(" ma(%.5f)", ma), + valid == DBL_MAX ? "" : StringFormat(", validation %.5f", valid), + valid == DBL_MAX ? "" : StringFormat(" v.ma(%.5f)", mav)); + trap = GetTickCount() + 1000; + } + return !IsStopped(); // true keeps running, false will break the training loop + } + + bool feedForward(const matrix &data) + { + if(!ready) return false; + + if(data.Cols() != weights[0].Rows() - 1) + { + PrintFormat("Column number in data %d <> Inputs layer size %d", + data.Cols(), weights[0].Rows() - 1); + return false; + } + + outputs[0] = data; + for(int i = 0; i < n; ++i) + { + // extend each layer with 1 neuron for bias (except for the last layer) + if(!outputs[i].Resize(outputs[i].Rows(), weights[i].Rows()) || + !outputs[i].Col(vector::Ones(outputs[i].Rows()), weights[i].Rows() - 1)) + return false; + // propagate signal from i-th layer to (i+1)-th layer + matrix temp = outputs[i].MatMul(weights[i]); + if(!temp.Activation(outputs[i + 1], i < n - 1 ? af : of)) + return false; + } + + return true; + } + + matrix getResults(const int layer = -1) const + { + static const matrix empty = {}; + if(!ready) return empty; + + if(layer == -1) return outputs[n]; + if(layer < -1 || layer > n) return empty; + + return outputs[layer]; + } + + /* + + LEGEND for error (loss) backpropagation + + last layer: + loss = (y - t) * derivative(y) + other layers: + loss = loss[y[+1]] * w'[y[+1]] * derivative(y) + update: + weight += niu * loss * y[-1] + + where y is a neuron state in current layer, or + a reference to connected neuron + from previous layer y[-1] or next layer y[+1] + + NB: lines marked by //* comprise a bugfix released after the article: + it turned out that the method Derivative() accepts input values of activation functions, + not output values of activation functions as it was initially supposed + + */ + bool backProp(const matrix &target) + { + if(!ready) return false; + + if(target.Rows() != outputs[n].Rows() || + target.Cols() != outputs[n].Cols()) + return false; + + // output layer + matrix temp; + //*if(!outputs[n].Derivative(temp, of)) + //* return false; + if(!outputs[n - 1].MatMul(weights[n - 1]).Derivative(temp, of)) + return false; + matrix loss = (outputs[n] - target) * temp; // data record per row + + for(int i = n - 1; i >= 0; --i) // for each layer except output + { + //*// remove unusable pseudo-errors for neurons, added as constant bias source + //*// (in all layers except for the last (where it wasn't added)) + //*if(i < n - 1) loss.Resize(loss.Rows(), loss.Cols() - 1); + #ifdef BATCH_PROP + matrix delta = speed[i] * outputs[i].Transpose().MatMul(loss); + adjustSpeed(speed[i], delta * deltas[i]); + deltas[i] = delta; + #else + matrix delta = speed * outputs[i].Transpose().MatMul(loss); + #endif + + // NB: i-th index in outputs[] corresponds to + // the layer of neurons defined by (i-1)-th index in weights[], + // because input layer (outputs[0]) does not have weights, + // in other words, weights[0] produce outputs[1], + // weights[1] produce outputs[2], etc. + + //*if(!outputs[i].Derivative(temp, af)) + //* return false; + //*loss = loss.MatMul(weights[i].Transpose()) * temp; + if(i > 0) // backpropagate loss to previous layers + { + if(!outputs[i - 1].MatMul(weights[i - 1]).Derivative(temp, af)) + return false; + matrix mul = loss.MatMul(weights[i].Transpose()); + // remove unusable pseudo-errors for neurons, added as constant bias source + // (in all layers except for the last (where it wasn't added)) + mul.Resize(mul.Rows(), mul.Cols() - 1); + loss = mul * temp; + } + + weights[i] -= delta; + } + return true; + } + + double test(const matrix &data, const matrix &target, const ENUM_LOSS_FUNCTION lf = LOSS_MSE) + { + if(!ready || !feedForward(data)) return NaN(); + + return outputs[n].Loss(target, lf); + } + + static double NaN() // used to signal an error packed in double + { + return MathArcsin(2.0); // usefull to trace a problem via breakpoint + } + + #ifdef BATCH_PROP + + void setupSpeedAdjustment(const double up, const double down, + const double high, const double low) + { + plus = up; + minus = down; + max = high; + min = low; + } + +protected: + double plus; + double minus; + double max; + double min; + + void adjustSpeed(matrix &subject, const matrix &product) + { + for(int i = 0; i < (int)product.Rows(); ++i) + { + for(int j = 0; j < (int)product.Cols(); ++j) + { + if(product[i][j] > 0) + { + subject[i][j] *= plus; + if(subject[i][j] > max) subject[i][j] = max; + } + else if(product[i][j] < 0) + { + subject[i][j] *= minus; + if(subject[i][j] < min) subject[i][j] = min; + } + } + } + } + #endif +}; + +//+------------------------------------------------------------------+ +//| Helper custom graphic with published work area | +//+------------------------------------------------------------------+ +class CGraphicView: public CGraphic +{ +public: + int getRight() const + { + return m_right; + } + int getLeft() const + { + return m_left; + } + int getTop() const + { + return m_up; + } + int getBottom() const + { + return m_down; + } +}; + +//+-------------------------------------------------------------------+ +//| Backpropagation NN on matrices with visualization of MSE progress | +//+-------------------------------------------------------------------+ +class MatrixNetVisual: public MatrixNet +{ + CGraphicView graphic; + CCurve *c[5]; + double p[], x[], y[], z[], q[], b[]; + const string objname; + const double nan; + double amplitude; + + // prepare chart object for drawing + void graph() + { + ulong width = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); + ulong height = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS); + + bool res = false; + if(ObjectFind(0, objname) >= 0) + res = graphic.Attach(0, objname); + else + res = graphic.Create(0, objname, 0, 0, 0, (int)(width - 0), (int)(height - 0)); + if(!res) + return; + + c[0] = graphic.CurveAdd(p, x, CURVE_LINES, "Training"); + c[1] = graphic.CurveAdd(p, y, CURVE_LINES, "Validation"); + c[2] = graphic.CurveAdd(p, z, CURVE_LINES, "Val.EMA"); + c[3] = graphic.CurveAdd(p, q, CURVE_LINES, "Train.EMA"); + c[4] = graphic.CurveAdd(p, b, CURVE_POINTS, "Best/Minimum"); + ArrayResize(b, 1); + amplitude = 0; + graphic.XAxis().AutoScale(false); + graphic.YAxis().AutoScale(false); + } + + void plot() + { + c[0].Update(p, x); + c[1].Update(p, y); + c[2].Update(p, z); + c[3].Update(p, q); + double point[1] = {stats.bestEpoch}; + b[0] = stats.bestLoss; + c[4].Update(point, b); + + const int size = ArraySize(p) - 1; + graphic.CalculateMaxMinValues(); + graphic.XAxis().Min(0); + graphic.YAxis().Min(0); + // find max values on the fly at every last added point + const double range = y[size] != DBL_MAX ? MathMax(y[size], x[size]) : x[size]; + if(range > amplitude) + { + amplitude = range; + + double ystep = MathPow(10, MathCeil(MathLog10(amplitude))) / 20; + if(ystep != 0 && amplitude / ystep < 5) ystep /= 2; + graphic.YAxis().Max(ystep != 0 ? ystep * (MathCeil(amplitude / ystep)) : 1); + graphic.YAxis().DefaultStep(ystep); + } + + double xstep = MathPow(10, MathCeil(MathLog10(p[size]))) / 20; + if(xstep != 0 && p[size] / xstep < 5) xstep /= 2; + graphic.XAxis().Max(xstep != 0 ? xstep * (MathCeil(p[size] / xstep)) : 1); + graphic.XAxis().DefaultStep(xstep); + + graphic.CurvePlotAll(); + graphic.TextAdd(graphic.Width() - graphic.getRight() - 5, graphic.getTop() + 5, + "MSE error (Loss) by Epoch (Cycle)", clrBlack, TA_RIGHT | TA_TOP); + graphic.Update(); + } + +public: + MatrixNetVisual(const int &layers[], const ENUM_ACTIVATION_FUNCTION f1 = AF_TANH, + const ENUM_ACTIVATION_FUNCTION f2 = AF_NONE): MatrixNet(layers, f1, f2), objname("BPNNERROR"), nan(NaN()) + { + graph(); + } + + MatrixNetVisual(const matrix &w[], const ENUM_ACTIVATION_FUNCTION f1 = AF_TANH, + const ENUM_ACTIVATION_FUNCTION f2 = AF_NONE): MatrixNet(w, f1, f2), objname("BPNNERROR"), nan(NaN()) + { + graph(); + } + + ~MatrixNetVisual() + { + if(!MQLInfoInteger(MQL_TESTER)) + { + graphic.Destroy(); + } + } + + CGraphicView *view() const + { + return (CGraphicView *)&graphic; + } + + virtual bool progress(const int epoch, const int total, + const double error, const double valid = DBL_MAX, + const double ma = DBL_MAX, const double mav = DBL_MAX) override + { + // accumulate and draw graph of error, valid, ma values + PUSH(p, epoch); + PUSH(x, error); + if(valid != DBL_MAX) PUSH(y, valid); else PUSH(y, nan); + if(ma != DBL_MAX) PUSH(q, ma); else PUSH(q, nan); + if(mav != DBL_MAX) PUSH(z, mav); else PUSH(z, nan); + plot(); + + return MatrixNet::progress(epoch, total, error, valid, ma, mav); + } +}; + +/* EXAMPLE: + +bool CreateData(matrix &data, matrix &target, const int count) +{ + if(!data.Init(count, 3) || !target.Init(count, 1)) return false; + data.Random(-10, 10); + vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(2), 2); + vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2); + if(!target.Col(X1 / X2 / 3, 0)) return false; + return true; +} + +void OnStart() +{ + const int layers[] = {3, 21, 15, 1}; + MatrixNetVisual net(layers); + matrix data, target; + CreateData(data, target, 100); + matrix valid, test; + CreateData(valid, test, 25); + + // NB: in practice you should normalize and clean up data from outliers + // before training (here we generate artificially ideal data) + + Print(net.train(data, target, valid, test, 1000, 0.0001)); + //Print(net.train(data, target, 1000, 0.00001)); + matrix w[]; + if(net.getBestWeights(w)) + { + // for(int i = 0; i < ArraySize(w); ++i) Print(w[i]); // debug + MatrixNet net2(w); + if(net2.isReady()) + { + Print("Copy: ", net2.test(data, target)); + } + } +} +*/ +//+-------------------------------------------------------------------+ diff --git a/MatrixNetStore.mqh b/MatrixNetStore.mqh new file mode 100644 index 0000000..350c43f --- /dev/null +++ b/MatrixNetStore.mqh @@ -0,0 +1,116 @@ +//+------------------------------------------------------------------+ +//| MatrixNetStore.mqh | +//| Copyright (c) 2023, Marketeer | +//| https://www.mql5.com/ru/articles/12187/ | +//+------------------------------------------------------------------+ +#include "MatrixNet.mqh" + +//+------------------------------------------------------------------+ +//| General storage interface for custom data | +//+------------------------------------------------------------------+ +class Storage +{ +public: + virtual bool store(const int h) = 0; + virtual bool restore(const int h) = 0; +}; + +//+-----------------------------------------------------------------------+ +//| MatrixNet writer/reader with the storage interface invocation. | +//| By default handles all internal data of NN (structure, size, weights) | +//+-----------------------------------------------------------------------+ +class MatrixNetStore +{ + static string signature; +public: + void static setSignature(const string s) + { + signature = s; + } + + string static getSignature() + { + return signature; + } + + template // M is a MatrixNet + static M *load(const string filename, Storage *storage = NULL, const int flags = 0) + { + int h = FileOpen(filename, FILE_READ | FILE_BIN | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_ANSI | flags); + if(h == INVALID_HANDLE) return NULL; + + const string header = FileReadString(h, StringLen(signature)); + if(header != signature) + { + FileClose(h); + Print("Incorrect file header"); + return NULL; + } + + const ENUM_ACTIVATION_FUNCTION f1 = (ENUM_ACTIVATION_FUNCTION)FileReadInteger(h); + const ENUM_ACTIVATION_FUNCTION f2 = (ENUM_ACTIVATION_FUNCTION)FileReadInteger(h); + const int size = FileReadInteger(h); + matrix w[]; + ArrayResize(w, size); + for(int i = 0; i < size; ++i) + { + const int rows = FileReadInteger(h); + const int cols = FileReadInteger(h); + double a[]; + FileReadArray(h, a, 0, rows * cols); + w[i].Swap(a); + w[i].Reshape(rows, cols); + } + + if(storage) + { + if(!storage.restore(h)) Print("External info wasn't read"); + } + + M *m = new M(w, f1, f2); + + FileClose(h); + return m; + } + + template // M is a MatrixNet + static bool save(const string filename, const M &net, Storage *storage = NULL, const int flags = 0) + { + matrix w[]; + if(!net.getBestWeights(w)) + { + if(!net.getWeights(w)) + { + return false; + } + } + + int h = FileOpen(filename, FILE_WRITE | FILE_BIN | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_ANSI | flags); + if(h == INVALID_HANDLE) return false; + + FileWriteString(h, signature); + FileWriteInteger(h, net.getActivationFunction()); + FileWriteInteger(h, net.getActivationFunction(true)); + FileWriteInteger(h, ArraySize(w)); + for(int i = 0; i < ArraySize(w); ++i) + { + matrix m = w[i]; + FileWriteInteger(h, (int)m.Rows()); + FileWriteInteger(h, (int)m.Cols()); + double a[]; + m.Swap(a); + FileWriteArray(h, a); + } + + if(storage) + { + if(!storage.store(h)) Print("External info wasn't saved"); + } + + FileClose(h); + return true; + } +}; + +static string MatrixNetStore::signature = "BPNNMS/1.0"; +//+-----------------------------------------------------------------------+ diff --git a/MovingAverages.mqh b/MovingAverages.mqh new file mode 100644 index 0000000..7381ec3 --- /dev/null +++ b/MovingAverages.mqh @@ -0,0 +1,317 @@ +//+------------------------------------------------------------------+ +//| MovingAverages.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Simple Moving Average | +//+------------------------------------------------------------------+ +double SimpleMA(const int position,const int period,const double &price[]) + { + double result=0.0; +//--- check period + if(period>0 && period<=(position+1)) + { + for(int i=0; i0) + { + double pr=2.0/(period+1.0); + result=price[position]*pr+prev_value*(1-pr); + } + + return(result); + } +//+------------------------------------------------------------------+ +//| Smoothed Moving Average | +//+------------------------------------------------------------------+ +double SmoothedMA(const int position,const int period,const double prev_value,const double &price[]) + { + double result=0.0; +//--- check period + if(period>0 && period<=(position+1)) + { + if(position==period-1) + { + for(int i=0; i0 && period<=(position+1)) + { + double sum =0.0; + int wsum=0; + + for(int i=period; i>0; i--) + { + wsum+=i; + sum +=price[position-i+1]*(period-i+1); + } + + result=sum/wsum; + } + + return(result); + } +//+------------------------------------------------------------------+ +//| Simple moving average on price array | +//+------------------------------------------------------------------+ +int SimpleMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[]) + { +//--- check period + if(period<=1 || period>(rates_total-begin)) + return(0); +//--- save as_series flags + bool as_series_price=ArrayGetAsSeries(price); + bool as_series_buffer=ArrayGetAsSeries(buffer); + + ArraySetAsSeries(price,false); + ArraySetAsSeries(buffer,false); +//--- calculate start position + int start_position; + + if(prev_calculated==0) // first calculation or number of bars was changed + { + //--- set empty value for first bars + start_position=period+begin; + + for(int i=0; i(rates_total-begin)) + return(0); +//--- save and clear 'as_series' flags + bool as_series_price=ArrayGetAsSeries(price); + bool as_series_buffer=ArrayGetAsSeries(buffer); + + ArraySetAsSeries(price,false); + ArraySetAsSeries(buffer,false); +//--- calculate start position + int start_position; + double smooth_factor=2.0/(1.0+period); + + if(prev_calculated==0) // first calculation or number of bars was changed + { + //--- set empty value for first bars + for(int i=0; i(rates_total-begin)) + return(0); +//--- save as_series flags + bool as_series_price=ArrayGetAsSeries(price); + bool as_series_buffer=ArrayGetAsSeries(buffer); + + ArraySetAsSeries(price,false); + ArraySetAsSeries(buffer,false); +//--- calculate start position + int i,start_position; + + if(prev_calculated<=period+begin+2) // first calculation or number of bars was changed + { + //--- set empty value for first bars + start_position=period+begin; + + for(i=0; i(rates_total-begin)) + return(0); +//--- save as_series flags + bool as_series_price=ArrayGetAsSeries(price); + bool as_series_buffer=ArrayGetAsSeries(buffer); + + ArraySetAsSeries(price,false); + ArraySetAsSeries(buffer,false); +//--- calculate start position + int start_position; + + if(prev_calculated==0) // first calculation or number of bars was changed + { + //--- set empty value for first bars + start_position=period+begin; + + for(int i=0; i(rates_total-begin)) + return(0); +//--- save as_series flags + bool as_series_price=ArrayGetAsSeries(price); + bool as_series_buffer=ArrayGetAsSeries(buffer); + + ArraySetAsSeries(price,false); + ArraySetAsSeries(buffer,false); +//--- calculate start position + int start_position; + + if(prev_calculated==0) // first calculation or number of bars was changed + { + //--- set empty value for first bars + start_position=period+begin; + + for(int i=0; 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

V(-+tZ|_rz+rCuh*l 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 JxoCOU{|7BnUYY;^ literal 0 HcmV?d00001 diff --git a/TradeAlgorithms.mqh b/TradeAlgorithms.mqh new file mode 100644 index 0000000..508b6e8 --- /dev/null +++ b/TradeAlgorithms.mqh @@ -0,0 +1,1592 @@ +//+------------------------------------------------------------------+ +//| TradeAlgorithms.mqh | +//| Copyright © 2013, Nikolay Kositsin | +//| Khabarovsk, farria@mail.redcom.ru | +//+------------------------------------------------------------------+ +//| Торговые алгоритмы для брокеров предлагающих не нулевой спред! | +//+------------------------------------------------------------------+ +#property copyright "2013, Nikolay Kositsin" +#property link "farria@mail.redcom.ru" +#property version "1.21" +//+------------------------------------------------------------------+ +//| Перечисление для вариантов расчёта лота | +//+------------------------------------------------------------------+ +enum MarginMode //Тип константы для переменной Margin_Mode торговых функций + { + FREEMARGIN=0, //MM от свободных средств на счёте + BALANCE, //MM от баланса средств на счёте + LOSSFREEMARGIN, //MM по убыткам от свободных средств на счёте + LOSSBALANCE, //MM по убыткам от баланса средств на счёте + LOT //Лот без изменения + }; +//+------------------------------------------------------------------+ +//| Алгоритм определения момента появления нового бара | +//+------------------------------------------------------------------+ +class CIsNewBar + { + //---- +public: + //---- функция определения момента появления нового бара + bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe) + { + //---- получим время появления текущего бара + datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE)); + + if(TNew!=m_TOld && TNew) // проверка на появление нового бара + { + m_TOld=TNew; + return(true); // появился новый бар! + } + //---- + return(false); // новых баров пока нет! + }; + + //---- конструктор класса + CIsNewBar(){m_TOld=-1;}; + +protected: datetime m_TOld; + //---- + }; +//+==================================================================+ +//| Алгоритмы для торговых операций | +//+==================================================================+ + +//+------------------------------------------------------------------+ +//| Открываем длинную позицию | +//+------------------------------------------------------------------+ +bool BuyPositionOpen +( + bool &BUY_Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + const datetime &TimeLevel, // время, после которого будет осуществлена следущая сделка после текущей + double Money_Management, // MM + int Margin_Mode, // способ расчёта величины лота + uint deviation, // слиппаж + int StopLoss, // стоплосс в пунктах + int Takeprofit // тейкпрофит в пунктах + ) +//BuyPositionOpen(BUY_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit); + { +//---- + if(!BUY_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_BUY; +//---- Проверка на истечение временного лимита для предыдущей сделки и полноты объёма + if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true); + +//---- Проверка на на наличие открытой позиции + if(PositionSelect(symbol)) return(true); + +//---- + double volume=BuyLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation); + if(volume<=0) + { + Print(__FUNCTION__,"(): Неверный объём для структуры торгового запроса"); + return(false); + } + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + + long digit; + double point,Ask; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true); + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания BUY позиции + request.type = ORDER_TYPE_BUY; + request.price = Ask; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + +//---- Определение расстояния до стоплосса в единицах ценового графика + if(StopLoss) + { + if(!StopCorrect(symbol,StopLoss))return(false); + double dStopLoss=StopLoss*point; + request.sl=NormalizeDouble(request.price-dStopLoss,int(digit)); + } + else request.sl=0.0; + +//---- Определение расстояния до тейкпрофита единицах ценового графика + if(Takeprofit) + { + if(!StopCorrect(symbol,Takeprofit))return(false); + double dTakeprofit=Takeprofit*point; + request.tp=NormalizeDouble(request.price+dTakeprofit,int(digit)); + } + else request.tp=0.0; + +//---- + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } + + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Открываем Buy позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Открываем BUY позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + TradeTimeLevelSet(symbol,PosType,TimeLevel); + BUY_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy позиция по ",symbol," открыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Открываем короткую позицию | +//+------------------------------------------------------------------+ +bool SellPositionOpen +( + bool &SELL_Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + const datetime &TimeLevel, // время, после которого будет осуществлена следущая сделка после текущей + double Money_Management, // MM + int Margin_Mode, // способ расчёта величины лота + uint deviation, // слиппаж + int StopLoss, // стоплосс в пунктах + int Takeprofit // тейкпрофит в пунктах + ) +//SellPositionOpen(SELL_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit); + { +//---- + if(!SELL_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL; +//---- Проверка на истечение временного лимита для предыдущей сделки и полноты объёма + if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true); + +//---- Проверка на на наличие открытой позиции + if(PositionSelect(symbol)) return(true); + +//---- + double volume=SellLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation); + if(volume<=0) + { + Print(__FUNCTION__,"(): Неверный объём для структуры торгового запроса"); + return(false); + } + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + + long digit; + double point,Bid; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_BID,Bid)) return(true); + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания SELL позиции + request.type = ORDER_TYPE_SELL; + request.price = Bid; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + +//---- Определение расстояния до стоплосса в единицах ценового графика + if(StopLoss!=0) + { + if(!StopCorrect(symbol,StopLoss))return(false); + double dStopLoss=StopLoss*point; + request.sl=NormalizeDouble(request.price+dStopLoss,int(digit)); + } + else request.sl=0.0; + +//---- Определение расстояния до тейкпрофита единицах ценового графика + if(Takeprofit!=0) + { + if(!StopCorrect(symbol,Takeprofit))return(false); + double dTakeprofit=Takeprofit*point; + request.tp=NormalizeDouble(request.price-dTakeprofit,int(digit)); + } + else request.tp=0.0; +//---- + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } + + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Открываем Sell позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Открываем SELL позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + TradeTimeLevelSet(symbol,PosType,TimeLevel); + SELL_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Sell позиция по ",symbol," открыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Открываем длинную позицию | +//+------------------------------------------------------------------+ +bool BuyPositionOpen +( + bool &BUY_Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + const datetime &TimeLevel, // время, после которого будет осуществлена следущая сделка после текущей + double Money_Management, // MM + int Margin_Mode, // способ расчёта величины лота + uint deviation, // слиппаж + double dStopLoss, // стоплосс в единицах ценового графика + double dTakeprofit // тейкпрофит в единицах ценового графика + ) +//BuyPositionOpen(BUY_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit); + { +//---- + if(!BUY_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_BUY; +//---- Проверка на истечение временного лимита для предыдущей сделки и полноты объёма + if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true); + +//---- Проверка на на наличие открытой позиции + if(PositionSelect(symbol)) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + + long digit; + double point,Ask; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true); + +//---- коррекция расстояний до стоплосса и тейкпрофита в единицах ценового графика + if(!dStopCorrect(symbol,dStopLoss,dTakeprofit,PosType)) return(false); + int StopLoss=int((Ask-dStopLoss)/point); +//---- + double volume=BuyLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation); + if(volume<=0) + { + Print(__FUNCTION__,"(): Неверный объём для структуры торгового запроса"); + return(false); + } + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания BUY позиции + request.type = ORDER_TYPE_BUY; + request.price = Ask; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + request.sl=dStopLoss; + request.tp=dTakeprofit; + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } + + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Открываем Buy позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Открываем BUY позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + TradeTimeLevelSet(symbol,PosType,TimeLevel); + BUY_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy позиция по ",symbol," открыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Открываем короткую позицию | +//+------------------------------------------------------------------+ +bool SellPositionOpen +( + bool &SELL_Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + const datetime &TimeLevel, // время, после которого будет осуществлена следущая сделка после текущей + double Money_Management, // MM + int Margin_Mode, // способ расчёта величины лота + uint deviation, // слиппаж + double dStopLoss, // стоплосс в единицах ценового графика + double dTakeprofit // тейкпрофит в единицах ценового графика + ) +//SellPositionOpen(SELL_Signal,symbol,TimeLevel,Money_Management,deviation,Margin_Mode,StopLoss,Takeprofit); + { +//---- + if(!SELL_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL; +//---- Проверка на истечение временного лимита для предыдущей сделки и полноты объёма + if(!TradeTimeLevelCheck(symbol,PosType,TimeLevel)) return(true); + +//---- Проверка на на наличие открытой позиции + if(PositionSelect(symbol)) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + + long digit; + double point,Bid; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_BID,Bid)) return(true); + +//---- коррекция расстояний до стоплосса и тейкпрофита в единицах ценового графика + if(!dStopCorrect(symbol,dStopLoss,dTakeprofit,PosType)) return(false); + int StopLoss=int((dStopLoss-Bid)/point); +//---- + double volume=SellLotCount(symbol,Money_Management,Margin_Mode,StopLoss,deviation); + if(volume<=0) + { + Print(__FUNCTION__,"(): Неверный объём для структуры торгового запроса"); + return(false); + } + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания SELL позиции + request.type = ORDER_TYPE_SELL; + request.price = Bid; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): OrderCheck(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } + + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Открываем Sell позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Открываем SELL позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): OrderSend(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + TradeTimeLevelSet(symbol,PosType,TimeLevel); + SELL_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Sell позиция по ",symbol," открыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): OrderSend(): Невозможно совершить сделку!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Закрываем длинную позицию | +//+------------------------------------------------------------------+ +bool BuyPositionClose +( + bool &Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + uint deviation // слиппаж + ) + { +//---- + if(!Signal) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + +//---- Проверка на наличие открытой BUY позиции + if(PositionSelect(symbol)) + { + if(PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_BUY) return(false); + } + else return(false); + + double MaxLot,volume,Bid; +//---- получение данных для расчёта + if(!PositionGetDouble(POSITION_VOLUME,volume)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_BID,Bid)) return(true); + +//---- проверка лота на максимальное допустимое значение + if(volume>MaxLot) volume=MaxLot; + +//---- Инициализация структуры торгового запроса MqlTradeRequest для закрывания BUY позиции + request.type = ORDER_TYPE_SELL; + request.price = Bid; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + request.sl = 0.0; + request.tp = 0.0; + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } +//---- + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Закрываем Buy позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Отправка приказа на закрывание позиции на торговый сервер + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно закрыть позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy позиция по ",symbol," закрыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно закрыть позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Закрываем короткую позицию | +//+------------------------------------------------------------------+ +bool SellPositionClose +( + bool &Signal, // флаг разрешения на сделку + const string symbol, // торговая пара сделки + uint deviation // слиппаж + ) + { +//---- + if(!Signal) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + +//---- Проверка на наличие открытой SELL позиции + if(PositionSelect(symbol)) + { + if(PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL)return(false); + } + else return(false); + + double MaxLot,volume,Ask; +//---- получение данных для расчёта + if(!PositionGetDouble(POSITION_VOLUME,volume)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true); + +//---- проверка лота на максимальное допустимое значение + if(volume>MaxLot) volume=MaxLot; + +//---- Инициализация структуры торгового запроса MqlTradeRequest для закрывания SELL позиции + request.type = ORDER_TYPE_BUY; + request.price = Ask; + request.action = TRADE_ACTION_DEAL; + request.symbol = symbol; + request.volume = volume; + request.sl = 0.0; + request.tp = 0.0; + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } +//---- + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Закрываем Sell позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Отправка приказа на закрывание позиции на торговый сервер + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно закрыть позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + Signal=false; + } + else + { + Print(__FUNCTION__,"(): Невозможно закрыть позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Sell позиция по ",symbol," закрыта ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Модифицируем длинную позицию | +//+------------------------------------------------------------------+ +bool BuyPositionModify +( + bool &Modify_Signal, // флаг разрешения модификации + const string symbol, // торговая пара сделки + uint deviation, // слиппаж + int StopLoss, // стоплосс в пунктах + int Takeprofit // тейкпрофит в пунктах + ) +//BuyPositionModify(Modify_Signal,symbol,deviation,StopLoss,Takeprofit); + { +//---- + if(!Modify_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_BUY; + +//---- Проверка на на наличие открытой позиции + if(!PositionSelect(symbol)) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; + +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); + + long digit; + double point,Ask; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true); + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания BUY позиции + request.type = ORDER_TYPE_BUY; + request.price = Ask; + request.action = TRADE_ACTION_SLTP; + request.symbol = symbol; + +//---- Определение расстояния до стоплосса в единицах ценового графика + if(StopLoss) + { + if(!StopCorrect(symbol,StopLoss))return(false); + double dStopLoss=StopLoss*point; + request.sl=NormalizeDouble(request.price-dStopLoss,int(digit)); + if(request.sl>>"); + Print(comment); + +//---- Модифицируем BUY позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно модифицировать позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + Modify_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy позиция по ",symbol," модифицирована ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно модифицировать позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| Модифицируем короткую позицию | +//+------------------------------------------------------------------+ +bool SellPositionModify +( + bool &Modify_Signal, // флаг разрешения модификации + const string symbol, // торговая пара сделки + uint deviation, // слиппаж + int StopLoss, // стоплосс в пунктах + int Takeprofit // тейкпрофит в пунктах + ) +//SellPositionModify(Modify_Signal,symbol,deviation,StopLoss,Takeprofit); + { +//---- + if(!Modify_Signal) return(true); + + ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL; + +//---- Проверка на на наличие открытой позиции + if(!PositionSelect(symbol)) return(true); + +//---- Объявление структур торгового запроса и результата торгового запроса + MqlTradeRequest request; + MqlTradeResult result; + +//---- Объявление структуры результата проверки торгового запроса + MqlTradeCheckResult check; + +//---- обнуление структур + ZeroMemory(request); + ZeroMemory(result); + ZeroMemory(check); +//---- + long digit; + double point,Bid; +//---- + if(!SymbolInfoInteger(symbol,SYMBOL_DIGITS,digit)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point)) return(true); + if(!SymbolInfoDouble(symbol,SYMBOL_BID,Bid)) return(true); + +//---- Инициализация структуры торгового запроса MqlTradeRequest для открывания BUY позиции + request.type = ORDER_TYPE_SELL; + request.price = Bid; + request.action = TRADE_ACTION_SLTP; + request.symbol = symbol; + +//---- Определение расстояния до стоплосса в единицах ценового графика + if(StopLoss!=0) + { + if(!StopCorrect(symbol,StopLoss))return(false); + double dStopLoss=StopLoss*point; + request.sl=NormalizeDouble(request.price+dStopLoss,int(digit)); + double laststop=PositionGetDouble(POSITION_SL); + if(request.sl>laststop && laststop) request.sl=PositionGetDouble(POSITION_SL); + } + else request.sl=PositionGetDouble(POSITION_SL); + +//---- Определение расстояния до тейкпрофита единицах ценового графика + if(Takeprofit!=0) + { + if(!StopCorrect(symbol,Takeprofit))return(false); + double dTakeprofit=Takeprofit*point; + request.tp=NormalizeDouble(request.price-dTakeprofit,int(digit)); + double lasttake=PositionGetDouble(POSITION_TP); + if(request.tp>lasttake && lasttake) request.tp=PositionGetDouble(POSITION_TP); + } + else request.tp=PositionGetDouble(POSITION_TP); + +//---- + if(request.tp==PositionGetDouble(POSITION_TP) && request.sl==PositionGetDouble(POSITION_SL)) return(true); + request.deviation=deviation; + request.type_filling=ORDER_FILLING_FOK; + +//---- Проверка торгового запроса на корректность + if(!OrderCheck(request,check)) + { + Print(__FUNCTION__,"(): Неверные данные для структуры торгового запроса!"); + Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode)); + return(false); + } + + string comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Модифицируем Sell позицию по ",symbol," ============ >>>"); + Print(comment); + +//---- Модифицируем SELL позицию и делаем проверку результата торгового запроса + if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE) + { + Print(__FUNCTION__,"(): Невозможно модифицировать позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + return(false); + } + else + if(result.retcode==TRADE_RETCODE_DONE) + { + Modify_Signal=false; + comment=""; + StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Sell позиция по ",symbol," модифицирована ============ >>>"); + Print(comment); + PlaySound("ok.wav"); + } + else + { + Print(__FUNCTION__,"(): Невозможно модифицировать позицию!"); + Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode)); + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| GetTimeLevelName() function | +//+------------------------------------------------------------------+ +string GetTimeLevelName(string symbol,ENUM_POSITION_TYPE trade_operation) + { +//---- + string G_Name_; +//---- + if(MQL5InfoInteger(MQL5_TESTING) + || MQL5InfoInteger(MQL5_OPTIMIZATION) + || MQL5InfoInteger(MQL5_DEBUGGING)) + StringConcatenate(G_Name_,"TimeLevel_",AccountInfoInteger(ACCOUNT_LOGIN),"_",symbol,"_",trade_operation,"_Test_"); + else StringConcatenate(G_Name_,"TimeLevel_",AccountInfoInteger(ACCOUNT_LOGIN),"_",symbol,"_",trade_operation); +//---- + return(G_Name_); + } +//+------------------------------------------------------------------+ +//| TradeTimeLevelCheck() function | +//+------------------------------------------------------------------+ +bool TradeTimeLevelCheck +( + string symbol, + ENUM_POSITION_TYPE trade_operation, + datetime TradeTimeLevel + ) + { +//---- + if(TradeTimeLevel>0) + { + //---- Проверка на истечение временного лимита для предыдущей сделки + if(TimeCurrent()ExtrStop && dStopLoss) dStopLoss=ExtrStop; + if(dTakeprofitExtrTake && dTakeprofit) dTakeprofit=ExtrTake; + } +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| коррекция размера лота до ближайшего допустимого значения | +//+------------------------------------------------------------------+ +bool LotCorrect +( + string symbol, + double &Lot, + ENUM_POSITION_TYPE trade_operation + ) +//LotCorrect(string symbol, double& Lot, ENUM_POSITION_TYPE trade_operation) + { +//---- получение данных для расчёта + double Step,MaxLot,MinLot; + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP,Step)) return(false); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(false); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN,MinLot)) return(false); + +//---- нормирование величины лота до ближайшего стандартного значения + Lot=Step*MathFloor(Lot/Step); + +//---- проверка лота на минимальное допустимое значение + if(LotMaxLot) Lot=MaxLot; + +//---- проверка средств на достаточность + if(!LotFreeMarginCorrect(symbol,Lot,trade_operation))return(false); +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| ограничение размера лота возможностями депозита | +//+------------------------------------------------------------------+ +bool LotFreeMarginCorrect +( + string symbol, + double &Lot, + ENUM_POSITION_TYPE trade_operation + ) +//(string symbol, double& Lot, ENUM_POSITION_TYPE trade_operation) + { +//---- проверка средств на достаточность + double freemargin=AccountInfoDouble(ACCOUNT_FREEMARGIN); + if(freemargin<=0) return(false); + +//---- получение данных для расчёта + double Step,MaxLot,MinLot; + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP,Step)) return(false); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(false); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN,MinLot)) return(false); + + double ExtremLot=GetLotForOpeningPos(symbol,trade_operation,freemargin); +//---- нормирование величины лота до ближайшего стандартного значения + ExtremLot=Step*MathFloor(ExtremLot/Step); + + if(ExtremLotExtremLot) Lot=ExtremLot; // урезаем размер лота до того, что есть на депозите! + if(Lot>MaxLot) Lot=MaxLot; // урезаем размер лота до масимально допустимого +//---- + return(true); + } +//+------------------------------------------------------------------+ +//| расчёт размер лота для открывания позиции с маржой lot_margin | +//+------------------------------------------------------------------+ +double GetLotForOpeningPos(string symbol,ENUM_POSITION_TYPE direction,double lot_margin) + { +//---- + double price=0.0,n_margin; + if(direction==POSITION_TYPE_BUY) if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price)) return(0); + if(direction==POSITION_TYPE_SELL) if(!SymbolInfoDouble(symbol,SYMBOL_BID,price)) return(0); + if(!price) return(NULL); + + if(!OrderCalcMargin(ENUM_ORDER_TYPE(direction),symbol,1,price,n_margin) || !n_margin) return(0); + double lot=lot_margin/n_margin; + +//---- получение торговых констант + double LOTSTEP,MaxLot,MinLot; + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP,LOTSTEP)) return(0); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(0); + if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN,MinLot)) return(0); + +//---- нормирование величины лота до ближайшего стандартного значения + lot=LOTSTEP*MathFloor(lot/LOTSTEP); + +//---- проверка лота на минимальное допустимое значение + if(lotMaxLot) lot=MaxLot; +//---- + return(lot); + } +//+------------------------------------------------------------------+ +//| возврат символа с заданными валютами залога и котировки | +//+------------------------------------------------------------------+ +string GetSymbolByCurrencies(string margin_currency,string profit_currency) + { +//---- переберем в цикле все символы, которые представлены в окне "Обзор рынка" + int total=SymbolsTotal(true); + for(int numb=0; numb 0) + { + bars = Bars(LoadedSymbol, LoadedPeriod); + Print(__FUNCTION__, "(", LoadedSymbol, " ", GetPeriodName(LoadedPeriod), "): First date ", first_date, " - ", bars, " bars"); + } + */ +//----+ + return(res); + } +//+------------------------------------------------------------------+ +//| проверка истории для подгрузки | +//+------------------------------------------------------------------+ +int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date) + { +//----+ + datetime first_date=0; + datetime times[100]; +//--- check symbol & period + if(symbol == NULL || symbol == "") symbol = Symbol(); + if(period == PERIOD_CURRENT) period = Period(); +//--- check if symbol is selected in the MarketWatch + if(!SymbolInfoInteger(symbol,SYMBOL_SELECT)) + { + if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1); + if(!SymbolSelect(symbol,true)) Print(__FUNCTION__,"(): Не удалось добавить символ ",symbol," в окно MarketWatch!!!"); + } +//--- check if data is present + SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); + if(first_date>0 && first_date<=start_date) return(1); +//--- don't ask for load of its own data if it is an indicator + if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) + return(-4); +//--- second attempt + if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date)) + { + //--- there is loaded data to build timeseries + if(first_date>0) + { + //--- force timeseries build + CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times); + //--- check date + if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)) + if(first_date>0 && first_date<=start_date) return(2); + } + } +//--- max bars in chart from terminal options + int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS); +//--- load symbol history info + datetime first_server_date=0; + while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped()) + Sleep(5); +//--- fix start date for loading + if(first_server_date>start_date) start_date=first_server_date; + if(first_date>0 && first_date0) + { + if(bars>=max_bars) return(-2); + //--- ask for first date + if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)) + if(first_date>0 && first_date<=start_date) return(0); + } + //--- copying of next part forces data loading + int copied=CopyTime(symbol,period,bars,100,times); + if(copied>0) + { + //--- check for data + if(times[0]<=start_date) return(0); + if(bars+copied>=max_bars) return(-2); + fail_cnt=0; + } + else + { + //--- no more than 100 failed attempts + fail_cnt++; + if(fail_cnt>=100) return(-5); + Sleep(10); + } + } +//----+ stopped + return(-3); + } +//+------------------------------------------------------------------+ diff --git a/TypeToBytes.mqh b/TypeToBytes.mqh new file mode 100644 index 0000000..1511fca --- /dev/null +++ b/TypeToBytes.mqh @@ -0,0 +1 @@ +// MQL4&5-code #define __TYPETOBYTES__ template class CASTING { public: template static const T Casting( const T1 &Value ) { #ifdef TYPETOBYTES_FULL_SLOW static const bool IsScript = ((ENUM_PROGRAM_TYPE)::MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_SCRIPT); static bool FirstRun = true; T Data = {}; if (FirstRun) { if (IsScript) { const int handle = ::FileOpen("Casting.tmp", FILE_READ | FILE_WRITE | FILE_BIN); if (handle != INVALID_HANDLE) { ::FileWriteStruct(handle, Value); ::FileSeek(handle, 0, SEEK_SET); ::FileReadStruct(handle, Data); ::FileClose(handle); } } else { ::Alert("TYPETOBYTES_FULL_SLOW-mode only for Scripts!"); FirstRun = false; } } return(Data); #else // TYPETOBYTES_FULL_SLOW union CAST { T1 Value1; const T Value2; CAST( const T1 &Value) { this.Value1 = Value; // кастомный оператор может все испортить } }; const CAST Union(Value); return(Union.Value2); #endif // TYPETOBYTES_FULL_SLOW } }; #define _C(A, B) CASTING::Casting(B) #define _R(A) TYPETOBYTES::Read(A) #define _W(A) A=TYPETOBYTES::Write(A) #define _OFFSET(A,B) TYPETOBYTES::Offset(A, A.B) #define _WRONG_ASSIGN_OPERATOR(A) TYPETOBYTES::IsWrongAssignOperator() #define EQUAL_DEFINE(A) \ template \ bool operator ==( const T1 &A ) const \ { \ return(::ArrayCompare(this.Bytes, \ _R(Value).Bytes) == 0); \ } \ \ template \ bool operator !=( const T1 &A ) const \ { \ return(!(this == Value)); \ } #define CONSTRUCTOR_DEFINE(A) \ template \ T1 operator []( const T1 Pos ) const \ { \ STRUCT_TYPE Res = {}; \ const int iPos = (int)Pos; \ \ if (iPos + sizeof(T1) <= ::ArraySize(this.Bytes)) \ { \ STRUCT_READ Tmp = {}; \ \ ::ArrayCopy(Tmp.Bytes, this.Bytes, 0, iPos, sizeof(T1)); \ \ Res = _C(STRUCT_TYPE, Tmp); \ } \ \ return(Res.Value); \ } \ \ string operator []( const string Pos ) const \ { \ string Res = NULL; \ const int iPos = (int)Pos; \ const int Size = ::ArraySize(this.Bytes); \ int iEnd = iPos; \ \ while ((iEnd < Size) && (this.Bytes[iEnd] != 0)) \ iEnd++; \ \ if (iPos < Size) \ { \ uchar TmpBytes[]; \ \ ::ArrayCopy(TmpBytes, this.Bytes, 0, iPos, iEnd - iPos); \ \ _W(Res) = TmpBytes; \ } \ \ return(Res); \ } \ \ EQUAL_DEFINE(Value) \ EQUAL_DEFINE(Value[]) struct STRUCT_READ_ARRAY { uchar Bytes[]; STRUCT_READ_ARRAY( void ) { } template STRUCT_READ_ARRAY( const T &Value[] ) { if ((typename(T) == "uchar") || (typename(T) == "char")) ::ArrayCopy(this.Bytes, Value); else { const int Size = ::ArraySize(Value); const int Step = sizeof(T); ::ArrayResize(this.Bytes, Size * Step); for (int i = 0, j = 0; i < Size; i++, j += Step) ::ArrayCopy(this.Bytes, _R(Value[i]).Bytes, j); } } STRUCT_READ_ARRAY( const string &Value[] ) { const int Size = ::ArraySize(Value); for (int i = 0, j = 0; i < Size; j += ::StringLen(Value[i++]) + 1) ::ArrayCopy(this.Bytes, _R(Value[i]).Bytes, j); } STRUCT_READ_ARRAY( const string &Value ) { ::StringToCharArray(Value, this.Bytes); } void operator =( const STRUCT_READ_ARRAY &Value ) { ::ArrayCopy(this.Bytes, Value.Bytes); return; } CONSTRUCTOR_DEFINE(STRUCT_READ_ARRAY) }; #define DEFINE_TYPES \ M(char) M(short) M(int) M(long) M(uchar) M(ushort) M(uint) \ M(ulong) M(bool) M(double) M(float) M(color) M(datetime) template struct STRUCT_TYPE { private: template void Set( STRUCT_TYPE &Struct, const T1 &tValue ) const { Struct = _C(STRUCT_TYPE, tValue); } #define M(A) \ void Set( STRUCT_TYPE &Struct, const A tValue ) const \ { \ Struct.Value = tValue; \ } DEFINE_TYPES #undef M public: T Value; void operator =( const T& tValue ) { // Обходим возможный кастомный оператор присваивания у T-типа // https://www.mql5.com/ru/forum/1111/page1870#comment_4863733 this.Set(this, tValue); } }; template struct STRUCT_READ { uchar Bytes[sizeof(T)]; void operator =( const T &Value ) { const STRUCT_TYPE Res = Value; this = _C(STRUCT_READ, Res); } CONSTRUCTOR_DEFINE(STRUCT_READ) }; #undef CONSTRUCTOR_DEFINE #undef EQUAL_DEFINE template struct STRUCT_WRITE { private: T Data; int Pos; template T1 GetValue( const T1&, const uchar &Array[] ) const { STRUCT_READ Res = {}; // Указание всех параметров, т.к. в MQL4 статические массивы могут менять размер ::ArrayCopy(Res.Bytes, Array, 0, 0, ::MathMin(::ArraySize(Array), ::ArraySize(Res.Bytes))); return(_C(STRUCT_TYPE, Res).Value); } string GetValue( const string&, const uchar &Array[] ) const { return(::CharArrayToString(Array)); } public: STRUCT_WRITE( const T &Value ) { this.Data = Value; this.Pos = 0; } STRUCT_WRITE operator []( const int iPos ) { this.Pos = iPos; return(this); } // Нужен для вышестоящей return(this) void operator =( const STRUCT_WRITE &Value ) { this.Data = Value.Data; this.Pos = Value.Pos; return; } // Нужен для вышестоящей return(this) STRUCT_WRITE( void ) { } #define OPERATOR_DEFINE(A ) \ template \ T operator =( const T1 A ) const \ { \ uchar TmpBytes[]; \ ::ArrayCopy(TmpBytes, _R(this.Data).Bytes); \ \ ::ArrayCopy(TmpBytes, _R(Value).Bytes, this.Pos); \ \ return(this.GetValue(this.Data, TmpBytes)); \ } OPERATOR_DEFINE(Value) OPERATOR_DEFINE(&Value) OPERATOR_DEFINE(&Value[]) #undef OPERATOR_DEFINE T operator =( const string &Value[] ) const { uchar TmpBytes[]; ::ArrayCopy(TmpBytes, _R(this.Data).Bytes); if (typename(T) == "string") // когда пишем строковый массив в строку, концы строк игнорируем { const int Size = ::ArraySize(Value); for (int i = 0, j = this.Pos; i < Size; j += ::StringLen(Value[i++])/* + 1*/) // Без единицы удобнее - игнорирование нулевых разделителей ::ArrayCopy(TmpBytes, _R(Value[i]).Bytes, j); } else ::ArrayCopy(TmpBytes, _R(Value).Bytes, this.Pos); return(this.GetValue(this.Data, TmpBytes)); } }; class TYPETOBYTES { private: template static const STRUCT_TYPE FillBytes( const uchar Byte = UCHAR_MAX ) { STRUCT_READ Res = {}; ::ArrayInitialize(Res.Bytes, Byte); return(_C(STRUCT_TYPE, Res)); } public: #define READ_DEFINE(A, B, C) \ static const B Read( const C A ) \ { \ const B Res = Value; \ \ return(Res); \ } template READ_DEFINE(&Value, STRUCT_READ, T) template READ_DEFINE(&Value[], STRUCT_READ_ARRAY, T) #define M(A) READ_DEFINE(Value, STRUCT_READ, A) DEFINE_TYPES #undef M #undef READ_DEFINE #undef DEFINE_TYPES static const STRUCT_READ_ARRAY Read( const string Value ) { const STRUCT_READ_ARRAY Res(Value); return(Res); } template static STRUCT_WRITE Write( const T &Value ) { const STRUCT_WRITE Res(Value); return(Res); } template static bool IsWrongAssignOperator( void ) { bool Res = (sizeof(T) != 0); if (Res) { STRUCT_TYPE NotNull_Type = TYPETOBYTES::FillBytes(); STRUCT_TYPE Null_Type = {}; T NotNull = NotNull_Type.Value; T Null = Null_Type.Value; // Переписать, когда исправят - https://www.mql5.com/ru/forum/1111/page1874#comment_4871926 // Причина таких действий - https://www.mql5.com/ru/forum/95447/page3#comment_4872456 const STRUCT_TYPE constNotNull_Type = NotNull_Type; const STRUCT_TYPE constNull_Type = Null_Type; const T constNotNull = constNotNull_Type.Value; const T constNull = constNull_Type.Value; Res = ((_R(Null) != Null_Type.Value) || (_R(NotNull) != NotNull_Type.Value) || (_R(Null) == NotNull) || (_R(constNull) != Null_Type.Value) || (_R(constNotNull) != NotNull_Type.Value) || (_R(constNull) == constNotNull)); } return(Res); } // Co-author - https://www.mql5.com/ru/users/alximiks // Return the first shift of Field bit in the Struct. template static int Offset( T1 &Struct, T2 &Field ) { int Res = -1; if (!TYPETOBYTES::IsWrongAssignOperator()) { const STRUCT_TYPE StoredField = Field; // Обходим T2-оператор присваивания // get Struct where Field value is with all unset bits (0000...) const STRUCT_TYPE Null = {}; Field = Null.Value; const STRUCT_READ StructWithUnsetField = _C(STRUCT_READ, Struct); // get Struct where Field value is with all set bits (1111...) Field = TYPETOBYTES::FillBytes().Value; const STRUCT_READ StructWithSetField = _C(STRUCT_READ, Struct); //restore Struct data Field = StoredField.Value; for (int i = 0; i < sizeof(T1); i++) if (StructWithUnsetField.Bytes[i] != StructWithSetField.Bytes[i]) { Res = i; break; } } return(Res); } template static int Offset( T1 &Struct, T2 &Field[] ) { int Res = -1; if (!TYPETOBYTES::IsWrongAssignOperator()) { const STRUCT_TYPE StoredField = Field[0]; // Обходим T2-оператор присваивания // get Struct where Field value is with all unset bits (0000...) const STRUCT_TYPE Null = {}; Field[0] = Null.Value; const STRUCT_READ StructWithUnsetField = _C(STRUCT_READ, Struct); // get Struct where Field value is with all set bits (1111...) Field[0] = TYPETOBYTES::FillBytes().Value; const STRUCT_READ StructWithSetField = _C(STRUCT_READ, Struct); //restore Struct data Field[0] = StoredField.Value; for (int i = 0; i < sizeof(T1); i++) if (StructWithUnsetField.Bytes[i] != StructWithSetField.Bytes[i]) { Res = i; break; } } return(Res); } }; // Побайтовый ArrayCopy, возврашает количество скопированных байтов template int _ArrayCopy( T1 &Dst_Array[], const T2 &Src_Array[], const int Dst_Start = 0, const int Src_Start = 0, const int Count = WHOLE_ARRAY ) { int Amount; if (((typename(T1) == "uchar") || (typename(T1) == "char")) && ((typename(T2) == "uchar") || (typename(T2) == "char"))) { Amount = ::ArrayCopy(Dst_Array, Src_Array, Dst_Start, Src_Start, Count); // https://www.mql5.com/ru/forum/170952/page209#comment_25563569 if (!::ArraySize(Src_Array) && (ArraySize(Dst_Array) < Dst_Start)) ::ArrayResize(Dst_Array, Dst_Start); } else { STRUCT_READ_ARRAY Dst(Dst_Array); // https://www.mql5.com/ru/forum/363680/page22#comment_21520985 const bool Flag = (typename(T2) == "uchar") || (typename(T2) == "char"); Amount = /*_WRONG_ASSIGN_OPERATOR(T1) ? 0 : */(Flag ? // https://www.mql5.com/ru/forum/1111/page2011#comment_5716224 // Amount = /*_WRONG_ASSIGN_OPERATOR(T1) ? 0 : */(((typename(T2) == "uchar") || (typename(T2) == "char")) ? // https://www.mql5.com/ru/forum/1111/page2011#comment_5716224 ::ArrayCopy(Dst.Bytes, Src_Array, Dst_Start, Src_Start, Count) : ::ArrayCopy(Dst.Bytes, _R(Src_Array).Bytes, Dst_Start, Src_Start, Count)); // https://www.mql5.com/ru/forum/170952/page209#comment_25563569 const bool Flag2 = !::ArraySize(Src_Array) && (ArraySize(Dst.Bytes) < Dst_Start); if (Flag2) ::ArrayResize(Dst.Bytes, Dst_Start); if ((Amount > 0) || Flag2) { if ((typename(T1) == "uchar") || (typename(T1) == "char")) ::ArrayCopy(Dst_Array, Dst.Bytes); else { const int Step = sizeof(T1); const int Size = ::ArraySize(Dst.Bytes); ::ArrayResize(Dst_Array, Size / Step + ((Size % Step == 0) ? 0 : 1)); const int TmpEnd = Dst_Start + Amount; const int End = ::MathMin(TmpEnd / Step + ((TmpEnd % Step == 0) ? 1 : 2), ::ArraySize(Dst_Array)); STRUCT_READ Tmp; for (int i = Dst_Start / Step, j = i * Step; i < End; i++, j += Step) { ::ArrayCopy(Tmp.Bytes, Dst.Bytes, 0, j, Step); Dst_Array[i] = _C(STRUCT_TYPE, Tmp).Value; } } } } return(Amount); } // Возврашает количество скопированных строк template int _ArrayCopy( string &Dst_Array[], const T &Src_Array[], const int Dst_Start = 0, const int Src_Start = 0, const int Count = WHOLE_ARRAY ) { const int Amount = ((Count == WHOLE_ARRAY) ? ::ArraySize(Src_Array) * sizeof(T) - Src_Start : Src_Start + Count); int Res = 0; if (Amount > 0) for (int i = Dst_Start, Pos = Src_Start; Pos < Amount ; i++) { if (i >= ::ArraySize(Dst_Array)) ::ArrayResize(Dst_Array, i + 1); _W(Dst_Array[i]) = _R(Src_Array)[(string)Pos]; Pos += ::StringLen(Dst_Array[i]) + 1; Res++; } return(Res); } template int _ArrayResize( T &Array[], const int Size ) { return(sizeof(T) * ::ArrayResize(Array, Size / sizeof(T) + ((bool)(Size % sizeof(T)) ? 1 : 0))); } // Заменяет побайтово кусок исходного массива на кусок другого массива. // Возвращает количество байтов новых данных. template int _ArrayReplace( T1 &Dst_Array[], const T2 &Src_Array[], const int Dst_Start = 0, const int Dst_Count = WHOLE_ARRAY, const int Src_Start = 0, const int Src_Count = WHOLE_ARRAY ) { uchar TmpData[]; const bool FlagTmpData = (Dst_Count != WHOLE_ARRAY); if (FlagTmpData) _ArrayCopy(TmpData, Dst_Array, 0, Dst_Start + Dst_Count); _ArrayResize(Dst_Array, Dst_Start); const int Res = _ArrayCopy(Dst_Array, Src_Array, Dst_Start, Src_Start, Src_Count); if (FlagTmpData) _ArrayCopy(Dst_Array, TmpData, Dst_Start + Res); return(Res); } template class CONTAINER { private: int AmountBytes; string Types[]; int Pos; int Amount; int GetPosBytes( void ) const { int Res = 0; for (int i = 0; i < this.Pos; i++) Res += _R(this.Data)[Res] + sizeof(int); return(Res); } public: T Data[]; CONTAINER( void ) : AmountBytes(0), Pos(-1), Amount(0) { } string GetType( void ) const { return(this.Types[(this.Pos == -1) ? 0 : this.Pos]); } CONTAINER* operator []( const int iPos ) { this.Pos = iPos; return(&this); } int GetAmount( void ) const { return(this.Amount); } #define OPERATOR_MACROS(A, B) \ template \ void operator =( const T1 A ) \ { \ uchar Bytes[]; \ \ ::ArrayCopy(Bytes, _R(::ArrayCopy(Bytes, _R(Value).Bytes, sizeof(int))).Bytes); \ \ if ((this.Pos >= this.Amount) || (this.Pos == -1)) \ { \ this.Amount = ::ArrayResize(this.Types, this.Amount + 1); \ this.Pos = this.Amount - 1; \ \ this.AmountBytes += _ArrayCopy(this.Data, Bytes, this.AmountBytes); \ } \ else \ { \ const int PosBytes = this.GetPosBytes(); \ const int Count = _R(this.Data)[PosBytes] + sizeof(int); \ \ this.AmountBytes += _ArrayReplace(this.Data, Bytes, PosBytes, Count) - Count; \ } \ \ this.Types[this.Pos] = typename(T1) + B; \ this.Pos = -1; \ \ return; \ } OPERATOR_MACROS(Value, "") OPERATOR_MACROS(&Value, "") OPERATOR_MACROS(&Value[], "[" + (string)::ArraySize(Value) + "]") #undef OPERATOR_MACROS /* template void operator =( CONTAINER &Container ) { this.AmountBytes = Container.AmountBytes; this.Amount = Container.Amount; ::ArrayCopy(this.Types, Container.Types); _ArrayCopy(this.Data, Container.Data); return; } */ template void Get( T1 &Value ) const { const int PosBytes = this.GetPosBytes(); const int Count = _R(this.Data)[PosBytes]; uchar Bytes[]; _ArrayCopy(Bytes, this.Data, 0, PosBytes + sizeof(int), Count); _W(Value) = Bytes; return; } template int Get( T1 &Value[] ) const { const int PosBytes = this.GetPosBytes(); const int Count = _R(this.Data)[PosBytes]; _ArrayCopy(Value, this.Data, 0, PosBytes + sizeof(int), Count); return(::ArraySize(Value)); } template T1 Get() const { T1 Res; this.Get(Res); return(Res); } }; \ No newline at end of file diff --git a/VirtualKeys.mqh b/VirtualKeys.mqh new file mode 100644 index 0000000..21cfbb2 --- /dev/null +++ b/VirtualKeys.mqh @@ -0,0 +1,200 @@ +//+------------------------------------------------------------------+ +//| VirtualKeys.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| Virtual keys copied from winuser.h | +//+------------------------------------------------------------------+ +// +// Virtual Keys, Standard Set +// +#define VK_LBUTTON 0x01 +#define VK_RBUTTON 0x02 +#define VK_CANCEL 0x03 +#define VK_MBUTTON 0x04 +#define VK_XBUTTON1 0x05 +#define VK_XBUTTON2 0x06 + +// 0x07 : unassigned + +#define VK_BACK 0x08 +#define VK_TAB 0x09 + +// 0x0A - 0x0B : reserved + +#define VK_CLEAR 0x0C +#define VK_RETURN 0x0D + +#define VK_SHIFT 0x10 +#define VK_CONTROL 0x11 +#define VK_MENU 0x12 +#define VK_PAUSE 0x13 +#define VK_CAPITAL 0x14 + +#define VK_KANA 0x15 +#define VK_HANGUL 0x15 +#define VK_JUNJA 0x17 +#define VK_FINAL 0x18 +#define VK_HANJA 0x19 +#define VK_KANJI 0x19 + +#define VK_ESCAPE 0x1B +#define VK_CONVERT 0x1C +#define VK_NONCONVERT 0x1D +#define VK_ACCEPT 0x1E +#define VK_MODECHANGE 0x1F + +#define VK_SPACE 0x20 +#define VK_PRIOR 0x21 +#define VK_NEXT 0x22 +#define VK_END 0x23 +#define VK_HOME 0x24 +#define VK_LEFT 0x25 +#define VK_UP 0x26 +#define VK_RIGHT 0x27 +#define VK_DOWN 0x28 +#define VK_SELECT 0x29 +#define VK_PRINT 0x2A +#define VK_EXECUTE 0x2B +#define VK_SNAPSHOT 0x2C +#define VK_INSERT 0x2D +#define VK_DELETE 0x2E +#define VK_HELP 0x2F + +// VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39) +// 0x40 : unassigned +// VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A) + +#define VK_LWIN 0x5B +#define VK_RWIN 0x5C +#define VK_APPS 0x5D + +// 0x5E : reserved + +#define VK_SLEEP 0x5F + +#define VK_NUMPAD0 0x60 +#define VK_NUMPAD1 0x61 +#define VK_NUMPAD2 0x62 +#define VK_NUMPAD3 0x63 +#define VK_NUMPAD4 0x64 +#define VK_NUMPAD5 0x65 +#define VK_NUMPAD6 0x66 +#define VK_NUMPAD7 0x67 +#define VK_NUMPAD8 0x68 +#define VK_NUMPAD9 0x69 +#define VK_MULTIPLY 0x6A +#define VK_ADD 0x6B +#define VK_SEPARATOR 0x6C +#define VK_SUBTRACT 0x6D +#define VK_DECIMAL 0x6E +#define VK_DIVIDE 0x6F +#define VK_F1 0x70 +#define VK_F2 0x71 +#define VK_F3 0x72 +#define VK_F4 0x73 +#define VK_F5 0x74 +#define VK_F6 0x75 +#define VK_F7 0x76 +#define VK_F8 0x77 +#define VK_F9 0x78 +#define VK_F10 0x79 +#define VK_F11 0x7A +#define VK_F12 0x7B +#define VK_F13 0x7C +#define VK_F14 0x7D +#define VK_F15 0x7E +#define VK_F16 0x7F +#define VK_F17 0x80 +#define VK_F18 0x81 +#define VK_F19 0x82 +#define VK_F20 0x83 +#define VK_F21 0x84 +#define VK_F22 0x85 +#define VK_F23 0x86 +#define VK_F24 0x87 + +// 0x88 - 0x8F : unassigned + +#define VK_NUMLOCK 0x90 +#define VK_SCROLL 0x91 + +// 0x92 - 0x96 : OEM specific +// 0x97 - 0x9F : unassigned + +#define VK_LSHIFT 0xA0 +#define VK_RSHIFT 0xA1 +#define VK_LCONTROL 0xA2 +#define VK_RCONTROL 0xA3 +#define VK_LMENU 0xA4 +#define VK_RMENU 0xA5 + +#define VK_BROWSER_BACK 0xA6 +#define VK_BROWSER_FORWARD 0xA7 +#define VK_BROWSER_REFRESH 0xA8 +#define VK_BROWSER_STOP 0xA9 +#define VK_BROWSER_SEARCH 0xAA +#define VK_BROWSER_FAVORITES 0xAB +#define VK_BROWSER_HOME 0xAC + +#define VK_VOLUME_MUTE 0xAD +#define VK_VOLUME_DOWN 0xAE +#define VK_VOLUME_UP 0xAF +#define VK_MEDIA_NEXT_TRACK 0xB0 +#define VK_MEDIA_PREV_TRACK 0xB1 +#define VK_MEDIA_STOP 0xB2 +#define VK_MEDIA_PLAY_PAUSE 0xB3 +#define VK_LAUNCH_MAIL 0xB4 +#define VK_LAUNCH_MEDIA_SELECT 0xB5 +#define VK_LAUNCH_APP1 0xB6 +#define VK_LAUNCH_APP2 0xB7 + +// 0xB8 - 0xB9 : reserved + +#define VK_OEM_1 0xBA +#define VK_OEM_PLUS 0xBB +#define VK_OEM_COMMA 0xBC +#define VK_OEM_MINUS 0xBD +#define VK_OEM_PERIOD 0xBE +#define VK_OEM_2 0xBF +#define VK_OEM_3 0xC0 + +// 0xC1 - 0xD7 : reserved +// 0xD8 - 0xDA : unassigned + +#define VK_OEM_4 0xDB +#define VK_OEM_5 0xDC +#define VK_OEM_6 0xDD +#define VK_OEM_7 0xDE +#define VK_OEM_8 0xDF + +// 0xE0 : reserved +// 0xE1 : OEM specific + +#define VK_OEM_102 0xE2 + +// 0xE3 - 0xE4 : OEM specific + +#define VK_PROCESSKEY 0xE5 + +// 0xE6 : OEM specific + +#define VK_PACKET 0xE7 + +// 0xE8 : unassigned +// 0xE9 - 0xF5 : OEM specific + +#define VK_ATTN 0xF6 +#define VK_CRSEL 0xF7 +#define VK_EXSEL 0xF8 +#define VK_EREOF 0xF9 +#define VK_PLAY 0xFA +#define VK_ZOOM 0xFB +#define VK_NONAME 0xFC +#define VK_PA1 0xFD +#define VK_OEM_CLEAR 0xFE + +// 0xFF : reserved +//+------------------------------------------------------------------+ diff --git a/WinAPI/errhandlingapi.mqh b/WinAPI/errhandlingapi.mqh new file mode 100644 index 0000000..bdd5837 --- /dev/null +++ b/WinAPI/errhandlingapi.mqh @@ -0,0 +1,28 @@ +//+------------------------------------------------------------------+ +//| errhandlingapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +void RaiseException(uint exception_code,uint exception_flags,uint number_of_arguments,const ulong &arguments[]); +int UnhandledExceptionFilter(EXCEPTION_POINTERS &exception_info); +PVOID SetUnhandledExceptionFilter(PVOID top_level_exception_filter); +uint GetLastError(void); +void SetLastError(uint err_code); +uint GetErrorMode(void); +uint SetErrorMode(uint mode); +PVOID AddVectoredExceptionHandler(uint first,PVOID handler); +uint RemoveVectoredExceptionHandler(PVOID handle); +PVOID AddVectoredContinueHandler(uint first,PVOID handler); +uint RemoveVectoredContinueHandler(PVOID handle); +void RestoreLastError(uint err_code); +void RaiseFailFastException(EXCEPTION_RECORD &exception_record,CONTEXT &context_record,uint flags); +void FatalAppExitW(uint action,const string message_text); +uint GetThreadErrorMode(void); +int SetThreadErrorMode(uint new_mode,uint& old_mode); +#import diff --git a/WinAPI/fileapi.mqh b/WinAPI/fileapi.mqh new file mode 100644 index 0000000..66c03c7 --- /dev/null +++ b/WinAPI/fileapi.mqh @@ -0,0 +1,146 @@ +//+------------------------------------------------------------------+ +//| fileapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include + +//--- +enum STREAM_INFO_LEVELS + { + FindStreamInfoStandard, + FindStreamInfoMaxInfoLevel + }; +//--- +struct BY_HANDLE_FILE_INFORMATION + { + uint dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + uint dwVolumeSerialNumber; + uint nFileSizeHigh; + uint nFileSizeLow; + uint nNumberOfLinks; + uint nFileIndexHigh; + uint nFileIndexLow; + }; +//--- +struct CREATEFILE2_EXTENDED_PARAMETERS + { + uint dwSize; + uint dwFileAttributes; + uint dwFileFlags; + uint dwSecurityQosFlags; + PVOID lpSecurityAttributes; + HANDLE hTemplateFile; + }; +//--- +struct FILE_ATTRIBUTE_DATA + { + uint dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + uint nFileSizeHigh; + uint nFileSizeLow; + }; +//--- +struct FIND_STREAM_DATA + { + long StreamSize; + short cStreamName[MAX_PATH+36]; + }; +//--- +struct FIND_DATAW + { + uint dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + uint nFileSizeHigh; + uint nFileSizeLow; + uint dwReserved0; + uint dwReserved1; + short cFileName[MAX_PATH]; + short cAlternateFileName[14]; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int AreFileApisANSI(void); +int CompareFileTime(FILETIME &file_time1,FILETIME &file_time2); +int CreateDirectoryW(const string path_name,PVOID security_attributes); +HANDLE CreateFile2(const string file_name,uint desired_access,uint share_mode,uint creation_disposition,CREATEFILE2_EXTENDED_PARAMETERS &create_ex_params); +HANDLE CreateFileW(const string file_name,uint desired_access,uint share_mode,PVOID security_attributes,uint creation_disposition,uint flags_and_attributes,HANDLE template_file); +int DefineDosDeviceW(uint flags,const string device_name,const string target_path); +int DeleteFileW(const string file_name); +int DeleteVolumeMountPointW(const string volume_mount_point); +int FileTimeToLocalFileTime(FILETIME &file_time,FILETIME &local_file_time); +int FindClose(HANDLE find_file); +int FindCloseChangeNotification(HANDLE change_handle); +HANDLE FindFirstChangeNotificationW(const string path_name,int watch_subtree,uint notify_filter); +HANDLE FindFirstFileExW(const string file_name,FINDEX_INFO_LEVELS info_level_id,FIND_DATAW &find_file_data,FINDEX_SEARCH_OPS search_op,PVOID search_filter,uint additional_flags); +HANDLE FindFirstFileNameW(const string file_name,uint flags,uint &StringLength,ushort &LinkName[]); +HANDLE FindFirstFileW(const string file_name,FIND_DATAW &find_file_data); +HANDLE FindFirstStreamW(const string file_name,STREAM_INFO_LEVELS InfoLevel,FIND_STREAM_DATA &find_stream_data,uint flags); +HANDLE FindFirstVolumeW(ushort &volume_name[],uint &buffer_length); +int FindNextChangeNotification(HANDLE change_handle); +int FindNextFileNameW(HANDLE find_stream,uint &StringLength,ushort &LinkName[]); +int FindNextFileW(HANDLE find_file,FIND_DATAW &find_file_data); +int FindNextStreamW(HANDLE find_stream,FIND_STREAM_DATA &find_stream_data); +int FindNextVolumeW(HANDLE find_volume,ushort &volume_name[],uint &buffer_length); +int FindVolumeClose(HANDLE find_volume); +int FlushFileBuffers(HANDLE file); +uint GetCompressedFileSizeW(const string file_name,uint &file_size_high); +int GetDiskFreeSpaceExW(const string directory_name,ulong &free_bytes_available_to_caller,ulong &total_number_of_bytes,ulong &total_number_of_free_bytes); +int GetDiskFreeSpaceW(const string root_path_name,uint §ors_per_cluster,uint &bytes_per_sector,uint &number_of_free_clusters,uint &total_number_of_clusters); +uint GetDriveTypeW(const string root_path_name); +int GetFileAttributesExW(const string file_name,GET_FILEEX_INFO_LEVELS info_level_id,FILE_ATTRIBUTE_DATA &file_information); +uint GetFileAttributesW(const string file_name); +int GetFileInformationByHandle(HANDLE file,BY_HANDLE_FILE_INFORMATION &file_information); +uint GetFileSize(HANDLE file,uint &file_size_high); +int GetFileSizeEx(HANDLE file,long &file_size); +int GetFileTime(HANDLE file,FILETIME &creation_time,FILETIME &last_access_time,FILETIME &last_write_time); +uint GetFileType(HANDLE file); +uint GetFinalPathNameByHandleW(HANDLE file,ushort &file_path[],uint file_path,uint flags); +uint GetFullPathNameW(const string file_name,uint buffer_length,ushort &buffer[],ushort &file_part[]); +uint GetLogicalDrives(void); +uint GetLogicalDriveStringsW(uint buffer_length,ushort &buffer[]); +uint GetLongPathNameW(const string short_path,string &long_path,uint buffer); +uint GetShortPathNameW(const string long_path,string &short_path,uint buffer); +uint GetTempFileNameW(const string path_name,const string prefix_string,uint unique,ushort &temp_file_name[]); +uint GetTempPathW(uint buffer_length,ushort &buffer[]); +int GetVolumeInformationByHandleW(HANDLE file,ushort &volume_name_buffer[],uint volume_name_size,uint &volume_serial_number,uint &maximum_component_length,uint &file_system_flags,ushort &file_system_name_buffer[],uint file_system_name_size); +int GetVolumeInformationW(const string root_path_name,ushort &volume_name_buffer[],uint volume_name_size,uint &volume_serial_number,uint &maximum_component_length,uint &file_system_flags,ushort &file_system_name_buffer[],uint file_system_name_size); +int GetVolumeNameForVolumeMountPointW(const string volume_mount_point,string volume_name,uint buffer_length); +int GetVolumePathNamesForVolumeNameW(const string volume_name,string volume_path_names,uint buffer_length,uint &return_length); +int GetVolumePathNameW(const string file_name,ushort &volume_path_name[],uint buffer_length); +int LocalFileTimeToFileTime(FILETIME &local_file_time,FILETIME &file_time); +int LockFile(HANDLE file,uint file_offset_low,uint file_offset_high,uint number_of_bytes_to_lock_low,uint number_of_bytes_to_lock_high); +int LockFileEx(HANDLE file,uint flags,uint reserved,uint number_of_bytes_to_lock_low,uint number_of_bytes_to_lock_high,OVERLAPPED &overlapped); +uint QueryDosDeviceW(const string device_name,ushort &target_path[],uint max); +int ReadFile(HANDLE file,ushort &buffer[],uint number_of_bytes_to_read,uint &number_of_bytes_read,OVERLAPPED &overlapped); +int ReadFile(HANDLE file,ushort &buffer[],uint number_of_bytes_to_read,uint &number_of_bytes_read,PVOID overlapped); +int ReadFileScatter(HANDLE file,FILE_SEGMENT_ELEMENT &segment_array[],uint number_of_bytes_to_read,uint &reserved,OVERLAPPED &overlapped); +int ReadFileScatter(HANDLE file,FILE_SEGMENT_ELEMENT &segment_array[],uint number_of_bytes_to_read,uint &reserved,PVOID overlapped); +int RemoveDirectoryW(const string path_name); +int SetEndOfFile(HANDLE file); +void SetFileApisToANSI(void); +void SetFileApisToOEM(void); +int SetFileAttributesW(const string file_name,uint file_attributes); +int SetFileInformationByHandle(HANDLE file,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,FILE_INFO &file_information,uint buffer_size); +int SetFileIoOverlappedRange(HANDLE FileHandle,uchar &OverlappedRangeStart,uint Length); +uint SetFilePointer(HANDLE file,long distance_to_move,long &distance_to_move_high,uint move_method); +int SetFilePointerEx(HANDLE file,long distance_to_move,long &new_file_pointer,uint move_method); +int SetFileTime(HANDLE file,FILETIME &creation_time,FILETIME &last_access_time,FILETIME &last_write_time); +int SetFileValidData(HANDLE file,long ValidDataLength); +int UnlockFile(HANDLE file,uint file_offset_low,uint file_offset_high,uint number_of_bytes_to_unlock_low,uint number_of_bytes_to_unlock_high); +int UnlockFileEx(HANDLE file,uint reserved,uint number_of_bytes_to_unlock_low,uint number_of_bytes_to_unlock_high,OVERLAPPED &overlapped); +int WriteFile(HANDLE file,const ushort &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,OVERLAPPED &overlapped); +int WriteFile(HANDLE file,const ushort &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,PVOID overlapped); +int WriteFileGather(HANDLE file,FILE_SEGMENT_ELEMENT &segment_array[],uint number_of_bytes_to_write,uint &reserved,OVERLAPPED &overlapped); +int WriteFileGather(HANDLE file,FILE_SEGMENT_ELEMENT &segment_array[],uint number_of_bytes_to_write,uint &reserved,PVOID overlapped); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/handleapi.mqh b/WinAPI/handleapi.mqh new file mode 100644 index 0000000..c23a1a4 --- /dev/null +++ b/WinAPI/handleapi.mqh @@ -0,0 +1,21 @@ +//+------------------------------------------------------------------+ +//| handleapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int CloseHandle(HANDLE object); +int DuplicateHandle(HANDLE source_process_handle,HANDLE source_handle,HANDLE target_process_handle,HANDLE &target_handle,uint desired_access,int inherit_handle,uint options); +int GetHandleInformation(HANDLE object,uint& flags); +int SetHandleInformation(HANDLE object,uint mask,uint flags); +#import + +#import "kernelbase.dll" +int CompareObjectHandles(HANDLE first_object_handle, HANDLE second_object_handle); +#import +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/WinAPI/libloaderapi.mqh b/WinAPI/libloaderapi.mqh new file mode 100644 index 0000000..30d8dcd --- /dev/null +++ b/WinAPI/libloaderapi.mqh @@ -0,0 +1,47 @@ +//+------------------------------------------------------------------+ +//| libloaderapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include + +//--- +struct ENUMUILANG + { + uint NumOfEnumUILang; + uint SizeOfEnumUIBuffer; + PVOID EnumUIBuffer; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int DisableThreadLibraryCalls(HANDLE lib_module); +HANDLE FindResourceExW(HANDLE module,const string type,const string name,ushort language); +int FindStringOrdinal(uint find_string_ordinal_flags,const string string_source,int source,const string string_value,int value,int ignore_case); +int FreeLibrary(HANDLE lib_module); +void FreeLibraryAndExitThread(HANDLE lib_module,uint exit_code); +int FreeResource(HANDLE res_data); +uint GetModuleFileNameW(HANDLE module,ushort &filename[],uint size); +HANDLE GetModuleHandleW(const string module_name); +int GetModuleHandleExW(uint flags,const string module_name,HANDLE &module); +PVOID GetProcAddress(HANDLE module,uchar &proc_name[]); +HANDLE LoadLibraryExW(const string lib_file_name,HANDLE file,uint flags); +HANDLE LoadResource(HANDLE module,HANDLE res_info); +PVOID LockResource(HANDLE res_data); +uint SizeofResource(HANDLE module,HANDLE res_info); +PVOID AddDllDirectory(const string new_directory); +int RemoveDllDirectory(PVOID cookie); +int SetDefaultDllDirectories(uint directory_flags); +int EnumResourceLanguagesExW(HANDLE module,const string type,const string name,PVOID enum_func,long param,uint flags,ushort lang_id); +int EnumResourceNamesExW(HANDLE module,const string type,PVOID enum_func,long param,uint flags,ushort lang_id); +int EnumResourceTypesExW(HANDLE module,PVOID enum_func,long param,uint flags,ushort lang_id); +HANDLE FindResourceW(HANDLE module,const string name,const string type); +HANDLE LoadLibraryW(const string lib_file_name); +int EnumResourceNamesW(HANDLE module,const string type,PVOID enum_func,long param); +#import + +#import "user32.dll" +int LoadStringW(HANDLE instance,uint id,string buffer,int buffer_max); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/memoryapi.mqh b/WinAPI/memoryapi.mqh new file mode 100644 index 0000000..9fe8525 --- /dev/null +++ b/WinAPI/memoryapi.mqh @@ -0,0 +1,85 @@ +//+------------------------------------------------------------------+ +//| memoryapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//--- +enum MEMORY_RESOURCE_NOTIFICATION_TYPE + { + LowMemoryResourceNotification, + HighMemoryResourceNotification + }; +//--- +enum OFFER_PRIORITY + { + VmOfferPriorityVeryLow=1, + VmOfferPriorityLow, + VmOfferPriorityBelowNormal, + VmOfferPriorityNormal + }; +//--- +enum WIN32_MEMORY_INFORMATION_CLASS + { + MemoryRegionInfo + }; +//--- +struct WIN32_MEMORY_RANGE_ENTRY + { + PVOID VirtualAddress; + ulong NumberOfBytes; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int AllocateUserPhysicalPages(HANDLE hProcess,ulong &NumberOfPages,ulong &PageArray[]); +int AllocateUserPhysicalPagesNuma(HANDLE hProcess,ulong &NumberOfPages,ulong &PageArray[],uint nndPreferred); +HANDLE CreateFileMappingFromApp(HANDLE hFile,PVOID SecurityAttributes,uint PageProtection,ulong MaximumSize,const string Name); +HANDLE CreateFileMappingNumaW(HANDLE hFile,PVOID lpFileMappingAttributes,uint flProtect,uint dwMaximumSizeHigh,uint dwMaximumSizeLow,const string lpName,uint nndPreferred); +HANDLE CreateFileMappingW(HANDLE hFile,PVOID lpFileMappingAttributes,uint flProtect,uint dwMaximumSizeHigh,uint dwMaximumSizeLow,const string lpName); +HANDLE CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType); +uint DiscardVirtualMemory(PVOID VirtualAddress,ulong Size); +int FlushViewOfFile(const PVOID lpBaseAddress,ulong dwNumberOfBytesToFlush); +int FreeUserPhysicalPages(HANDLE hProcess,ulong &NumberOfPages,ulong &PageArray[]); +ulong GetLargePageMinimum(void); +int GetMemoryErrorHandlingCapabilities(uint &Capabilities); +int GetProcessWorkingSetSizeEx(HANDLE hProcess,ulong &lpMinimumWorkingSetSize,ulong &lpMaximumWorkingSetSize,uint &Flags); +int GetSystemFileCacheSize(ulong &lpMinimumFileCacheSize,ulong &lpMaximumFileCacheSize,uint &lpFlags); +uint GetWriteWatch(uint dwFlags,PVOID lpBaseAddress,ulong dwRegionSize,PVOID &lpAddresses[],uint &lpdwCount,uint &lpdwGranularity); +int MapUserPhysicalPages(PVOID VirtualAddress,ulong &NumberOfPages,ulong &PageArray[]); +PVOID MapViewOfFile(HANDLE hFileMappingObject,uint dwDesiredAccess,uint dwFileOffsetHigh,uint dwFileOffsetLow,ulong dwNumberOfBytesToMap); +PVOID MapViewOfFileEx(HANDLE hFileMappingObject,uint dwDesiredAccess,uint dwFileOffsetHigh,uint dwFileOffsetLow,ulong dwNumberOfBytesToMap,PVOID lpBaseAddress); +PVOID MapViewOfFileFromApp(HANDLE hFileMappingObject,uint DesiredAccess,ulong FileOffset,ulong NumberOfBytesToMap); +uint OfferVirtualMemory(PVOID VirtualAddress,ulong Size,OFFER_PRIORITY Priority); +HANDLE OpenFileMappingW(uint dwDesiredAccess,int bInheritHandle,const string lpName); +int PrefetchVirtualMemory(HANDLE hProcess,uint &NumberOfEntries,WIN32_MEMORY_RANGE_ENTRY &VirtualAddresses,uint Flags); +int QueryMemoryResourceNotification(HANDLE ResourceNotificationHandle,int &ResourceState); +int ReadProcessMemory(HANDLE hProcess,const PVOID lpBaseAddress,PVOID lpBuffer,ulong nSize,ulong &lpNumberOfBytesRead); +uint ReclaimVirtualMemory(const PVOID VirtualAddress,ulong Size); +PVOID RegisterBadMemoryNotification(PVOID Callback); +uint ResetWriteWatch(PVOID lpBaseAddress,ulong dwRegionSize); +int SetProcessWorkingSetSizeEx(HANDLE hProcess,ulong dwMinimumWorkingSetSize,ulong dwMaximumWorkingSetSize,uint Flags); +int SetSystemFileCacheSize(ulong MinimumFileCacheSize,ulong MaximumFileCacheSize,uint Flags); +int UnmapViewOfFile(const PVOID lpBaseAddress); +int UnmapViewOfFileEx(PVOID BaseAddress,uint UnmapFlags); +int UnregisterBadMemoryNotification(PVOID RegistrationHandle); +PVOID VirtualAlloc(PVOID lpAddress,ulong dwSize,uint flAllocationType,uint flProtect); +PVOID VirtualAllocEx(HANDLE hProcess,PVOID lpAddress,ulong dwSize,uint flAllocationType,uint flProtect); +PVOID VirtualAllocExNuma(HANDLE hProcess,PVOID lpAddress,ulong dwSize,uint flAllocationType,uint flProtect,uint nndPreferred); +int VirtualFree(PVOID lpAddress,ulong dwSize,uint dwFreeType); +int VirtualFreeEx(HANDLE hProcess,PVOID lpAddress,ulong dwSize,uint dwFreeType); +int VirtualLock(PVOID lpAddress,ulong dwSize); +int VirtualProtect(PVOID lpAddress,ulong dwSize,uint flNewProtect,uint &lpflOldProtect); +int VirtualProtectEx(HANDLE hProcess,PVOID lpAddress,ulong dwSize,uint flNewProtect,uint &lpflOldProtect); +ulong VirtualQuery(const PVOID lpAddress,MEMORY_BASIC_INFORMATION &lpBuffer,ulong dwLength); +ulong VirtualQueryEx(HANDLE hProcess,const PVOID lpAddress,MEMORY_BASIC_INFORMATION &lpBuffer,ulong dwLength); +int VirtualUnlock(PVOID lpAddress,ulong dwSize); +int WriteProcessMemory(HANDLE hProcess,PVOID lpBaseAddress,PVOID lpBuffer,ulong nSize,ulong &lpNumberOfBytesWritten); +int WriteProcessMemory(HANDLE hProcess,PVOID lpBaseAddress,uchar &lpBuffer[],ulong nSize,ulong &lpNumberOfBytesWritten); +int WriteProcessMemory(HANDLE hProcess,uchar &lpBaseAddress[],PVOID lpBuffer,ulong nSize,ulong &lpNumberOfBytesWritten); +int WriteProcessMemory(HANDLE hProcess,uchar &lpBaseAddress[],uchar &lpBuffer[],ulong nSize,ulong &lpNumberOfBytesWritten); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/processenv.mqh b/WinAPI/processenv.mqh new file mode 100644 index 0000000..c39c3a0 --- /dev/null +++ b/WinAPI/processenv.mqh @@ -0,0 +1,27 @@ +//+------------------------------------------------------------------+ +//| processenv.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int SetEnvironmentStringsW(string new_environment); +HANDLE GetStdHandle(uint std_handle); +int SetStdHandle(uint std_handle,HANDLE handle); +int SetStdHandleEx(uint std_handle,HANDLE handle,HANDLE &prev_value); +string GetCommandLineW(void); +string GetEnvironmentStringsW(void); +int FreeEnvironmentStringsW(string v); +uint GetEnvironmentVariableW(const string name,ushort &buffer[],uint size); +int SetEnvironmentVariableW(const string name,const string value); +uint ExpandEnvironmentStringsW(const string src,string dst,uint size); +int SetCurrentDirectoryW(const string path_name); +uint GetCurrentDirectoryW(uint buffer_length,ushort &buffer[]); +uint GetCurrentDirectoryW(uint buffer_length,string &buffer); +uint SearchPathW(const string path,const string file_name,const string extension,uint buffer_length,ushort &buffer[],string &file_part); +int NeedCurrentDirectoryForExePathW(const string exe_name); +#import diff --git a/WinAPI/processthreadsapi.mqh b/WinAPI/processthreadsapi.mqh new file mode 100644 index 0000000..fe6aea9 --- /dev/null +++ b/WinAPI/processthreadsapi.mqh @@ -0,0 +1,202 @@ +//+------------------------------------------------------------------+ +//| processthreadsapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//--- +enum THREAD_INFORMATION_CLASS + { + ThreadMemoryPriority, + ThreadAbsoluteCpuPriority, + ThreadDynamicCodePolicy, + ThreadPowerThrottling, + ThreadInformationClassMax + }; +//--- +enum PROCESS_INFORMATION_CLASS + { + ProcessMemoryPriority, + ProcessMemoryExhaustionInfo, + ProcessAppMemoryInfo, + ProcessInPrivateInfo, + ProcessPowerThrottling, + ProcessReservedValue1, + ProcessTelemetryCoverageInfo, + ProcessProtectionLevelInfo, + ProcessInformationClassMax + }; +//--- +enum PROCESS_MEMORY_EXHAUSTION_TYPE + { + PMETypeFailFastOnCommitFailure, + PMETypeMax + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//--- +struct PROCESS_INFORMATION + { + HANDLE hProcess; + HANDLE hThread; + uint dwProcessId; + uint dwThreadId; + }; +//--- +struct STARTUPINFOW + { + uint cb; + string lpReserved; + string lpDesktop; + string lpTitle; + uint dwX; + uint dwY; + uint dwXSize; + uint dwYSize; + uint dwXCountChars; + uint dwYCountChars; + uint dwFillAttribute; + uint dwFlags; + ushort wShowWindow; + ushort cbReserved2; + PVOID lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; + }; +//--- +struct MEMORY_PRIORITY_INFORMATION + { + uint MemoryPriority; + }; +//--- +struct THREAD_POWER_THROTTLING_STATE + { + uint Version; + uint ControlMask; + uint StateMask; + }; +//--- +struct APP_MEMORY_INFORMATION + { + ulong AvailableCommit; + ulong PrivateCommitUsage; + ulong PeakPrivateCommitUsage; + ulong TotalCommitUsage; + }; +//--- +struct PROCESS_MEMORY_EXHAUSTION_INFO + { + ushort Version; + ushort Reserved; + PROCESS_MEMORY_EXHAUSTION_TYPE Type; + ulong Value; + }; +//--- +struct PROCESS_POWER_THROTTLING_STATE + { + uint Version; + uint ControlMask; + uint StateMask; + }; +//--- +struct PROCESS_PROTECTION_LEVEL_INFORMATION + { + uint ProtectionLevel; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +uint QueueUserAPC(PVOID apc,HANDLE thread,ulong data); +int GetProcessTimes(HANDLE process,FILETIME &creation_time,FILETIME &exit_time,FILETIME &kernel_time,FILETIME &user_time); +HANDLE GetCurrentProcess(void); +uint GetCurrentProcessId(void); +void ExitProcess(uint exit_code); +int TerminateProcess(HANDLE process,uint exit_code); +int GetExitCodeProcess(HANDLE process,uint &exit_code); +int SwitchToThread(void); +HANDLE CreateThread(PVOID thread_attributes,ulong stack_size,PVOID start_address,PVOID parameter,uint creation_flags,uint &thread_id); +HANDLE CreateRemoteThread(HANDLE process,PVOID thread_attributes,ulong stack_size,PVOID start_address,PVOID parameter,uint creation_flags,uint &thread_id); +HANDLE GetCurrentThread(void); +uint GetCurrentThreadId(void); +HANDLE OpenThread(uint desired_access,int inherit_handle,uint thread_id); +int SetThreadPriority(HANDLE thread,int priority); +int SetThreadPriorityBoost(HANDLE thread,int disable_priority_boost); +int GetThreadPriorityBoost(HANDLE thread,int &disable_priority_boost); +int GetThreadPriority(HANDLE thread); +void ExitThread(uint exit_code); +int TerminateThread(HANDLE thread,uint exit_code); +int GetExitCodeThread(HANDLE thread,uint &exit_code); +uint SuspendThread(HANDLE thread); +uint ResumeThread(HANDLE thread); +uint TlsAlloc(void); +PVOID TlsGetValue(uint tls_index); +int TlsSetValue(uint tls_index,PVOID tls_value); +int TlsFree(uint tls_index); +int CreateProcessW(const string application_name,string command_line,PVOID process_attributes,PVOID thread_attributes,int inherit_handles,uint creation_flags,PVOID environment,const string current_directory,STARTUPINFOW &startup_info,PROCESS_INFORMATION &process_information); +int SetProcessShutdownParameters(uint level,uint flags); +uint GetProcessVersion(uint process_id); +void GetStartupInfoW(STARTUPINFOW &startup_info); +int SetPriorityClass(HANDLE process,uint priority_class); +uint GetPriorityClass(HANDLE process); +int SetThreadStackGuarantee(ulong stack_size_in_bytes); +int ProcessIdToSessionId(uint process_id,uint &session_id); +uint GetProcessId(HANDLE process); +uint GetThreadId(HANDLE thread); +void FlushProcessWriteBuffers(void); +uint GetProcessIdOfThread(HANDLE thread); +int InitializeProcThreadAttributeList(PVOID attribute_list,uint attribute_count,uint flags,ulong &size); +void DeleteProcThreadAttributeList(PVOID attribute_list); +int SetProcessAffinityUpdateMode(HANDLE process,uint flags); +int QueryProcessAffinityUpdateMode(HANDLE process,uint &flags); +int UpdateProcThreadAttribute(PVOID attribute_list,uint flags,uint attribute,PVOID value,ulong size,PVOID previous_value,ulong &return_size); +HANDLE CreateRemoteThreadEx(HANDLE process,PVOID thread_attributes,ulong stack_size,PVOID start_address,PVOID parameter,uint creation_flags,PVOID attribute_list,uint &thread_id); +void GetCurrentThreadStackLimits(ulong &low_limit,ulong &high_limit); +int GetThreadContext(HANDLE thread,CONTEXT &context); +int GetProcessMitigationPolicy(HANDLE process,PROCESS_MITIGATION_POLICY mitigation_policy,PVOID buffer,ulong length); +int SetThreadContext(HANDLE thread,const CONTEXT &context); +int SetProcessMitigationPolicy(PROCESS_MITIGATION_POLICY mitigation_policy,PVOID buffer,ulong length); +int FlushInstructionCache(HANDLE process,const PVOID base_address,ulong size); +int GetThreadTimes(HANDLE thread,FILETIME &creation_time,FILETIME &exit_time,FILETIME &kernel_time,FILETIME &user_time); +HANDLE OpenProcess(uint desired_access,int inherit_handle,uint process_id); +int IsProcessorFeaturePresent(uint processor_feature); +int GetProcessHandleCount(HANDLE process,uint &handle_count); +uint GetCurrentProcessorNumber(void); +int SetThreadIdealProcessorEx(HANDLE thread,PROCESSOR_NUMBER &ideal_processor,PROCESSOR_NUMBER &previous_ideal_processor); +int GetThreadIdealProcessorEx(HANDLE thread,PROCESSOR_NUMBER &ideal_processor); +void GetCurrentProcessorNumberEx(PROCESSOR_NUMBER &proc_number); +int GetProcessPriorityBoost(HANDLE process,int &disable_priority_boost); +int SetProcessPriorityBoost(HANDLE process,int disable_priority_boost); +int GetThreadIOPendingFlag(HANDLE thread,int &io_is_pending); +int GetSystemTimes(FILETIME &idle_time,FILETIME &kernel_time,FILETIME &user_time); +int GetThreadInformation(HANDLE thread,THREAD_INFORMATION_CLASS thread_information_class,PVOID thread_information,uint thread_information_size); +int SetThreadInformation(HANDLE thread,THREAD_INFORMATION_CLASS thread_information_class,PVOID thread_information,uint thread_information_size); +int IsProcessCritical(HANDLE process,int &critical); +int SetProtectedPolicy(const GUID &policy_guid,ulong policy_value,ulong &old_policy_value); +int QueryProtectedPolicy(const GUID &policy_guid,ulong &policy_value); +uint SetThreadIdealProcessor(HANDLE thread,uint ideal_processor); +int SetProcessInformation(HANDLE process,PROCESS_INFORMATION_CLASS process_information_class,PVOID process_information,uint process_information_size); +int GetProcessInformation(HANDLE process,PROCESS_INFORMATION_CLASS process_information_class,PVOID process_information,uint process_information_size); +int GetSystemCpuSetInformation(SYSTEM_CPU_SET_INFORMATION &information,uint buffer_length,ulong returned_length,HANDLE process,uint flags); +int GetProcessDefaultCpuSets(HANDLE process,ulong &cpu_set_ids,uint cpu_set_id_count,ulong required_id_count); +int SetProcessDefaultCpuSets(HANDLE process,const uint &cpu_set_ids,uint cpu_set_id_count); +int GetThreadSelectedCpuSets(HANDLE thread,ulong &cpu_set_ids,uint cpu_set_id_count,ulong required_id_count); +int SetThreadSelectedCpuSets(HANDLE thread,const uint &cpu_set_ids,uint cpu_set_id_count); +int GetProcessShutdownParameters(uint &level,uint &flags); +int SetThreadDescription(HANDLE thread,const string thread_description); +int GetThreadDescription(HANDLE thread,string &thread_description); +#import +#import "advapi32.dll" +int CreateProcessAsUserW(HANDLE token,const string application_name,string command_line,PVOID process_attributes,PVOID thread_attributes,int inherit_handles,uint creation_flags,PVOID environment,const string current_directory,STARTUPINFOW &startup_info,PROCESS_INFORMATION &process_information); +int SetThreadToken(HANDLE thread,HANDLE token); +int OpenProcessToken(HANDLE process_handle,uint desired_access,HANDLE &token_handle); +int OpenThreadToken(HANDLE thread_handle,uint desired_access,int open_as_self,HANDLE &token_handle); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/securitybaseapi.mqh b/WinAPI/securitybaseapi.mqh new file mode 100644 index 0000000..7f291d8 --- /dev/null +++ b/WinAPI/securitybaseapi.mqh @@ -0,0 +1,119 @@ +//+------------------------------------------------------------------+ +//| securitybaseapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "advapi32.dll" +int AccessCheck(SECURITY_DESCRIPTOR &security_descriptor,HANDLE client_token,uint desired_access,GENERIC_MAPPING &generic_mapping,PRIVILEGE_SET &privilege_set,uint &privilege_set_length,uint &granted_access,int &access_status); +int AccessCheckAndAuditAlarmW(const string subsystem_name,PVOID handle_id,string object_type_name,string object_name,SECURITY_DESCRIPTOR &security_descriptor,uint desired_access,GENERIC_MAPPING &generic_mapping,int object_creation,uint &granted_access,int &access_status,int &generate_on_close); +int AccessCheckByType(SECURITY_DESCRIPTOR &security_descriptor,SID &principal_self_sid,HANDLE client_token,uint desired_access,OBJECT_TYPE_LIST &object_type_list,uint object_type_list_length,GENERIC_MAPPING &generic_mapping,PRIVILEGE_SET &privilege_set,uint &privilege_set_length,uint &granted_access,int &access_status); +int AccessCheckByTypeResultList(SECURITY_DESCRIPTOR &security_descriptor,SID &principal_self_sid,HANDLE client_token,uint desired_access,OBJECT_TYPE_LIST &object_type_list,uint object_type_list_length,GENERIC_MAPPING &generic_mapping,PRIVILEGE_SET &privilege_set,uint &privilege_set_length,uint &granted_access_list,uint &access_status_list); +int AccessCheckByTypeAndAuditAlarmW(const string subsystem_name,PVOID handle_id,const string object_type_name,const string object_name,SECURITY_DESCRIPTOR &security_descriptor,SID &principal_self_sid,uint desired_access,AUDIT_EVENT_TYPE audit_type,uint flags,OBJECT_TYPE_LIST &object_type_list,uint object_type_list_length,GENERIC_MAPPING &generic_mapping,int object_creation,uint &granted_access,int &access_status,int &generate_on_close); +int AccessCheckByTypeResultListAndAuditAlarmW(const string subsystem_name,PVOID handle_id,const string object_type_name,const string object_name,SECURITY_DESCRIPTOR &security_descriptor,SID &principal_self_sid,uint desired_access,AUDIT_EVENT_TYPE audit_type,uint flags,OBJECT_TYPE_LIST &object_type_list,uint object_type_list_length,GENERIC_MAPPING &generic_mapping,int object_creation,uint &granted_access_list,uint &access_status_list,int &generate_on_close); +int AccessCheckByTypeResultListAndAuditAlarmByHandleW(const string subsystem_name,PVOID handle_id,HANDLE client_token,const string object_type_name,const string object_name,SECURITY_DESCRIPTOR &security_descriptor,SID &principal_self_sid,uint desired_access,AUDIT_EVENT_TYPE audit_type,uint flags,OBJECT_TYPE_LIST &object_type_list,uint object_type_list_length,GENERIC_MAPPING &generic_mapping,int object_creation,uint &granted_access_list,uint &access_status_list,int &generate_on_close); +int AddAccessAllowedAce(ACL &acl,uint ace_revision,uint access_mask,SID &sid); +int AddAccessAllowedAceEx(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,SID &sid); +int AddAccessAllowedObjectAce(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,GUID &object_type_guid,GUID &inherited_object_type_guid,SID &sid); +int AddAccessDeniedAce(ACL &acl,uint ace_revision,uint access_mask,SID &sid); +int AddAccessDeniedAceEx(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,SID &sid); +int AddAccessDeniedObjectAce(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,GUID &object_type_guid,GUID &inherited_object_type_guid,SID &sid); +int AddAce(ACL &acl,uint ace_revision,uint starting_ace_index,PVOID ace_list,uint ace_list_length); +int AddAuditAccessAce(ACL &acl,uint ace_revision,uint access_mask,SID &sid,int audit_success,int audit_failure); +int AddAuditAccessAceEx(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,SID &sid,int audit_success,int audit_failure); +int AddAuditAccessObjectAce(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,GUID &object_type_guid,GUID &inherited_object_type_guid,SID &sid,int audit_success,int audit_failure); +int AddMandatoryAce(ACL &acl,uint ace_revision,uint ace_flags,uint mandatory_policy,SID &label_sid); +int AdjustTokenGroups(HANDLE token_handle,int reset_to_default,TOKEN_GROUPS &new_state,uint buffer_length,TOKEN_GROUPS &previous_state,uint &return_length); +int AdjustTokenPrivileges(HANDLE token_handle,int disable_all_privileges,TOKEN_PRIVILEGES &new_state,uint buffer_length,TOKEN_PRIVILEGES &previous_state,uint &return_length); +int AllocateAndInitializeSid(SID_IDENTIFIER_AUTHORITY &identifier_authority,uchar sub_authority_count,uint sub_authority0,uint sub_authority1,uint sub_authority2,uint sub_authority3,uint sub_authority4,uint sub_authority5,uint sub_authority6,uint sub_authority7,SID &sid); +int AllocateLocallyUniqueId(LUID &luid); +int AreAllAccessesGranted(uint granted_access,uint desired_access); +int AreAnyAccessesGranted(uint granted_access,uint desired_access); +int CheckTokenMembership(HANDLE token_handle,SID &sid_to_check,int &is_member); +int ConvertToAutoInheritPrivateObjectSecurity(SECURITY_DESCRIPTOR &parent_descriptor,SECURITY_DESCRIPTOR ¤t_security_descriptor,SECURITY_DESCRIPTOR &new_security_descriptor,GUID &object_type,uchar is_directory_object,GENERIC_MAPPING &generic_mapping); +int CopySid(uint destination_sid_length,SID &destination_sid,SID &source_sid); +int CreatePrivateObjectSecurity(SECURITY_DESCRIPTOR &parent_descriptor,SECURITY_DESCRIPTOR &creator_descriptor,SECURITY_DESCRIPTOR &new_descriptor,int is_directory_object,HANDLE token,GENERIC_MAPPING &generic_mapping); +int CreatePrivateObjectSecurityEx(SECURITY_DESCRIPTOR &parent_descriptor,SECURITY_DESCRIPTOR &creator_descriptor,SECURITY_DESCRIPTOR &new_descriptor,GUID &object_type,int is_container_object,uint auto_inherit_flags,HANDLE token,GENERIC_MAPPING &generic_mapping); +int CreatePrivateObjectSecurityWithMultipleInheritance(SECURITY_DESCRIPTOR &parent_descriptor,SECURITY_DESCRIPTOR &creator_descriptor,SECURITY_DESCRIPTOR &new_descriptor,GUID &object_types,uint guid_count,int is_container_object,uint auto_inherit_flags,HANDLE token,GENERIC_MAPPING &generic_mapping); +int CreateRestrictedToken(HANDLE existing_token_handle,uint flags,uint disable_sid_count,SID_AND_ATTRIBUTES &sids_to_disable,uint delete_privilege_count,LUID_AND_ATTRIBUTES &privileges_to_delete,uint restricted_sid_count,SID_AND_ATTRIBUTES &sids_to_restrict,HANDLE &new_token_handle); +int CreateWellKnownSid(WELL_KNOWN_SID_TYPE well_known_sid_type,SID &domain_sid,SID &sid,uint &sid); +int EqualDomainSid(SID &sid1,SID &sid2,int &equal); +int DeleteAce(ACL &acl,uint ace_index); +int DestroyPrivateObjectSecurity(SECURITY_DESCRIPTOR &object_descriptor); +int DuplicateToken(HANDLE existing_token_handle,SECURITY_IMPERSONATION_LEVEL impersonation_level,HANDLE &duplicate_token_handle); +int DuplicateTokenEx(HANDLE existing_token,uint desired_access,PVOID token_attributes,SECURITY_IMPERSONATION_LEVEL impersonation_level,TOKEN_TYPE token_type,HANDLE &new_token); +int EqualPrefixSid(SID &sid1,SID &sid2); +int EqualSid(SID &sid1,SID &sid2); +int FindFirstFreeAce(ACL &acl,PVOID &ace); +PVOID FreeSid(SID &sid); +int GetAce(ACL &acl,uint ace_index,PVOID &ace); +int GetAclInformation(ACL &acl,PVOID acl_information,uint acl_information_length,ACL_INFORMATION_CLASS acl_information_class); +int GetFileSecurityW(const string file_name,uint requested_information,SECURITY_DESCRIPTOR &security_descriptor,uint length,uint &length_needed); +int GetKernelObjectSecurity(HANDLE handle,uint requested_information,SECURITY_DESCRIPTOR &security_descriptor,uint length,uint &length_needed); +uint GetLengthSid(SID &sid); +int GetPrivateObjectSecurity(SECURITY_DESCRIPTOR &object_descriptor,uint security_information,SECURITY_DESCRIPTOR &resultant_descriptor,uint descriptor_length,uint &return_length); +int GetSecurityDescriptorControl(SECURITY_DESCRIPTOR &security_descriptor,ushort &control,uint &revision); +int GetSecurityDescriptorDacl(SECURITY_DESCRIPTOR &security_descriptor,int &dacl_present,ACL &dacl,int &dacl_defaulted); +int GetSecurityDescriptorGroup(SECURITY_DESCRIPTOR &security_descriptor,SID &group,int &group_defaulted); +uint GetSecurityDescriptorLength(SECURITY_DESCRIPTOR &security_descriptor); +int GetSecurityDescriptorOwner(SECURITY_DESCRIPTOR &security_descriptor,SID &owner,int &owner_defaulted); +uint GetSecurityDescriptorRMControl(SECURITY_DESCRIPTOR &security_descriptor,uchar &rm_control); +int GetSecurityDescriptorSacl(SECURITY_DESCRIPTOR &security_descriptor,int &sacl_present,ACL &sacl,int &sacl_defaulted); +PVOID GetSidIdentifierAuthority(SID &sid); +uint GetSidLengthRequired(uchar sub_authority_count); +PVOID GetSidSubAuthority(SID &sid,uint sub_authority); +PVOID GetSidSubAuthorityCount(SID &sid); +int GetTokenInformation(HANDLE token_handle,TOKEN_INFORMATION_CLASS token_information_class,PVOID &token_information,uint token_information_length,uint &return_length); +int GetWindowsAccountDomainSid(SID &sid,SID &domain_sid,uint &domain_sid); +int ImpersonateAnonymousToken(HANDLE thread_handle); +int ImpersonateLoggedOnUser(HANDLE token); +int ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL impersonation_level); +int InitializeAcl(ACL &acl,uint acl_length,uint acl_revision); +int InitializeSecurityDescriptor(SECURITY_DESCRIPTOR &security_descriptor,uint revision); +int InitializeSid(SID &sid,SID_IDENTIFIER_AUTHORITY &identifier_authority,uchar sub_authority_count); +int IsTokenRestricted(HANDLE token_handle); +int IsValidAcl(ACL &acl); +int IsValidSecurityDescriptor(SECURITY_DESCRIPTOR &security_descriptor); +int IsValidSid(SID &sid); +int IsWellKnownSid(SID &sid,WELL_KNOWN_SID_TYPE well_known_sid_type); +int MakeAbsoluteSD(SECURITY_DESCRIPTOR &self_relative_security_descriptor,SECURITY_DESCRIPTOR &absolute_security_descriptor,uint &absolute_security_descriptor_size,ACL &dacl,uint &dacl_size,ACL &sacl,uint &sacl_size,SID &owner,uint &owner_size,SID &primary_group,uint &primary_group_size); +int MakeSelfRelativeSD(SECURITY_DESCRIPTOR &absolute_security_descriptor,SECURITY_DESCRIPTOR &self_relative_security_descriptor,uint &buffer_length); +void MapGenericMask(uint &access_mask,GENERIC_MAPPING &generic_mapping); +int ObjectCloseAuditAlarmW(const string subsystem_name,PVOID handle_id,int generate_on_close); +int ObjectDeleteAuditAlarmW(const string subsystem_name,PVOID handle_id,int generate_on_close); +int ObjectOpenAuditAlarmW(const string subsystem_name,PVOID handle_id,string object_type_name,string object_name,SECURITY_DESCRIPTOR &security_descriptor,HANDLE client_token,uint desired_access,uint granted_access,PRIVILEGE_SET &privileges,int object_creation,int access_granted,int &generate_on_close); +int ObjectPrivilegeAuditAlarmW(const string subsystem_name,PVOID handle_id,HANDLE client_token,uint desired_access,PRIVILEGE_SET &privileges,int access_granted); +int PrivilegeCheck(HANDLE client_token,PRIVILEGE_SET &required_privileges,int &result); +int PrivilegedServiceAuditAlarmW(const string subsystem_name,const string service_name,HANDLE client_token,PRIVILEGE_SET &privileges,int access_granted); +void QuerySecurityAccessMask(uint security_information,uint &desired_access); +int RevertToSelf(void); +int SetAclInformation(ACL &acl,PVOID acl_information,uint acl_information_length,ACL_INFORMATION_CLASS acl_information_class); +int SetFileSecurityW(const string file_name,uint security_information,SECURITY_DESCRIPTOR &security_descriptor); +int SetKernelObjectSecurity(HANDLE handle,uint security_information,SECURITY_DESCRIPTOR &security_descriptor); +int SetPrivateObjectSecurity(uint security_information,SECURITY_DESCRIPTOR &modification_descriptor,SECURITY_DESCRIPTOR &objects_security_descriptor,GENERIC_MAPPING &generic_mapping,HANDLE token); +int SetPrivateObjectSecurityEx(uint security_information,SECURITY_DESCRIPTOR &modification_descriptor,SECURITY_DESCRIPTOR &objects_security_descriptor,uint auto_inherit_flags,GENERIC_MAPPING &generic_mapping,HANDLE token); +void SetSecurityAccessMask(uint security_information,uint &desired_access); +int SetSecurityDescriptorControl(SECURITY_DESCRIPTOR &security_descriptor,ushort control_bits_of_interest,ushort control_bits_to_set); +int SetSecurityDescriptorDacl(SECURITY_DESCRIPTOR &security_descriptor,int dacl_present,ACL &dacl,int dacl_defaulted); +int SetSecurityDescriptorGroup(SECURITY_DESCRIPTOR &security_descriptor,SID &group,int group_defaulted); +int SetSecurityDescriptorOwner(SECURITY_DESCRIPTOR &security_descriptor,SID &owner,int owner_defaulted); +uint SetSecurityDescriptorRMControl(SECURITY_DESCRIPTOR &security_descriptor,uchar &rm_control); +int SetSecurityDescriptorSacl(SECURITY_DESCRIPTOR &security_descriptor,int sacl_present,ACL &sacl,int sacl_defaulted); +int SetTokenInformation(HANDLE token_handle,TOKEN_INFORMATION_CLASS token_information_class,PVOID token_information,uint token_information_length); +int CveEventWrite(const string cve_id,const string additional_details); +#import + +#import "kernel32.dll" +int AddResourceAttributeAce(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,SID &sid,CLAIM_SECURITY_ATTRIBUTES_INFORMATION &attribute_info,uint &return_length); +int AddScopedPolicyIDAce(ACL &acl,uint ace_revision,uint ace_flags,uint access_mask,SID &sid); +int CheckTokenCapability(HANDLE token_handle,SID &capability_sid_to_check,int &has_capability); +int GetAppContainerAce(ACL &acl,uint starting_ace_index,PVOID &app_container_ace,uint &app_container_ace_index); +int CheckTokenMembershipEx(HANDLE token_handle,SID &sid_to_check,uint flags,int &is_member); +int SetCachedSigningLevel(HANDLE &source_files,uint source_file_count,uint flags,HANDLE target_file); +int GetCachedSigningLevel(HANDLE file,ulong flags,ulong signing_level,uchar &thumbprint[],ulong thumbprint_size,ulong thumbprint_algorithm); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/sysinfoapi.mqh b/WinAPI/sysinfoapi.mqh new file mode 100644 index 0000000..9aabc84 --- /dev/null +++ b/WinAPI/sysinfoapi.mqh @@ -0,0 +1,95 @@ +//+------------------------------------------------------------------+ +//| sysinfoapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//--- +enum COMPUTER_NAME_FORMAT + { + ComputerNameNetBIOS, + ComputerNameDnsHostname, + ComputerNameDnsDomain, + ComputerNameDnsFullyQualified, + ComputerNamePhysicalNetBIOS, + ComputerNamePhysicalDnsHostname, + ComputerNamePhysicalDnsDomain, + ComputerNamePhysicalDnsFullyQualified, + ComputerNameMax + }; +//--- +struct DUMMYSTRUCTNAME + { + uint dwOemId; + ushort wProcessorArchitecture; + ushort wReserved; + }; +//--- +struct MEMORYSTATUSEX + { + uint dwLength; + uint dwMemoryLoad; + ulong ullTotalPhys; + ulong ullAvailPhys; + ulong ullTotalPageFile; + ulong ullAvailPageFile; + ulong ullTotalVirtual; + ulong ullAvailVirtual; + ulong ullAvailExtendedVirtual; + }; +//--- +struct SYSTEM_INFO + { + uint dwOemId; + uint dwPageSize; + PVOID lpMinimumApplicationAddress; + PVOID lpMaximumApplicationAddress; + ulong dwActiveProcessorMask; + uint dwNumberOfProcessors; + uint dwProcessorType; + uint dwAllocationGranularity; + ushort wProcessorLevel; + ushort wProcessorRevision; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int GlobalMemoryStatusEx(MEMORYSTATUSEX &buffer); +void GetSystemInfo(SYSTEM_INFO &system_info); +void GetSystemTime(SYSTEMTIME &system_time); +void GetSystemTimeAsFileTime(FILETIME &system_time_as_file_time); +void GetLocalTime(SYSTEMTIME &system_time); +uint GetVersion(void); +int SetLocalTime(const SYSTEMTIME &system_time); +uint GetTickCount(void); +ulong GetTickCount64(void); +int GetSystemTimeAdjustment(uint &time_adjustment,uint &time_increment,int &time_adjustment_disabled); +uint GetSystemDirectoryW(ushort &buffer[],uint size); +uint GetWindowsDirectoryW(ushort &buffer[],uint size); +uint GetSystemWindowsDirectoryW(ushort &buffer[],uint size); +int GetComputerNameExW(COMPUTER_NAME_FORMAT name_type,ushort &buffer[],uint &size); +int SetComputerNameExW(COMPUTER_NAME_FORMAT name_type,const string buffer); +int SetSystemTime(const SYSTEMTIME &system_time); +int GetVersionExW(OSVERSIONINFOW &version_information); +int GetLogicalProcessorInformation(SYSTEM_LOGICAL_PROCESSOR_INFORMATION &buffer[],uint &returned_length); +int GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR_RELATIONSHIP relationship_type,SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX &buffer[],uint &returned_length); +void GetNativeSystemInfo(SYSTEM_INFO &system_info); +void GetSystemTimePreciseAsFileTime(FILETIME &system_time_as_file_time); +int GetProductInfo(uint os_major_version,uint os_minor_version,uint sp_major_version,uint sp_minor_version,uint &returned_product_type); +uint EnumSystemFirmwareTables(uint firmware_table_provider_signature,PVOID &firmware_table_enum_buffer,uint buffer_size); +uint EnumSystemFirmwareTables(uint firmware_table_provider_signature,uchar &firmware_table_enum_buffer[],uint buffer_size); +uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,PVOID firmware_table_buffer,uint buffer_size); +uint GetSystemFirmwareTable(uint firmware_table_provider_signature,uint firmware_table_id,uchar &firmware_table_buffer[],uint buffer_size); +int DnsHostnameToComputerNameExW(const string hostname,ushort &computer_name[],uint &size); +int GetPhysicallyInstalledSystemMemory(ulong &total_memory_in_kilobytes); +int SetComputerNameEx2W(COMPUTER_NAME_FORMAT name_type,uint flags,const string buffer); +int SetSystemTimeAdjustment(uint time_adjustment,int time_adjustment_disabled); +int InstallELAMCertificateInfo(HANDLE elam_file); +int GetProcessorSystemCycleTime(ushort group,PVOID &buffer,uint &returned_length); +int GetProcessorSystemCycleTime(ushort group,SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION &buffer[],uint &returned_length); +int SetComputerNameW(const string computer_name); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/winapi.mqh b/WinAPI/winapi.mqh new file mode 100644 index 0000000..19c4558 --- /dev/null +++ b/WinAPI/winapi.mqh @@ -0,0 +1,21 @@ +//+------------------------------------------------------------------+ +//| winapi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include "windef.mqh" +#include "winnt.mqh" +#include "fileapi.mqh" +#include "winbase.mqh" +#include "winuser.mqh" +#include "wingdi.mqh" +#include "winreg.mqh" +#include "handleapi.mqh" +#include "processthreadsapi.mqh" +#include "securitybaseapi.mqh" +#include "errhandlingapi.mqh" +#include "sysinfoapi.mqh" +#include "processenv.mqh" +#include "libloaderapi.mqh" +#include "memoryapi.mqh" +//+------------------------------------------------------------------+ diff --git a/WinAPI/winbase.mqh b/WinAPI/winbase.mqh new file mode 100644 index 0000000..fae57a1 --- /dev/null +++ b/WinAPI/winbase.mqh @@ -0,0 +1,814 @@ +//+------------------------------------------------------------------+ +//| WinBase.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include +#include + +//--- +#define OFS_MAXPATHNAME 128 +#define HW_PROFILE_GUIDLEN 39 +#define MAX_PROFILE_LEN 80 +#define RESTART_MAX_CMD_LINE 1024 + +//--- +enum COPYFILE2_COPY_PHASE + { + COPYFILE2_PHASE_NONE=0, + COPYFILE2_PHASE_PREPARE_SOURCE, + COPYFILE2_PHASE_PREPARE_DEST, + COPYFILE2_PHASE_READ_SOURCE, + COPYFILE2_PHASE_WRITE_DESTINATION, + COPYFILE2_PHASE_SERVER_COPY, + COPYFILE2_PHASE_NAMEGRAFT_COPY, + COPYFILE2_PHASE_MAX + }; +//--- +enum COPYFILE2_MESSAGE_ACTION + { + COPYFILE2_PROGRESS_CONTINUE=0, + COPYFILE2_PROGRESS_CANCEL, + COPYFILE2_PROGRESS_STOP, + COPYFILE2_PROGRESS_QUIET, + COPYFILE2_PROGRESS_PAUSE + }; +//--- +enum COPYFILE2_MESSAGE_TYPE + { + COPYFILE2_CALLBACK_NONE=0, + COPYFILE2_CALLBACK_CHUNK_STARTED, + COPYFILE2_CALLBACK_CHUNK_FINISHED, + COPYFILE2_CALLBACK_STREAM_STARTED, + COPYFILE2_CALLBACK_STREAM_FINISHED, + COPYFILE2_CALLBACK_POLL_CONTINUE, + COPYFILE2_CALLBACK_ERROR, + COPYFILE2_CALLBACK_MAX + }; +//--- +enum DEP_SYSTEM_POLICY_TYPE + { + DEPPolicyAlwaysOff=0, + DEPPolicyAlwaysOn, + DEPPolicyOptIn, + DEPPolicyOptOut, + DEPTotalPolicyCount + }; +//--- +enum FILE_ID_TYPE + { + FileIdType, + ObjectIdType, + ExtendedFileIdType, + MaximumFileIdType + }; +//--- +enum PRIORITY_HINT + { + IoPriorityHintVeryLow=0, + IoPriorityHintLow, + IoPriorityHintNormal, + MaximumIoPriorityHintType + }; +//--- +enum PROC_THREAD_ATTRIBUTE_NUM + { + ProcThreadAttributeParentProcess=0, + ProcThreadAttributeHandleList=2, + ProcThreadAttributeGroupAffinity=3, + ProcThreadAttributePreferredNode=4, + ProcThreadAttributeIdealProcessor=5, + ProcThreadAttributeUmsThread=6, + ProcThreadAttributeMitigationPolicy=7, + ProcThreadAttributeSecurityCapabilities=9, + ProcThreadAttributeProtectionLevel=11, + ProcThreadAttributeJobList=13, + ProcThreadAttributeChildProcessPolicy=14, + ProcThreadAttributeAllApplicationPackagesPolicy=15, + ProcThreadAttributeWin32kFilter=16, + ProcThreadAttributeSafeOpenPromptOriginClaim=17, + ProcThreadAttributeDesktopAppPolicy=18 + }; +//--- +struct ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA + { + PVOID lpInformation; + PVOID lpSectionBase; + uint ulSectionLength; + PVOID lpSectionGlobalDataBase; + uint ulSectionGlobalDataLength; + }; +//--- +struct ACTCTX_SECTION_KEYED_DATA + { + uint cbSize; + uint ulDataFormatVersion; + PVOID lpData; + uint ulLength; + PVOID lpSectionGlobalData; + uint ulSectionGlobalDataLength; + PVOID lpSectionBase; + uint ulSectionTotalLength; + HANDLE hActCtx; + uint ulAssemblyRosterIndex; + uint ulFlags; + ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata; + }; +//--- +struct ACTCTX_SECTION_KEYED_DATA_2600 + { + uint cbSize; + uint ulDataFormatVersion; + PVOID lpData; + uint ulLength; + PVOID lpSectionGlobalData; + uint ulSectionGlobalDataLength; + PVOID lpSectionBase; + uint ulSectionTotalLength; + HANDLE hActCtx; + uint ulAssemblyRosterIndex; + }; +//--- +struct ACTCTXW + { + uint cbSize; + uint dwFlags; + PVOID lpSource; + ushort wProcessorArchitecture; + ushort wLangId; + PVOID lpAssemblyDirectory; + PVOID lpResourceName; + PVOID lpApplicationName; + HANDLE hModule; + }; +//--- +struct ACTIVATION_CONTEXT_BASIC_INFORMATION + { + HANDLE hActCtx; + uint dwFlags; + }; +//--- +struct DCB + { + uint DCBlength; + uint BaudRate; + uint Flags; + ushort wReserved; + ushort XonLim; + ushort XoffLim; + uchar ByteSize; + uchar Parity; + uchar StopBits; + char XonChar; + char XoffChar; + char ErrorChar; + char EofChar; + char EvtChar; + ushort wReserved1; + }; +//--- +struct COMMCONFIG + { + uint dwSize; + ushort wVersion; + ushort wReserved; + DCB dcb; + uint dwProviderSubType; + uint dwProviderOffset; + uint dwProviderSize; + short wcProviderData[2]; + }; +//--- +struct COMMPROP + { + ushort wPacketLength; + ushort wPacketVersion; + uint dwServiceMask; + uint dwReserved1; + uint dwMaxTxQueue; + uint dwMaxRxQueue; + uint dwMaxBaud; + uint dwProvSubType; + uint dwProvCapabilities; + uint dwSettableParams; + uint dwSettableBaud; + ushort wSettableData; + ushort wSettableStopParity; + uint dwCurrentTxQueue; + uint dwCurrentRxQueue; + uint dwProvSpec1; + uint dwProvSpec2; + short wcProvChar[1]; + }; +//--- +struct COMMTIMEOUTS + { + uint ReadIntervalTimeout; + uint ReadTotalTimeoutMultiplier; + uint ReadTotalTimeoutConstant; + uint WriteTotalTimeoutMultiplier; + uint WriteTotalTimeoutConstant; + }; +//--- +struct COMSTAT + { + uint cbInQue; + uint cbOutQue; + }; +//--- +struct COPYFILE2_EXTENDED_PARAMETERS + { + uint dwSize; + uint dwCopyFlags; + PVOID pfCancel; + PVOID pProgressRoutine; + PVOID pvCallbackContext; + }; +//--- +struct EVENTLOG_FULL_INFORMATION + { + uint dwFull; + }; +//--- +struct FILE_ALIGNMENT_INFO: public FILE_INFO + { + uint AlignmentRequirement; + }; +//--- +struct FILE_ALLOCATION_INFO: public FILE_INFO + { + long AllocationSize; + }; +//--- +struct FILE_ATTRIBUTE_TAG_INFO: public FILE_INFO + { + uint FileAttributes; + uint ReparseTag; + }; +//--- +struct FILE_BASIC_INFO: public FILE_INFO + { + long CreationTime; + long LastAccessTime; + long LastWriteTime; + long ChangeTime; + uint FileAttributes; + }; +//--- +struct FILE_COMPRESSION_INFO: public FILE_INFO + { + long CompressedFileSize; + ushort CompressionFormat; + uchar CompressionUnitShift; + uchar ChunkShift; + uchar ClusterShift; + uchar Reserved[3]; + }; +//--- +struct FILE_DISPOSITION_INFO: public FILE_INFO + { + uchar DeleteFile; + }; +//--- +struct FILE_DISPOSITION_INFO_EX: public FILE_INFO + { + uint Flags; + }; +//--- +struct FILE_END_OF_FILE_INFO: public FILE_INFO + { + long EndOfFile; + }; +//--- +struct FILE_FULL_DIR_INFO: public FILE_INFO + { + uint NextEntryOffset; + uint FileIndex; + long CreationTime; + long LastAccessTime; + long LastWriteTime; + long ChangeTime; + long EndOfFile; + long AllocationSize; + uint FileAttributes; + uint FileNameLength; + uint EaSize; + short FileName[1]; + }; +//--- +struct FILE_ID_BOTH_DIR_INFO: public FILE_INFO + { + uint NextEntryOffset; + uint FileIndex; + long CreationTime; + long LastAccessTime; + long LastWriteTime; + long ChangeTime; + long EndOfFile; + long AllocationSize; + uint FileAttributes; + uint FileNameLength; + uint EaSize; + char ShortNameLength; + short ShortName[12]; + long FileId; + short FileName[1]; + }; +//--- +struct FILE_ID_EXTD_DIR_INFO: public FILE_INFO + { + uint NextEntryOffset; + uint FileIndex; + long CreationTime; + long LastAccessTime; + long LastWriteTime; + long ChangeTime; + long EndOfFile; + long AllocationSize; + uint FileAttributes; + uint FileNameLength; + uint EaSize; + uint ReparsePointTag; + FILE_ID_128 FileId; + short FileName[1]; + }; +//--- +struct FILE_ID_INFO: public FILE_INFO + { + ulong VolumeSerialNumber; + FILE_ID_128 FileId; + }; +//--- +struct FILE_IO_PRIORITY_HINT_INFO: public FILE_INFO + { + PRIORITY_HINT PriorityHint; + }; +//--- +struct FILE_NAME_INFO + { + uint FileNameLength; + short FileName[2]; + }; +//--- +struct FILE_STANDARD_INFO: public FILE_INFO + { + long AllocationSize; + long EndOfFile; + uint NumberOfLinks; + uchar DeletePending; + uchar Directory; + }; +//--- +struct FILE_STORAGE_INFO: public FILE_INFO + { + uint LogicalBytesPerSector; + uint PhysicalBytesPerSectorForAtomicity; + uint PhysicalBytesPerSectorForPerformance; + uint FileSystemEffectivePhysicalBytesPerSectorForAtomicity; + uint Flags; + uint ByteOffsetForSectorAlignment; + uint ByteOffsetForPartitionAlignment; + }; +//--- +struct FILE_STREAM_INFO: public FILE_INFO + { + uint NextEntryOffset; + uint StreamNameLength; + long StreamSize; + long StreamAllocationSize; + short StreamName[1]; + }; +//--- +struct HW_PROFILE_INFOW + { + uint dwDockInfo; + short szHwProfileGuid[HW_PROFILE_GUIDLEN]; + short szHwProfileName[MAX_PROFILE_LEN]; + }; +//--- +struct JIT_DEBUG_INFO + { + uint dwSize; + uint dwProcessorArchitecture; + uint dwThreadID; + uint dwReserved0; + ulong lpExceptionAddress; + ulong lpExceptionRecord; + ulong lpContextRecord; + }; +//--- +struct MEMORYSTATUS + { + uint dwLength; + uint dwMemoryLoad; + ulong dwTotalPhys; + ulong dwAvailPhys; + ulong dwTotalPageFile; + ulong dwAvailPageFile; + ulong dwTotalVirtual; + ulong dwAvailVirtual; + }; +//--- +struct OFSTRUCT + { + uchar cBytes; + uchar fFixedDisk; + ushort nErrCode; + ushort Reserved1; + ushort Reserved2; + char szPathName[OFS_MAXPATHNAME]; + }; +//--- +struct OPERATION_END_PARAMETERS + { + uint Version; + uint OperationId; + uint Flags; + }; +//--- +struct OPERATION_START_PARAMETERS + { + uint Version; + uint OperationId; + uint Flags; + }; +//--- +struct SYSTEM_POWER_STATUS + { + uchar ACLineStatus; + uchar BatteryFlag; + uchar BatteryLifePercent; + uchar SystemStatusFlag; + uint BatteryLifeTime; + uint BatteryFullLifeTime; + }; +//--- +struct UMS_SCHEDULER_STARTUP_INFO + { + uint UmsVersion; + PVOID CompletionList; + PVOID SchedulerProc; + PVOID SchedulerParam; + }; +//--- +struct WIN32_STREAM_ID + { + uint dwStreamId; + uint dwStreamAttributes; + long Size; + uint dwStreamNameSize; + }; +//--- +struct UMS_SYSTEM_THREAD_INFORMATION + { + uint UmsVersion; + uint ThreadUmsFlags; + }; +//--- +struct FILE_ID_DESCRIPTOR + { + uint dwSize; + FILE_ID_TYPE Type; + long FileId; + }; +//--- +struct SYSTEMTIME + { + ushort wYear; + ushort wMonth; + ushort wDayOfWeek; + ushort wDay; + ushort wHour; + ushort wMinute; + ushort wSecond; + ushort wMilliseconds; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +int ActivateActCtx(HANDLE act_ctx,PVOID &cookie); +int ActivateActCtx(ACTCTXW &act_ctx,PVOID &cookie); +ushort AddAtomW(const string str); +int AddIntegrityLabelToBoundaryDescriptor(HANDLE &BoundaryDescriptor,SID &IntegrityLabel); +void AddRefActCtx(HANDLE act_ctx); +void AddRefActCtx(ACTCTXW &act_ctx); +int AddSecureMemoryCacheCallback(PVOID call_back); +void ApplicationRecoveryFinished(int success); +int ApplicationRecoveryInProgress(int &cancelled); +int BackupRead(HANDLE file,uchar &buffer[],uint number_of_bytes_to_read,uint &number_of_bytes_read,int abort,int process_security,PVOID &context); +int BackupSeek(HANDLE file,uint low_bytes_to_seek,uint high_bytes_to_seek,uint &low_byte_seeked,uint &high_byte_seeked,PVOID &context); +int BackupWrite(HANDLE file,uchar &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,int abort,int process_security,PVOID &context); +HANDLE BeginUpdateResourceW(const string file_name,int delete_existing_resources); +int BindIoCompletionCallback(HANDLE FileHandle,PVOID Function,uint Flags); +int BuildCommDCBAndTimeoutsW(const string def,DCB &lpDCB,COMMTIMEOUTS &comm_timeouts); +int BuildCommDCBW(const string def,DCB &lpDCB); +int CancelDeviceWakeupRequest(HANDLE device); +int CancelTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer); +int CheckNameLegalDOS8Dot3W(const string name,char &oem_name[],uint oem_name_size,int &name_contains_spaces,int &name_legal); +int ClearCommBreak(HANDLE file); +int ClearCommError(HANDLE file,uint &errors,COMSTAT &stat); +int CommConfigDialogW(const string name,HANDLE wnd,COMMCONFIG &lpCC); +int ConvertFiberToThread(void); +PVOID ConvertThreadToFiber(PVOID parameter); +PVOID ConvertThreadToFiberEx(PVOID parameter,uint flags); +int CopyContext(CONTEXT &Destination,uint ContextFlags,CONTEXT &Source); +int CopyFile2(const string existing_file_name,const string new_file_name,COPYFILE2_EXTENDED_PARAMETERS &extended_parameters); +int CopyFileExW(const string existing_file_name,const string new_file_name,PVOID progress_routine,PVOID data,int &cancel,uint copy_flags); +int CopyFileTransactedW(const string existing_file_name,const string new_file_name,PVOID progress_routine,PVOID data,int &cancel,uint copy_flags,HANDLE transaction); +int CopyFileW(const string existing_file_name,const string new_file_name,int fail_if_exists); +HANDLE CreateActCtxW(const ACTCTXW &act_ctx); +int CreateDirectoryExW(const string template_directory,const string new_directory,PVOID security_attributes); +int CreateDirectoryTransactedW(const string template_directory,const string new_directory,PVOID security_attributes,HANDLE transaction); +PVOID CreateFiber(ulong stack_size,PVOID start_address,PVOID parameter); +PVOID CreateFiberEx(ulong stack_commit_size,ulong stack_reserve_size,uint flags,PVOID start_address,PVOID parameter); +HANDLE CreateFileTransactedW(const string file_name,uint desired_access,uint share_mode,PVOID security_attributes,uint creation_disposition,uint flags_and_attributes,HANDLE template_file,HANDLE transaction,ushort &mini_version,PVOID extended_parameter); +int CreateHardLinkTransactedW(const string file_name,const string existing_file_name,PVOID security_attributes,HANDLE transaction); +int CreateHardLinkW(const string file_name,const string existing_file_name,PVOID security_attributes); +int CreateJobSet(uint NumJob,JOB_SET_ARRAY &UserJobSet,uint Flags); +HANDLE CreateMailslotW(const string name,uint max_message_size,uint read_timeout,PVOID security_attributes); +uchar CreateSymbolicLinkTransactedW(const string symlink_file_name,const string target_file_name,uint flags,HANDLE transaction); +uchar CreateSymbolicLinkW(const string symlink_file_name,const string target_file_name,uint flags); +uint CreateTapePartition(HANDLE device,uint partition_method,uint count,uint size); +int CreateUmsCompletionList(PVOID &UmsCompletionList); +int CreateUmsThreadContext(PVOID &ums_thread); +int DeactivateActCtx(uint flags,ulong cookie); +int DebugBreakProcess(HANDLE Process); +int DebugSetProcessKillOnExit(int KillOnExit); +ushort DeleteAtom(ushort atom); +void DeleteFiber(PVOID fiber); +int DeleteFileTransactedW(const string file_name,HANDLE transaction); +int DeleteTimerQueue(HANDLE TimerQueue); +int DeleteUmsCompletionList(PVOID UmsCompletionList); +int DeleteUmsThreadContext(PVOID UmsThread); +int DequeueUmsCompletionListItems(PVOID UmsCompletionList,uint WaitTimeOut,PVOID &UmsThreadList); +uint DisableThreadProfiling(HANDLE PerformanceDataHandle); +int DnsHostnameToComputerNameW(const string hostname,ushort &computer_name[],uint &size); +int DosDateTimeToFileTime(ushort fat_date,ushort fat_time,FILETIME &file_time); +uint EnableThreadProfiling(HANDLE ThreadHandle,uint Flags,ulong HardwareCounters,HANDLE &PerformanceDataHandle); +int EndUpdateResourceW(HANDLE update,int discard); +int EnterUmsSchedulingMode(UMS_SCHEDULER_STARTUP_INFO &SchedulerStartupInfo); +int EnumResourceLanguagesW(HANDLE module,const string type,const string name,PVOID enum_func,long param); +int EnumResourceTypesW(HANDLE module,PVOID enum_func,long param); +uint EraseTape(HANDLE device,uint erase_type,int immediate); +int EscapeCommFunction(HANDLE file,uint func); +int ExecuteUmsThread(PVOID UmsThread); +void FatalExit(int ExitCode); +int FileTimeToDosDateTime(FILETIME &file_time,ushort &fat_date,ushort &fat_time); +int FindActCtxSectionGuid(uint flags,const GUID &extension_guid[],uint section_id,const GUID &guid_to_find[],ACTCTX_SECTION_KEYED_DATA &ReturnedData); +int FindActCtxSectionStringW(uint flags,const GUID &extension_guid[],uint section_id,const string string_to_find,ACTCTX_SECTION_KEYED_DATA &ReturnedData); +ushort FindAtomW(const string str); +HANDLE FindFirstFileNameTransactedW(const string file_name,uint flags,uint &StringLength,string LinkName,HANDLE transaction); +HANDLE FindFirstFileTransactedW(const string file_name,FINDEX_INFO_LEVELS info_level_id,FIND_DATAW &find_file_data,FINDEX_SEARCH_OPS search_op,PVOID search_filter,uint additional_flags,HANDLE transaction); +HANDLE FindFirstStreamTransactedW(const string file_name,STREAM_INFO_LEVELS InfoLevel,FIND_STREAM_DATA &find_stream_data,uint flags,HANDLE transaction); +HANDLE FindFirstVolumeMountPointW(const string root_path_name,ushort &volume_mount_point[],uint buffer_length); +int FindNextVolumeMountPointW(HANDLE find_volume_mount_point,string volume_mount_point,uint buffer_length); +int FindVolumeMountPointClose(HANDLE find_volume_mount_point); +uint FormatMessageW(uint flags,const uchar &source[],uint message_id,uint language_id,ushort &buffer[],uint size,PVOID &Arguments[]); +uint GetActiveProcessorCount(ushort GroupNumber); +ushort GetActiveProcessorGroupCount(void); +int GetApplicationRecoveryCallback(HANDLE process,PVOID &recovery_callback,PVOID ¶meter,uint &ping_interval,uint &flags); +int GetApplicationRestartSettings(HANDLE process,ushort &commandline[],uint &size,uint &flags); +uint GetAtomNameW(ushort atom,ushort &buffer[],int size); +int GetBinaryTypeW(const string application_name,uint &binary_type); +int GetCommConfig(HANDLE comm_dev,COMMCONFIG &lpCC,uint &size); +int GetCommMask(HANDLE file,uint &evt_mask); +int GetCommModemStatus(HANDLE file,uint &modem_stat); +int GetCommProperties(HANDLE file,COMMPROP &comm_prop); +int GetCommState(HANDLE file,DCB &lpDCB); +int GetCommTimeouts(HANDLE file,COMMTIMEOUTS &comm_timeouts); +uint GetCompressedFileSizeTransactedW(const string file_name,uint &file_size_high,HANDLE transaction); +int GetComputerNameW(ushort &buffer[],uint &size); +int GetCurrentActCtx(HANDLE &act_ctx); +int GetCurrentActCtx(ACTCTXW &act_ctx); +PVOID GetCurrentUmsThread(void); +int GetDefaultCommConfigW(const string name,COMMCONFIG &lpCC,uint &size); +int GetDevicePowerState(HANDLE device,int &on); +uint GetDllDirectoryW(uint buffer_length,ushort &buffer[]); +ulong GetEnabledXStateFeatures(void); +int GetFileAttributesTransactedW(const string file_name,GET_FILEEX_INFO_LEVELS info_level_id,PVOID file_information,HANDLE transaction); +int GetFileBandwidthReservation(HANDLE file,uint &period_milliseconds,uint &bytes_per_period,int &discardable,uint &transfer_size,uint &num_outstanding_requests); +int GetFileInformationByHandleEx(HANDLE file,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,PVOID file_information,uint buffer_size); +int GetFileInformationByHandleEx(HANDLE file,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,uchar &file_information[],uint buffer_size); +uint GetFirmwareEnvironmentVariableExW(const string name,const string guid,PVOID buffer,uint size,uint &attribubutes); +uint GetFirmwareEnvironmentVariableW(const string name,const string guid,PVOID buffer,uint size); +int GetFirmwareType(FIRMWARE_TYPE &FirmwareType); +uint GetFullPathNameTransactedW(const string file_name,uint buffer_length,string buffer,string &file_part,HANDLE transaction); +uint GetLongPathNameTransactedW(const string short_path,string long_path,uint buffer,HANDLE transaction); +int GetMailslotInfo(HANDLE mailslot,uint &max_message_size,uint &next_size,uint &message_count,uint &read_timeout); +uint GetMaximumProcessorCount(ushort GroupNumber); +ushort GetMaximumProcessorGroupCount(void); +int GetNamedPipeClientProcessId(HANDLE Pipe,uint &ClientProcessId); +int GetNamedPipeClientSessionId(HANDLE Pipe,uint &ClientSessionId); +int GetNamedPipeServerProcessId(HANDLE Pipe,uint &ServerProcessId); +int GetNamedPipeServerSessionId(HANDLE Pipe,uint &ServerSessionId); +PVOID GetNextUmsListItem(PVOID UmsContext); +int GetNumaAvailableMemoryNode(uchar Node,ulong &AvailableBytes); +int GetNumaAvailableMemoryNodeEx(ushort Node,ulong &AvailableBytes); +int GetNumaNodeNumberFromHandle(HANDLE file,ushort &NodeNumber); +int GetNumaNodeProcessorMask(uchar Node,ulong &ProcessorMask); +int GetNumaProcessorNode(uchar Processor,uchar &NodeNumber); +int GetNumaProcessorNodeEx(PROCESSOR_NUMBER &Processor,ushort &NodeNumber); +int GetNumaProximityNode(uint ProximityId,uchar &NodeNumber); +uint GetPrivateProfileIntW(const string app_name,const string key_name,int default_value,const string file_name); +uint GetPrivateProfileSectionNamesW(string return_buffer,uint size,const string file_name); +uint GetPrivateProfileSectionW(const string app_name,string returned_string,uint size,const string file_name); +uint GetPrivateProfileStringW(const string app_name,const string key_name,const string default_value,string returned_string,uint size,const string file_name); +int GetPrivateProfileStructW(const string section,const string key,PVOID struct_obj,uint size_struct,const string file); +int GetProcessAffinityMask(HANDLE process,ulong &process_affinity_mask,ulong &system_affinity_mask); +int GetProcessDEPPolicy(HANDLE process,uint &flags,int &permanent); +int GetProcessIoCounters(HANDLE process,IO_COUNTERS &io_counters); +int GetProcessWorkingSetSize(HANDLE process,ulong &minimum_working_set_size,ulong &maximum_working_set_size); +uint GetProfileIntW(const string app_name,const string key_name,int default_value); +uint GetProfileSectionW(const string app_name,string returned_string,uint size); +uint GetProfileStringW(const string app_name,const string key_name,const string default_value,string returned_string,uint size); +DEP_SYSTEM_POLICY_TYPE GetSystemDEPPolicy(void); +int GetSystemPowerStatus(SYSTEM_POWER_STATUS &system_power_status); +int GetSystemRegistryQuota(uint "a_allowed,uint "a_used); +uint GetTapeParameters(HANDLE device,uint operation,uint &size,PVOID tape_information); +uint GetTapePosition(HANDLE device,uint position_type,uint &partition,uint &offset_low,uint &offset_high); +uint GetTapeStatus(HANDLE device); +int GetThreadSelectorEntry(HANDLE thread,uint selector,LDT_ENTRY &selector_entry); +int GetUmsCompletionListEvent(PVOID UmsCompletionList,HANDLE &UmsCompletionEvent); +int GetUmsSystemThreadInformation(HANDLE ThreadHandle,UMS_SYSTEM_THREAD_INFORMATION &SystemThreadInfo); +int GetXStateFeaturesMask(CONTEXT &Context,ulong &FeatureMask); +ushort GlobalAddAtomExW(const string str,uint Flags); +ushort GlobalAddAtomW(const string str); +HANDLE GlobalAlloc(uint flags,ulong bytes); +ulong GlobalCompact(uint min_free); +ushort GlobalDeleteAtom(ushort atom); +ushort GlobalFindAtomW(const string str); +void GlobalFix(HANDLE mem); +uint GlobalFlags(HANDLE mem); +HANDLE GlobalFree(HANDLE mem); +uint GlobalGetAtomNameW(ushort atom,ushort &buffer[],int size); +HANDLE GlobalHandle(const PVOID mem); +PVOID GlobalLock(HANDLE mem); +void GlobalMemoryStatus(MEMORYSTATUS &buffer); +HANDLE GlobalReAlloc(HANDLE mem,ulong bytes,uint flags); +ulong GlobalSize(HANDLE mem); +void GlobalUnfix(HANDLE mem); +int GlobalUnlock(HANDLE mem); +int GlobalUnWire(HANDLE mem); +PVOID GlobalWire(HANDLE mem); +int InitAtomTable(uint size); +int InitializeContext(uchar &Buffer[],uint ContextFlags,CONTEXT &Context,uint &ContextLength); +int InitializeContext(PVOID Buffer,uint ContextFlags,CONTEXT &Context,uint &ContextLength); +int IsBadCodePtr(PVOID lpfn); +int IsBadHugeReadPtr(PVOID lp,ulong ucb); +int IsBadHugeWritePtr(PVOID lp,ulong ucb); +int IsBadReadPtr(PVOID lp,ulong ucb); +int IsBadStringPtrW(const string lpsz,ulong max); +int IsBadWritePtr(PVOID lp,ulong ucb); +int IsNativeVhdBoot(int &NativeVhdBoot); +int IsSystemResumeAutomatic(void); +HANDLE LoadPackagedLibrary(const string lib_file_name,uint Reserved); +HANDLE LocalAlloc(uint flags,ulong bytes); +ulong LocalCompact(uint min_free); +uint LocalFlags(HANDLE mem); +HANDLE LocalFree(HANDLE mem); +HANDLE LocalHandle(const PVOID mem); +PVOID LocalLock(HANDLE mem); +HANDLE LocalReAlloc(HANDLE mem,ulong bytes,uint flags); +ulong LocalShrink(HANDLE mem,uint new_size); +ulong LocalSize(HANDLE mem); +int LocalUnlock(HANDLE mem); +PVOID LocateXStateFeature(CONTEXT &Context,uint FeatureId,uint &Length); +string lstrcatW(ushort &string1[],const string string2); +int lstrcmpiW(const string string1,const string string2); +int lstrcmpW(const string string1,const string string2); +string lstrcpynW(ushort &string1[],const string string2,int max_length); +string lstrcpyW(ushort &string1[],const string string2); +int lstrlenW(const string str); +int MapUserPhysicalPagesScatter(PVOID &VirtualAddresses[],ulong NumberOfPages,ulong &PageArray[]); +PVOID MapViewOfFileExNuma(HANDLE file_mapping_object,uint desired_access,uint file_offset_high,uint file_offset_low,ulong number_of_bytes_to_map,PVOID base_address,uint preferred); +int MoveFileExW(const string existing_file_name,const string new_file_name,uint flags); +int MoveFileTransactedW(const string existing_file_name,const string new_file_name,PVOID progress_routine,PVOID data,uint flags,HANDLE transaction); +int MoveFileW(const string existing_file_name,const string new_file_name); +int MoveFileWithProgressW(const string existing_file_name,const string new_file_name,PVOID progress_routine,PVOID data,uint flags); +int MulDiv(int number,int numerator,int denominator); +HANDLE OpenFileById(HANDLE volume_hint,FILE_ID_DESCRIPTOR &file_id,uint desired_access,uint share_mode,PVOID security_attributes,uint flags_and_attributes); +int PowerClearRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); +HANDLE PowerCreateRequest(REASON_CONTEXT &Context); +int PowerSetRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); +uint PrepareTape(HANDLE device,uint operation,int immediate); +int PulseEvent(HANDLE event); +int PurgeComm(HANDLE file,uint flags); +int QueryActCtxSettingsW(uint flags,HANDLE act_ctx,const string name_space,const string name,string buffer,ulong buffer,ulong &written_or_required); +int QueryActCtxSettingsW(uint flags,ACTCTXW &act_ctx,const string name_space,const string name,string buffer,ulong buffer,ulong &written_or_required); +int QueryActCtxW(uint flags,HANDLE act_ctx,PVOID sub_instance,uint info_class,PVOID buffer,ulong buffer,ulong &written_or_required); +int QueryActCtxW(uint flags,ACTCTXW &act_ctx,PVOID sub_instance,uint info_class,PVOID buffer,ulong buffer,ulong &written_or_required); +int QueryFullProcessImageNameW(HANDLE process,uint flags,string exe_name,uint &size); +uint QueryThreadProfiling(HANDLE ThreadHandle,uchar &Enabled); +int QueryUmsThreadInformation(PVOID UmsThread,RTL_UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,uint UmsThreadInformationLength,uint &ReturnLength); +int ReadDirectoryChangesExW(HANDLE directory,PVOID buffer,uint buffer_length,int watch_subtree,uint notify_filter,uint &bytes_returned,OVERLAPPED &overlapped,PVOID completion_routine,READ_DIRECTORY_NOTIFY_INFORMATION_CLASS ReadDirectoryNotifyInformationClass); +int ReadDirectoryChangesW(HANDLE directory,PVOID buffer,uint buffer_length,int watch_subtree,uint notify_filter,uint &bytes_returned,OVERLAPPED &overlapped,PVOID completion_routine); +uint ReadThreadProfilingData(HANDLE PerformanceDataHandle,uint Flags,PERFORMANCE_DATA &PerformanceData); +int RegisterApplicationRecoveryCallback(PVOID recovey_callback,PVOID parameter,uint ping_interval,uint flags); +int RegisterApplicationRestart(const string commandline,uint flags); +int RegisterWaitForSingleObject(HANDLE &new_wait_object,HANDLE object,PVOID Callback,PVOID Context,uint milliseconds,uint flags); +void ReleaseActCtx(HANDLE act_ctx); +void ReleaseActCtx(ACTCTXW &act_ctx); +int RemoveDirectoryTransactedW(const string path_name,HANDLE transaction); +int RemoveSecureMemoryCacheCallback(PVOID call_back); +HANDLE ReOpenFile(HANDLE original_file,uint desired_access,uint share_mode,uint flags_and_attributes); +int ReplaceFileW(const string replaced_file_name,const string replacement_file_name,const string backup_file_name,uint replace_flags,PVOID exclude,PVOID reserved); +int ReplacePartitionUnit(string TargetPartition,string SparePartition,uint Flags); +int RequestDeviceWakeup(HANDLE device); +int RequestWakeupLatency(LATENCY_TIME latency); +void RestoreLastError(uint err_code); +int SetCommBreak(HANDLE file); +int SetCommConfig(HANDLE comm_dev,COMMCONFIG &lpCC,uint size); +int SetCommMask(HANDLE file,uint evt_mask); +int SetCommState(HANDLE file,DCB &lpDCB); +int SetCommTimeouts(HANDLE file,COMMTIMEOUTS &comm_timeouts); +int SetDefaultCommConfigW(const string name,COMMCONFIG &lpCC,uint size); +int SetDllDirectoryW(const string path_name); +int SetFileAttributesTransactedW(const string file_name,uint file_attributes,HANDLE transaction); +int SetFileBandwidthReservation(HANDLE file,uint period_milliseconds,uint bytes_per_period,int discardable,uint &transfer_size,uint &num_outstanding_requests); +int SetFileCompletionNotificationModes(HANDLE FileHandle,uchar Flags); +int SetFileShortNameW(HANDLE file,const string short_name); +int SetFirmwareEnvironmentVariableExW(const string name,const string guid,PVOID value,uint size,uint attributes); +int SetFirmwareEnvironmentVariableW(const string name,const string guid,PVOID value,uint size); +uint SetHandleCount(uint number); +int SetMailslotInfo(HANDLE mailslot,uint read_timeout); +int SetMessageWaitingIndicator(HANDLE msg_indicator,uint msg_count); +int SetProcessAffinityMask(HANDLE process,PVOID process_affinity_mask); +int SetProcessDEPPolicy(uint flags); +int SetProcessWorkingSetSize(HANDLE process,ulong minimum_working_set_size,ulong maximum_working_set_size); +int SetSearchPathMode(uint flags); +int SetSystemPowerState(int suspend,int force); +uint SetTapeParameters(HANDLE device,uint operation,PVOID tape_information); +uint SetTapePosition(HANDLE device,uint position_method,uint partition,uint offset_low,uint offset_high,int immediate); +PVOID SetThreadAffinityMask(HANDLE thread,PVOID thread_affinity_mask); +uint SetThreadExecutionState(uint flags); +HANDLE SetTimerQueueTimer(HANDLE TimerQueue,PVOID Callback,PVOID Parameter,uint DueTime,uint Period,int PreferIo); +int SetUmsThreadInformation(PVOID UmsThread,RTL_UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,uint UmsThreadInformationLength); +int SetupComm(HANDLE file,uint in_queue,uint out_queue); +int SetVolumeLabelW(const string root_path_name,const string volume_name); +int SetVolumeMountPointW(const string volume_mount_point,const string volume_name); +int SetXStateFeaturesMask(CONTEXT &Context,ulong FeatureMask); +uint SignalObjectAndWait(HANDLE object_to_signal,HANDLE object_to_wait_on,uint milliseconds,int alertable); +void SwitchToFiber(PVOID fiber); +int TransmitCommChar(HANDLE file,char symbol); +int UmsThreadYield(PVOID SchedulerParam); +int UnregisterApplicationRecoveryCallback(void); +int UnregisterApplicationRestart(void); +int UnregisterWait(HANDLE WaitHandle); +int UpdateResourceW(HANDLE update,const string type,const string name,ushort &language,PVOID data,uint cb); +int VerifyVersionInfoW(OSVERSIONINFOEXW &version_information,uint type_mask,ulong condition_mask); +int WaitCommEvent(HANDLE file,uint &evt_mask,OVERLAPPED &overlapped); +uchar Wow64EnableWow64FsRedirection(uchar Wow64FsEnableRedirection); +int Wow64GetThreadContext(HANDLE thread,CONTEXT &context); +int Wow64GetThreadSelectorEntry(HANDLE thread,uint selector,LDT_ENTRY &selector_entry); +int Wow64SetThreadContext(HANDLE thread,CONTEXT &context); +uint Wow64SuspendThread(HANDLE thread); +int WritePrivateProfileSectionW(const string app_name,const string str,const string file_name); +int WritePrivateProfileStringW(const string app_name,const string key_name,const string str,const string file_name); +int WritePrivateProfileStructW(const string section,const string key,PVOID struct_obj,uint size_struct,const string file); +int WriteProfileSectionW(const string app_name,const string str); +int WriteProfileStringW(const string app_name,const string key_name,const string str); +uint WriteTapemark(HANDLE device,uint tapemark_type,uint tapemark_count,int immediate); +uint WTSGetActiveConsoleSessionId(void); +int ZombifyActCtx(HANDLE act_ctx); +int ZombifyActCtx(ACTCTXW &act_ctx); +#import + +#import "advapi32.dll" +int AddConditionalAce(ACL &acl,uint ace_revision,uint AceFlags,uchar AceType,uint AccessMask,SID &sid,string ConditionStr,uint &ReturnLength); +int BackupEventLogW(HANDLE event_log,const string backup_file_name); +int ClearEventLogW(HANDLE event_log,const string backup_file_name); +void CloseEncryptedFileRaw(PVOID context); +int CloseEventLog(HANDLE event_log); +int DecryptFileW(const string file_name,uint reserved); +int DeregisterEventSource(HANDLE event_log); +int EncryptFileW(const string file_name); +int FileEncryptionStatusW(const string file_name,uint &status); +int GetCurrentHwProfileW(HW_PROFILE_INFOW &hw_profile_info); +int GetEventLogInformation(HANDLE event_log,uint info_level,PVOID buffer,uint buf_size,uint &bytes_needed); +int GetNumberOfEventLogRecords(HANDLE event_log,uint &NumberOfRecords); +int GetOldestEventLogRecord(HANDLE event_log,uint &OldestRecord); +int GetUserNameW(string buffer,uint &buffer); +int IsTextUnicode(PVOID lpv,int size,int &result); +int IsTokenUntrusted(HANDLE TokenHandle); +int LogonUserExW(const string username,const string domain,const string password,uint logon_type,uint logon_provider,HANDLE &token,PVOID &logon_sid,PVOID &profile_buffer,uint &profile_length,QUOTA_LIMITS "a_limits); +int LogonUserW(const string username,const string domain,const string password,uint logon_type,uint logon_provider,HANDLE &token); +int LookupAccountNameW(const string system_name,const string account_name,SID &Sid,uint &sid,string ReferencedDomainName,uint &referenced_domain_name,SID_NAME_USE &use); +int LookupAccountSidW(const string system_name,SID &Sid,string Name,uint &name,string ReferencedDomainName,uint &referenced_domain_name,SID_NAME_USE &use); +int LookupPrivilegeDisplayNameW(const string system_name,const string name,string display_name,uint &display_name,uint &language_id); +int LookupPrivilegeNameW(const string system_name,LUID &luid,string name,uint &name); +int LookupPrivilegeValueW(const string system_name,const string name,LUID &luid); +int NotifyChangeEventLog(HANDLE event_log,HANDLE event); +HANDLE OpenBackupEventLogW(const string lpUNCServerName,const string file_name); +uint OpenEncryptedFileRawW(const string file_name,uint flags,PVOID &context); +HANDLE OpenEventLogW(const string lpUNCServerName,const string source_name); +int OperationEnd(OPERATION_END_PARAMETERS &OperationEndParams); +int OperationStart(OPERATION_START_PARAMETERS &OperationStartParams); +uint ReadEncryptedFileRaw(PVOID export_callback,PVOID callback_context,PVOID context); +int ReadEventLogW(HANDLE event_log,uint read_flags,uint record_offset,PVOID buffer,uint number_of_bytes_to_read,uint &bytes_read,uint &min_number_of_bytes_needed); +HANDLE RegisterEventSourceW(const string lpUNCServerName,const string source_name); +int ReportEventW(HANDLE event_log,ushort &type,ushort &category,uint dwEventID,SID &user_sid,ushort &num_strings,uint data_size,const string &strings[],PVOID raw_data); +uint WriteEncryptedFileRaw(PVOID import_callback,PVOID callback_context,PVOID context); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/windef.mqh b/WinAPI/windef.mqh new file mode 100644 index 0000000..5ee5e11 --- /dev/null +++ b/WinAPI/windef.mqh @@ -0,0 +1,325 @@ +//+------------------------------------------------------------------+ +//| windef.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#define HANDLE long +#define PVOID long +//--- +#define ANYSIZE_ARRAY 1 +#define MAX_BREAKPOINTS 8 +#define MAX_WATCHPOINTS 2 +#define MAX_HW_COUNTERS 16 +#define MAX_PATH 260 +#define EXCEPTION_MAXIMUM_PARAMETERS 15 + +//--- +enum LATENCY_TIME + { + LT_DONT_CARE, + LT_LOWEST_LATENCY + }; +//--- +enum GET_FILEEX_INFO_LEVELS + { + GetFileExInfoStandard, + GetFileExMaxInfoLevel + }; +//--- +enum FINDEX_INFO_LEVELS + { + FindExInfoStandard, + FindExInfoBasic, + FindExInfoMaxInfoLevel + }; +//--- +enum FINDEX_SEARCH_OPS + { + FindExSearchNameMatch, + FindExSearchLimitToDirectories, + FindExSearchLimitToDevices, + FindExSearchMaxSearchOp + }; +//--- +enum DPI_AWARENESS + { + DPI_AWARENESS_INVALID=-1, + DPI_AWARENESS_UNAWARE=0, + DPI_AWARENESS_SYSTEM_AWARE=1, + DPI_AWARENESS_PER_MONITOR_AWARE=2 + }; +//--- +enum DPI_HOSTING_BEHAVIOR + { + DPI_HOSTING_BEHAVIOR_INVALID=-1, + DPI_HOSTING_BEHAVIOR_DEFAULT=0, + DPI_HOSTING_BEHAVIOR_MIXED=1 + }; +//--- +enum FILE_INFO_BY_HANDLE_CLASS + { + FileBasicInfo=0, + FileStandardInfo=1, + FileNameInfo=2, + FileRenameInfo=3, + FileDispositionInfo= 4, + FileAllocationInfo = 5, + FileEndOfFileInfo=6, + FileStreamInfo=7, + FileCompressionInfo=8, + FileAttributeTagInfo=9, + FileIdBothDirectoryInfo=10, + FileIdBothDirectoryRestartInfo=11, + FileIoPriorityHintInfo = 12, + FileRemoteProtocolInfo = 13, + FileFullDirectoryInfo=14, + FileFullDirectoryRestartInfo=15, + FileStorageInfo=16, + FileAlignmentInfo=17, + FileIdInfo=18, + FileIdExtdDirectoryInfo=19, + FileIdExtdDirectoryRestartInfo=20, + MaximumFileInfoByHandlesClass + }; +//--- +enum READ_DIRECTORY_NOTIFY_INFORMATION_CLASS + { + ReadDirectoryNotifyInformation=1, + ReadDirectoryNotifyExtendedInformation + }; +//--- +enum WELL_KNOWN_SID_TYPE + { + WinNullSid=0, + WinWorldSid= 1, + WinLocalSid= 2, + WinCreatorOwnerSid= 3, + WinCreatorGroupSid= 4, + WinCreatorOwnerServerSid=5, + WinCreatorGroupServerSid= 6, + WinNtAuthoritySid=7, + WinDialupSid=8, + WinNetworkSid=9, + WinBatchSid=10, + WinInteractiveSid=11, + WinServiceSid=12, + WinAnonymousSid=13, + WinProxySid=14, + WinEnterpriseControllersSid=15, + WinSelfSid=16, + WinAuthenticatedUserSid=17, + WinRestrictedCodeSid= 18, + WinTerminalServerSid= 19, + WinRemoteLogonIdSid=20, + WinLogonIdsSid=21, + WinLocalSystemSid=22, + WinLocalServiceSid=23, + WinNetworkServiceSid=24, + WinBuiltinDomainSid=25, + WinBuiltinAdministratorsSid=26, + WinBuiltinUsersSid=27, + WinBuiltinGuestsSid=28, + WinBuiltinPowerUsersSid=29, + WinBuiltinAccountOperatorsSid=30, + WinBuiltinSystemOperatorsSid=31, + WinBuiltinPrintOperatorsSid=32, + WinBuiltinBackupOperatorsSid=33, + WinBuiltinReplicatorSid=34, + WinBuiltinPreWindows2000CompatibleAccessSid=35, + WinBuiltinRemoteDesktopUsersSid=36, + WinBuiltinNetworkConfigurationOperatorsSid=37, + WinAccountAdministratorSid=38, + WinAccountGuestSid=39, + WinAccountKrbtgtSid=40, + WinAccountDomainAdminsSid=41, + WinAccountDomainUsersSid=42, + WinAccountDomainGuestsSid=43, + WinAccountComputersSid=44, + WinAccountControllersSid=45, + WinAccountCertAdminsSid=46, + WinAccountSchemaAdminsSid=47, + WinAccountEnterpriseAdminsSid=48, + WinAccountPolicyAdminsSid=49, + WinAccountRasAndIasServersSid=50, + WinNTLMAuthenticationSid=51, + WinDigestAuthenticationSid=52, + WinSChannelAuthenticationSid=53, + WinThisOrganizationSid=54, + WinOtherOrganizationSid=55, + WinBuiltinIncomingForestTrustBuildersSid=56, + WinBuiltinPerfMonitoringUsersSid=57, + WinBuiltinPerfLoggingUsersSid=58, + WinBuiltinAuthorizationAccessSid=59, + WinBuiltinTerminalServerLicenseServersSid=60, + WinBuiltinDCOMUsersSid=61, + WinBuiltinIUsersSid=62, + WinIUserSid=63, + WinBuiltinCryptoOperatorsSid=64, + WinUntrustedLabelSid=65, + WinLowLabelSid=66, + WinMediumLabelSid=67, + WinHighLabelSid=68, + WinSystemLabelSid=69, + WinWriteRestrictedCodeSid=70, + WinCreatorOwnerRightsSid=71, + WinCacheablePrincipalsGroupSid=72, + WinNonCacheablePrincipalsGroupSid=73, + WinEnterpriseReadonlyControllersSid=74, + WinAccountReadonlyControllersSid=75, + WinBuiltinEventLogReadersGroup=76, + WinNewEnterpriseReadonlyControllersSid=77, + WinBuiltinCertSvcDComAccessGroup=78, + WinMediumPlusLabelSid=79, + WinLocalLogonSid=80, + WinConsoleLogonSid=81, + WinThisOrganizationCertificateSid= 82, + WinApplicationPackageAuthoritySid= 83, + WinBuiltinAnyPackageSid=84, + WinCapabilityInternetClientSid=85, + WinCapabilityInternetClientServerSid=86, + WinCapabilityPrivateNetworkClientServerSid=87, + WinCapabilityPicturesLibrarySid=88, + WinCapabilityVideosLibrarySid=89, + WinCapabilityMusicLibrarySid=90, + WinCapabilityDocumentsLibrarySid=91, + WinCapabilitySharedUserCertificatesSid=92, + WinCapabilityEnterpriseAuthenticationSid=93, + WinCapabilityRemovableStorageSid=94, + WinBuiltinRDSRemoteAccessServersSid=95, + WinBuiltinRDSEndpointServersSid=96, + WinBuiltinRDSManagementServersSid=97, + WinUserModeDriversSid=98, + WinBuiltinHyperVAdminsSid=99, + WinAccountCloneableControllersSid=100, + WinBuiltinAccessControlAssistanceOperatorsSid=101, + WinBuiltinRemoteManagementUsersSid=102, + WinAuthenticationAuthorityAssertedSid=103, + WinAuthenticationServiceAssertedSid=104, + WinLocalAccountSid=105, + WinLocalAccountAndAdministratorSid=106, + WinAccountProtectedUsersSid=107, + WinCapabilityAppointmentsSid=108, + WinCapabilityContactsSid=109, + WinAccountDefaultSystemManagedSid=110, + WinBuiltinDefaultSystemManagedGroupSid=111, + WinBuiltinStorageReplicaAdminsSid=112, + WinAccountKeyAdminsSid=113, + WinAccountEnterpriseKeyAdminsSid=114, + WinAuthenticationKeyTrustSid=115, + WinAuthenticationKeyPropertyMFASid=116, + WinAuthenticationKeyPropertyAttestationSid=117, + WinAuthenticationFreshKeyAuthSid=118, + WinBuiltinDeviceOwnersSid=119 + }; +//--- +union FILE_SEGMENT_ELEMENT + { + PVOID Buffer; + ulong Alignment; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//--- +struct REASON_CONTEXT + { + uint Version; + uint Flags; + PVOID Reason; + }; +//--- +struct OVERLAPPED + { + PVOID Internal; + PVOID InternalHigh; + uint Offset; + uint OffsetHigh; + HANDLE hEvent; + }; +//--- +struct LDT_ENTRY + { + ushort LimitLow; + ushort BaseLow; + uchar BaseMid; + uchar Flags1; + uchar Flags2; + uchar BaseHi; + }; +//--- +struct GUID + { + ulong Data1; + ushort Data2; + ushort Data3; + uchar Data4[8]; + }; +//--- +struct FILETIME + { + uint dwLowDateTime; + uint dwHighDateTime; + }; +//--- +struct POINT + { + int x; + int y; + }; +//--- +struct POINTL + { + int x; + int y; + }; +//--- +struct POINTS + { + short x; + short y; + }; +//--- +struct RECT + { + int left; + int top; + int right; + int bottom; + }; +//--- +struct RECTL + { + int left; + int top; + int right; + int bottom; + }; +//--- +struct SIZE + { + int cx; + int cy; + }; +//--- +struct FILE_INFO + { + }; +//--- +struct CLAIM_SECURITY_ATTRIBUTE_V1 + { + PVOID Name; + ushort ValueType; + ushort Reserved; + uint Flags; + uint ValueCount; + PVOID Values; + }; +//--- +struct CLAIM_SECURITY_ATTRIBUTES_INFORMATION + { + ushort Version; + ushort Reserved; + uint AttributeCount; + PVOID Attribute; + }; +//+------------------------------------------------------------------+ diff --git a/WinAPI/wingdi.mqh b/WinAPI/wingdi.mqh new file mode 100644 index 0000000..2a9d308 --- /dev/null +++ b/WinAPI/wingdi.mqh @@ -0,0 +1,2080 @@ +//+------------------------------------------------------------------+ +//| wingdi.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//--- +#define MM_MAX_AXES_NAMELEN 16 +#define MM_MAX_NUMAXES 16 +#define CCHDEVICENAME 32 +#define LF_FACESIZE 32 +#define LF_FULLFACESIZE 64 +#define ELF_VENDOR_SIZE 4 +#define CCHFORMNAME 32 + +//--- +enum DISPLAYCONFIG_COLOR_ENCODING + { + DISPLAYCONFIG_COLOR_ENCODING_RGB=0, + DISPLAYCONFIG_COLOR_ENCODING_YCBCR444=1, + DISPLAYCONFIG_COLOR_ENCODING_YCBCR422=2, + DISPLAYCONFIG_COLOR_ENCODING_YCBCR420=3, + DISPLAYCONFIG_COLOR_ENCODING_INTENSITY=4, + DISPLAYCONFIG_COLOR_ENCODING_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_DEVICE_INFO_TYPE + { + DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME=1, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME=2, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE=3, + DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME=4, + DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE=5, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE=6, + DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION=7, + DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION=8, + DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO=9, + DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE=10, + DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL=11, + DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_MODE_INFO_TYPE + { + DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE=1, + DISPLAYCONFIG_MODE_INFO_TYPE_TARGET=2, + DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE=3, + DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_PIXELFORMAT + { + DISPLAYCONFIG_PIXELFORMAT_8BPP=1, + DISPLAYCONFIG_PIXELFORMAT_16BPP=2, + DISPLAYCONFIG_PIXELFORMAT_24BPP=3, + DISPLAYCONFIG_PIXELFORMAT_32BPP=4, + DISPLAYCONFIG_PIXELFORMAT_NONGDI=5, + DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32=0xffffffff + }; +//--- +enum DISPLAYCONFIG_ROTATION + { + DISPLAYCONFIG_ROTATION_IDENTITY=1, + DISPLAYCONFIG_ROTATION_ROTATE90=2, + DISPLAYCONFIG_ROTATION_ROTATE180=3, + DISPLAYCONFIG_ROTATION_ROTATE270=4, + DISPLAYCONFIG_ROTATION_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_SCALING + { + DISPLAYCONFIG_SCALING_IDENTITY=1, + DISPLAYCONFIG_SCALING_CENTERED=2, + DISPLAYCONFIG_SCALING_STRETCHED=3, + DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX=4, + DISPLAYCONFIG_SCALING_CUSTOM=5, + DISPLAYCONFIG_SCALING_PREFERRED=128, + DISPLAYCONFIG_SCALING_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_SCANLINE_ORDERING + { + DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED=0, + DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE=1, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED=2, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST=DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST=3, + DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_TOPOLOGY_ID + { + DISPLAYCONFIG_TOPOLOGY_INTERNAL=0x00000001, + DISPLAYCONFIG_TOPOLOGY_CLONE=0x00000002, + DISPLAYCONFIG_TOPOLOGY_EXTEND=0x00000004, + DISPLAYCONFIG_TOPOLOGY_EXTERNAL=0x00000008, + DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32=0xFFFFFFFF + }; +//--- +enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY + { + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER=-1, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15=0, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO=1, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO=2, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO=3, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI=4, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI=5, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS=6, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN=8, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI=9, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL=10, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED=11, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL=12, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED=13, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE=14, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST=15, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_WIRED=16, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL=0x80000000, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32=0xFFFFFFFF + }; +//--- +struct ABC + { + int abcA; + uint abcB; + int abcC; + }; +//--- +struct ABCFLOAT + { + float abcfA; + float abcfB; + float abcfC; + }; +//--- +struct AXISINFOW + { + int axMinValue; + int axMaxValue; + short axAxisName[MM_MAX_AXES_NAMELEN]; + }; +//--- +struct AXESLISTW + { + uint axlReserved; + uint axlNumAxes; + AXISINFOW axlAxisInfo[MM_MAX_NUMAXES]; + }; +//--- +struct BITMAP + { + int bmType; + int bmWidth; + int bmHeight; + int bmWidthBytes; + ushort bmPlanes; + ushort bmBitsPixel; + PVOID bmBits; + }; +//--- +struct BITMAPCOREHEADER + { + uint bcSize; + ushort bcWidth; + ushort bcHeight; + ushort bcPlanes; + ushort bcBitCount; + }; +//--- +struct BITMAPFILEHEADER + { + ushort bfType; + uint bfSize; + ushort bfReserved1; + ushort bfReserved2; + uint bfOffBits; + }; +//--- +struct RGBTRIPLE + { + uchar rgbtBlue; + uchar rgbtGreen; + uchar rgbtRed; + }; +//--- +struct BITMAPCOREINFO + { + BITMAPCOREHEADER bmciHeader; + RGBTRIPLE bmciColors[1]; + }; +//--- +struct BITMAPINFOHEADER + { + uint biSize; + int biWidth; + int biHeight; + ushort biPlanes; + ushort biBitCount; + uint biCompression; + uint biSizeImage; + int biXPelsPerMeter; + int biYPelsPerMeter; + uint biClrUsed; + uint biClrImportant; + }; +//--- +struct RGBQUAD + { + uchar rgbBlue; + uchar rgbGreen; + uchar rgbRed; + uchar rgbReserved; + }; +//--- +struct BITMAPINFO + { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[1]; + }; +//--- +struct CIEXYZ + { + int ciexyzX; + int ciexyzY; + int ciexyzZ; + }; +//--- +struct CIEXYZTRIPLE + { + CIEXYZ ciexyzRed; + CIEXYZ ciexyzGreen; + CIEXYZ ciexyzBlue; + }; +//--- +struct BITMAPV4HEADER + { + uint bV4Size; + int bV4Width; + int bV4Height; + ushort bV4Planes; + ushort bV4BitCount; + uint bV4V4Compression; + uint bV4SizeImage; + int bV4XPelsPerMeter; + int bV4YPelsPerMeter; + uint bV4ClrUsed; + uint bV4ClrImportant; + uint bV4RedMask; + uint bV4GreenMask; + uint bV4BlueMask; + uint bV4AlphaMask; + uint bV4CSType; + CIEXYZTRIPLE bV4Endpoints; + uint bV4GammaRed; + uint bV4GammaGreen; + uint bV4GammaBlue; + }; +//--- +struct BITMAPV5HEADER + { + uint bV5Size; + int bV5Width; + int bV5Height; + ushort bV5Planes; + ushort bV5BitCount; + uint bV5Compression; + uint bV5SizeImage; + int bV5XPelsPerMeter; + int bV5YPelsPerMeter; + uint bV5ClrUsed; + uint bV5ClrImportant; + uint bV5RedMask; + uint bV5GreenMask; + uint bV5BlueMask; + uint bV5AlphaMask; + uint bV5CSType; + CIEXYZTRIPLE bV5Endpoints; + uint bV5GammaRed; + uint bV5GammaGreen; + uint bV5GammaBlue; + uint bV5Intent; + uint bV5ProfileData; + uint bV5ProfileSize; + uint bV5Reserved; + }; +//--- +struct BLENDFUNCTION + { + uchar BlendOp; + uchar BlendFlags; + uchar SourceConstantAlpha; + uchar AlphaFormat; + }; +//--- +struct FONTSIGNATURE + { + uint fsUsb[4]; + uint fsCsb[2]; + }; +//--- +struct CHARSETINFO + { + uint ciCharset; + uint ciACP; + FONTSIGNATURE fs; + }; +//--- +struct COLORADJUSTMENT + { + ushort caSize; + ushort caFlags; + ushort caIlluminantIndex; + ushort caRedGamma; + ushort caGreenGamma; + ushort caBlueGamma; + ushort caReferenceBlack; + ushort caReferenceWhite; + short caContrast; + short caBrightness; + short caColorfulness; + short caRedGreenTint; + }; +//--- +struct DESIGNVECTOR + { + uint dvReserved; + uint dvNumAxes; + int dvValues[MM_MAX_NUMAXES]; + }; +//--- +struct DIBSECTION + { + BITMAP dsBm; + BITMAPINFOHEADER dsBmih; + uint dsBitfields[3]; + HANDLE dshSection; + uint dsOffset; + }; +//--- +struct DISPLAY_DEVICEA + { + uint cb; + char DeviceName[32]; + char DeviceString[128]; + uint StateFlags; + char DeviceID[128]; + char DeviceKey[128]; + }; +//--- +struct DISPLAY_DEVICEW + { + uint cb; + short DeviceName[32]; + short DeviceString[128]; + uint StateFlags; + short DeviceID[128]; + short DeviceKey[128]; + }; +//--- +struct DISPLAYCONFIG_2DREGION + { + uint cx; + uint cy; + }; +//--- +struct DISPLAYCONFIG_DEVICE_INFO_HEADER + { + DISPLAYCONFIG_DEVICE_INFO_TYPE type; + uint size; + LUID adapterId; + uint id; + }; +//--- +struct DISPLAYCONFIG_ADAPTER_NAME + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + short adapterDevicePath[128]; + }; +//--- +struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO + { + POINTL PathSourceSize; + RECTL DesktopImageRegion; + RECTL DesktopImageClip; + }; +//--- +struct DISPLAYCONFIG_PATH_SOURCE_INFO + { + LUID adapterId; + uint id; + uint modeInfoIdx; + uint statusFlags; + }; +//--- +struct DISPLAYCONFIG_RATIONAL + { + uint Numerator; + uint Denominator; + }; +//--- +struct DISPLAYCONFIG_PATH_TARGET_INFO + { + LUID adapterId; + uint id; + uint modeInfoIdx; + DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; + DISPLAYCONFIG_ROTATION rotation; + DISPLAYCONFIG_SCALING scaling; + DISPLAYCONFIG_RATIONAL refreshRate; + DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; + int targetAvailable; + uint statusFlags; + }; +//--- +struct DISPLAYCONFIG_PATH_INFO + { + DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo; + DISPLAYCONFIG_PATH_TARGET_INFO targetInfo; + uint flags; + }; +//--- +struct DISPLAYCONFIG_SDR_WHITE_LEVEL + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + uint SDRWhiteLevel; + }; +//--- +struct DISPLAYCONFIG_SOURCE_DEVICE_NAME + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + short viewGdiDeviceName[CCHDEVICENAME]; + }; +//--- +struct DISPLAYCONFIG_SOURCE_MODE + { + uint width; + uint height; + DISPLAYCONFIG_PIXELFORMAT pixelFormat; + POINTL position; + }; +//--- +struct DISPLAYCONFIG_TARGET_BASE_TYPE + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY baseOutputTechnology; + }; +//--- +struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS + { + uint value; + }; +//--- +struct DISPLAYCONFIG_TARGET_DEVICE_NAME + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags; + DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; + ushort edidManufactureId; + ushort edidProductCodeId; + uint connectorInstance; + short monitorFriendlyDeviceName[64]; + short monitorDevicePath[128]; + }; +//--- +struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO + { + ulong pixelRate; + DISPLAYCONFIG_RATIONAL hSyncFreq; + DISPLAYCONFIG_RATIONAL vSyncFreq; + DISPLAYCONFIG_2DREGION activeSize; + DISPLAYCONFIG_2DREGION totalSize; + uint videoStandard; + DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; + }; +//--- +struct DISPLAYCONFIG_TARGET_MODE + { + DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo; + }; +//--- +struct DISPLAYCONFIG_TARGET_PREFERRED_MODE + { + DISPLAYCONFIG_DEVICE_INFO_HEADER header; + uint width; + uint height; + DISPLAYCONFIG_TARGET_MODE targetMode; + }; +//--- +struct DOCINFOW + { + int cbSize; + const string lpszDocName; + const string lpszOutput; + const string lpszDatatype; + uint fwType; + }; +//--- +struct DRAWPATRECT + { + POINT ptPosition; + POINT ptSize; + ushort wStyle; + ushort wPattern; + }; +//--- +struct EMR + { + uint iType; + uint nSize; + }; +//--- +struct EMRABORTPATH + { + EMR emr; + }; +//--- +struct XFORM + { + float eM11; + float eM12; + float eM21; + float eM22; + float eDx; + float eDy; + }; +//--- +struct EMRALPHABLEND + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int cxDest; + int cyDest; + uint dwRop; + int xSrc; + int ySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + int cxSrc; + int cySrc; + }; +//--- +struct EMRANGLEARC + { + EMR emr; + POINTL ptlCenter; + uint nRadius; + float eStartAngle; + float eSweepAngle; + }; +//--- +struct EMRARC + { + EMR emr; + RECTL rclBox; + POINTL ptlStart; + POINTL ptlEnd; + }; +//--- +struct EMRBITBLT + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int cxDest; + int cyDest; + uint dwRop; + int xSrc; + int ySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + }; +//--- +struct EMRCOLORCORRECTPALETTE + { + EMR emr; + uint ihPalette; + uint nFirstEntry; + uint nPalEntries; + uint nReserved; + }; +//--- +struct EMRCOLORMATCHTOTARGET + { + EMR emr; + uint dwAction; + uint dwFlags; + uint cbName; + uint cbData; + uchar Data[1]; + }; +//--- +struct LOGBRUSH + { + uint lbStyle; + uint lbColor; + ulong lbHatch; + }; +//--- +struct EMRCREATEBRUSHINDIRECT + { + EMR emr; + uint ihBrush; + LOGBRUSH lb; + }; +//--- +struct LOGCOLORSPACEW + { + uint lcsSignature; + uint lcsVersion; + uint lcsSize; + int lcsCSType; + int lcsIntent; + CIEXYZTRIPLE lcsEndpoints; + uint lcsGammaRed; + uint lcsGammaGreen; + uint lcsGammaBlue; + short lcsFilename[MAX_PATH]; + }; +//--- +struct EMRCREATECOLORSPACEW + { + EMR emr; + uint ihCS; + LOGCOLORSPACEW lcs; + uint dwFlags; + uint cbData; + uchar Data[1]; + }; +//--- +struct EMRCREATEDIBPATTERNBRUSHPT + { + EMR emr; + uint ihBrush; + uint iUsage; + uint offBmi; + uint cbBmi; + uint offBits; + uint cbBits; + }; +//--- +struct EMRCREATEMONOBRUSH + { + EMR emr; + uint ihBrush; + uint iUsage; + uint offBmi; + uint cbBmi; + uint offBits; + uint cbBits; + }; +//--- +struct LOGPALETTE + { + ushort palVersion; + ushort palNumEntries; + }; +//--- +struct LOGPEN + { + uint lopnStyle; + POINT lopnWidth; + uint lopnColor; + }; +//--- +struct EMRCREATEPALETTE + { + EMR emr; + uint ihPal; + LOGPALETTE lgpl; + }; +//--- +struct EMRCREATEPEN + { + EMR emr; + uint ihPen; + LOGPEN lopn; + }; +//--- +struct EMRELLIPSE + { + EMR emr; + RECTL rclBox; + }; +//--- +struct EMREOF + { + EMR emr; + uint nPalEntries; + uint offPalEntries; + uint nSizeLast; + }; +//--- +struct EMREXCLUDECLIPRECT + { + EMR emr; + RECTL rclClip; + }; +//--- +struct LOGFONTW + { + int lfHeight; + int lfWidth; + int lfEscapement; + int lfOrientation; + int lfWeight; + uchar lfItalic; + uchar lfUnderline; + uchar lfStrikeOut; + uchar lfCharSet; + uchar lfOutPrecision; + uchar lfClipPrecision; + uchar lfQuality; + uchar lfPitchAndFamily; + short lfFaceName[LF_FACESIZE]; + }; +//--- +struct PANOSE + { + uchar bFamilyType; + uchar bSerifStyle; + uchar bWeight; + uchar bProportion; + uchar bContrast; + uchar bStrokeVariation; + uchar bArmStyle; + uchar bLetterform; + uchar bMidline; + uchar bXHeight; + }; +//--- +struct EXTLOGFONTW + { + LOGFONTW elfLogFont; + short elfFullName[LF_FULLFACESIZE]; + short elfStyle[LF_FACESIZE]; + uint elfVersion; + uint elfStyleSize; + uint elfMatch; + uint elfReserved; + uchar elfVendorId[ELF_VENDOR_SIZE]; + uint elfCulture; + PANOSE elfPanose; + }; +//--- +struct EMREXTCREATEFONTINDIRECTW + { + EMR emr; + uint ihFont; + EXTLOGFONTW elfw; + }; +//--- +struct EXTLOGPEN + { + uint elpPenStyle; + uint elpWidth; + uint elpBrushStyle; + uint elpColor; + ulong elpHatch; + uint elpNumEntries; + uint elpStyleEntry[1]; + }; +//--- +struct EMREXTCREATEPEN + { + EMR emr; + uint ihPen; + uint offBmi; + uint cbBmi; + uint offBits; + uint cbBits; + EXTLOGPEN elp; + }; +//--- +struct EMREXTESCAPE + { + EMR emr; + int iEscape; + int cbEscData; + uchar EscData[1]; + }; +//--- +struct EMREXTFLOODFILL + { + EMR emr; + POINTL ptlStart; + uint crColor; + uint iMode; + }; +//--- +struct EMREXTSELECTCLIPRGN + { + EMR emr; + uint cbRgnData; + uint iMode; + uchar RgnData[1]; + }; +//--- +struct EMRTEXT + { + POINTL ptlReference; + uint nChars; + uint offString; + uint fOptions; + RECTL rcl; + uint offDx; + }; +//--- +struct EMREXTTEXTOUTA + { + EMR emr; + RECTL rclBounds; + uint iGraphicsMode; + float exScale; + float eyScale; + EMRTEXT emrtext; + }; +//--- +struct EMRFILLPATH + { + EMR emr; + RECTL rclBounds; + }; +//--- +struct EMRFILLRGN + { + EMR emr; + RECTL rclBounds; + uint cbRgnData; + uint ihBrush; + uchar RgnData[1]; + }; +//--- +struct EMRFORMAT + { + uint dSignature; + uint nVersion; + uint cbData; + uint offData; + }; +//--- +struct EMRFRAMERGN + { + EMR emr; + RECTL rclBounds; + uint cbRgnData; + uint ihBrush; + SIZE szlStroke; + uchar RgnData[1]; + }; +//--- +struct EMRGDICOMMENT + { + EMR emr; + uint cbData; + uchar Data[1]; + }; +//--- +struct EMRGLSBOUNDEDRECORD + { + EMR emr; + RECTL rclBounds; + uint cbData; + uchar Data[1]; + }; +//--- +struct EMRGLSRECORD + { + EMR emr; + uint cbData; + uchar Data[1]; + }; +//--- +struct PIXELFORMATDESCRIPTOR + { + ushort nSize; + ushort nVersion; + uint dwFlags; + uchar iPixelType; + uchar cColorBits; + uchar cRedBits; + uchar cRedShift; + uchar cGreenBits; + uchar cGreenShift; + uchar cBlueBits; + uchar cBlueShift; + uchar cAlphaBits; + uchar cAlphaShift; + uchar cAccumBits; + uchar cAccumRedBits; + uchar cAccumGreenBits; + uchar cAccumBlueBits; + uchar cAccumAlphaBits; + uchar cDepthBits; + uchar cStencilBits; + uchar cAuxBuffers; + uchar iLayerType; + uchar bReserved; + uint dwLayerMask; + uint dwVisibleMask; + uint dwDamageMask; + }; +//--- +struct TRIVERTEX + { + int x; + int y; + ushort red; + ushort green; + ushort blue; + ushort alpha; + }; +//--- +struct EMRGRADIENTFILL + { + EMR emr; + RECTL rclBounds; + uint nVer; + uint nTri; + uint ulMode; + TRIVERTEX Ver[1]; + }; +//--- +struct EMRINVERTRGN + { + EMR emr; + RECTL rclBounds; + uint cbRgnData; + uchar RgnData[1]; + }; +//--- +struct EMRLINETO + { + EMR emr; + POINTL ptl; + }; +//--- +struct EMRMASKBLT + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int cxDest; + int cyDest; + uint dwRop; + int xSrc; + int ySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + int xMask; + int yMask; + uint iUsageMask; + uint offBmiMask; + uint cbBmiMask; + uint offBitsMask; + uint cbBitsMask; + }; +//--- +struct EMRMODIFYWORLDTRANSFORM + { + EMR emr; + XFORM xform; + uint iMode; + }; +//--- +struct EMRNAMEDESCAPE + { + EMR emr; + int iEscape; + int cbDriver; + int cbEscData; + uchar EscData[1]; + }; +//--- +struct EMROFFSETCLIPRGN + { + EMR emr; + POINTL ptlOffset; + }; +//--- +struct EMRPIXELFORMAT + { + EMR emr; + PIXELFORMATDESCRIPTOR pfd; + }; +//--- +struct EMRPLGBLT + { + EMR emr; + RECTL rclBounds; + POINTL aptlDest[3]; + int xSrc; + int ySrc; + int cxSrc; + int cySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + int xMask; + int yMask; + uint iUsageMask; + uint offBmiMask; + uint cbBmiMask; + uint offBitsMask; + uint cbBitsMask; + }; +//--- +struct EMRPOLYDRAW + { + EMR emr; + RECTL rclBounds; + uint cptl; + POINTL aptl[1]; + uchar abTypes[1]; + }; +//--- +struct EMRPOLYDRAW16 + { + EMR emr; + RECTL rclBounds; + uint cpts; + POINTS apts[1]; + uchar abTypes[1]; + }; +//--- +struct EMRPOLYLINE + { + EMR emr; + RECTL rclBounds; + uint cptl; + POINTL aptl[1]; + }; +//--- +struct EMRPOLYLINE16 + { + EMR emr; + RECTL rclBounds; + uint cpts; + POINTS apts[1]; + }; +//--- +struct EMRPOLYPOLYLINE + { + EMR emr; + RECTL rclBounds; + uint nPolys; + uint cptl; + uint aPolyCounts[1]; + POINTL aptl[1]; + }; +//--- +struct EMRPOLYPOLYLINE16 + { + EMR emr; + RECTL rclBounds; + uint nPolys; + uint cpts; + uint aPolyCounts[1]; + POINTS apts[1]; + }; +//--- +struct EMRPOLYTEXTOUTW + { + EMR emr; + RECTL rclBounds; + uint iGraphicsMode; + float exScale; + float eyScale; + int cStrings; + EMRTEXT aemrtext[1]; + }; +//--- +struct EMRRESIZEPALETTE + { + EMR emr; + uint ihPal; + uint cEntries; + }; +//--- +struct EMRRESTOREDC + { + EMR emr; + int iRelative; + }; +//--- +struct EMRROUNDRECT + { + EMR emr; + RECTL rclBox; + SIZE szlCorner; + }; +//--- +struct EMRSCALEVIEWPORTEXTEX + { + EMR emr; + int xNum; + int xDenom; + int yNum; + int yDenom; + }; +//--- +struct EMRSELECTCLIPPATH + { + EMR emr; + uint iMode; + }; +//--- +struct EMRSELECTOBJECT + { + EMR emr; + uint ihObject; + }; +//--- +struct EMRSELECTPALETTE + { + EMR emr; + uint ihPal; + }; +//--- +struct EMRSETARCDIRECTION + { + EMR emr; + uint iArcDirection; + }; +//--- +struct EMRSETBKCOLOR + { + EMR emr; + uint crColor; + }; +//--- +struct EMRSETCOLORADJUSTMENT + { + EMR emr; + COLORADJUSTMENT ColorAdjustment; + }; +//--- +struct EMRSETCOLORSPACE + { + EMR emr; + uint ihCS; + }; +//--- +struct EMRSETDIBITSTODEVICE + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int xSrc; + int ySrc; + int cxSrc; + int cySrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + uint iUsageSrc; + uint iStartScan; + uint cScans; + }; +//--- +struct EMRSETICMPROFILE + { + EMR emr; + uint dwFlags; + uint cbName; + uint cbData; + uchar Data[1]; + }; +//--- +struct EMRSETMAPPERFLAGS + { + EMR emr; + uint dwFlags; + }; +//--- +struct EMRSETMITERLIMIT + { + EMR emr; + float eMiterLimit; + }; +//--- +struct PALETTEENTRY + { + uchar red; + uchar green; + uchar blue; + uchar flags; + }; +//--- +struct EMRSETPALETTEENTRIES + { + EMR emr; + uint ihPal; + uint iStart; + uint cEntries; + PALETTEENTRY aPalEntries[1]; + }; +//--- +struct EMRSETPIXELV + { + EMR emr; + POINTL ptlPixel; + uint crColor; + }; +//--- +struct EMRSETVIEWPORTEXTEX + { + EMR emr; + SIZE szlExtent; + }; +//--- +struct EMRSETVIEWPORTORGEX + { + EMR emr; + POINTL ptlOrigin; + }; +//--- +struct EMRSETWORLDTRANSFORM + { + EMR emr; + XFORM xform; + }; +//--- +struct EMRSTRETCHBLT + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int cxDest; + int cyDest; + uint dwRop; + int xSrc; + int ySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + int cxSrc; + int cySrc; + }; +//--- +struct EMRSTRETCHDIBITS + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int xSrc; + int ySrc; + int cxSrc; + int cySrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + uint iUsageSrc; + uint dwRop; + int cxDest; + int cyDest; + }; +//--- +struct EMRTRANSPARENTBLT + { + EMR emr; + RECTL rclBounds; + int xDest; + int yDest; + int cxDest; + int cyDest; + uint dwRop; + int xSrc; + int ySrc; + XFORM xformSrc; + uint crBkColorSrc; + uint iUsageSrc; + uint offBmiSrc; + uint cbBmiSrc; + uint offBitsSrc; + uint cbBitsSrc; + int cxSrc; + int cySrc; + }; +//--- +struct ENHMETAHEADER + { + uint iType; + uint nSize; + RECTL rclBounds; + RECTL rclFrame; + uint dSignature; + uint nVersion; + uint nBytes; + uint nRecords; + ushort nHandles; + ushort sReserved; + uint nDescription; + uint offDescription; + uint nPalEntries; + SIZE szlDevice; + SIZE szlMillimeters; + uint cbPixelFormat; + uint offPixelFormat; + uint bOpenGL; + SIZE szlMicrometers; + }; +//--- +struct ENHMETARECORD + { + uint iType; + uint nSize; + uint dParm[1]; + }; +//--- +struct ENUMLOGFONTEXW + { + LOGFONTW elfLogFont; + short elfFullName[LF_FULLFACESIZE]; + short elfStyle[LF_FACESIZE]; + short elfScript[LF_FACESIZE]; + }; +//--- +struct ENUMLOGFONTEXDVW + { + ENUMLOGFONTEXW elfEnumLogfontEx; + DESIGNVECTOR elfDesignVector; + }; +//--- +struct ENUMLOGFONTW + { + LOGFONTW elfLogFont; + short elfFullName[LF_FULLFACESIZE]; + short elfStyle[LF_FACESIZE]; + }; +//--- +struct NEWTEXTMETRICW + { + int tmHeight; + int tmAscent; + int tmDescent; + int tmInternalLeading; + int tmExternalLeading; + int tmAveCharWidth; + int tmMaxCharWidth; + int tmWeight; + int tmOverhang; + int tmDigitizedAspectX; + int tmDigitizedAspectY; + short tmFirstChar; + short tmLastChar; + short tmDefaultChar; + short tmBreakChar; + uchar tmItalic; + uchar tmUnderlined; + uchar tmStruckOut; + uchar tmPitchAndFamily; + uchar tmCharSet; + uint ntmFlags; + uint ntmSizeEM; + uint ntmCellHeight; + uint ntmAvgWidth; + }; +//--- +struct NEWTEXTMETRICEXW + { + NEWTEXTMETRICW ntmTm; + FONTSIGNATURE ntmFontSig; + }; +//--- +struct ENUMTEXTMETRICW + { + NEWTEXTMETRICEXW etmNewTextMetricEx; + AXESLISTW etmAxesList; + }; +//--- +struct FIXED + { + ushort fract; + short value; + }; +//--- +struct POINTFLOAT + { + float x; + float y; + }; +//--- +struct GCP_RESULTSW + { + uint lStructSize; + string lpOutString; + PVOID lpOrder; + PVOID lpDx; + PVOID lpCaretPos; + PVOID lpClass; + PVOID lpGlyphs; + uint nGlyphs; + int nMaxFit; + }; +//--- +struct GLYPHMETRICS + { + uint gmBlackBoxX; + uint gmBlackBoxY; + POINT gmptGlyphOrigin; + short gmCellIncX; + short gmCellIncY; + }; +//--- +struct GLYPHMETRICSFLOAT + { + float gmfBlackBoxX; + float gmfBlackBoxY; + POINTFLOAT gmfptGlyphOrigin; + float gmfCellIncX; + float gmfCellIncY; + }; +//--- +struct WCRANGE + { + short wcLow; + ushort cGlyphs; + }; +//--- +struct GLYPHSET + { + uint cbThis; + uint flAccel; + uint cGlyphsSupported; + uint cRanges; + WCRANGE ranges[1]; + }; +//--- +struct GRADIENT_RECT + { + uint UpperLeft; + uint LowerRight; + }; +//--- +struct GRADIENT_TRIANGLE + { + uint Vertex1; + uint Vertex2; + uint Vertex3; + }; +//--- +struct HANDLETABLE + { + PVOID objectHandle[1]; + }; +//--- +struct KERNINGPAIR + { + ushort wFirst; + ushort wSecond; + int iKernAmount; + }; +//--- +struct LAYERPLANEDESCRIPTOR + { + ushort nSize; + ushort nVersion; + uint dwFlags; + uchar iPixelType; + uchar cColorBits; + uchar cRedBits; + uchar cRedShift; + uchar cGreenBits; + uchar cGreenShift; + uchar cBlueBits; + uchar cBlueShift; + uchar cAlphaBits; + uchar cAlphaShift; + uchar cAccumBits; + uchar cAccumRedBits; + uchar cAccumGreenBits; + uchar cAccumBlueBits; + uchar cAccumAlphaBits; + uchar cDepthBits; + uchar cStencilBits; + uchar cAuxBuffers; + uchar iLayerPlane; + uchar bReserved; + uint crTransparent; + }; +//--- +struct LOCALESIGNATURE + { + uint lsUsb[4]; + uint lsCsbDefault[2]; + uint lsCsbSupported[2]; + }; +//--- +struct MAT2 + { + FIXED eM11; + FIXED eM12; + FIXED eM21; + FIXED eM22; + }; +//--- +struct METAFILEPICT + { + int mm; + int xExt; + int yExt; + HANDLE hMF; + }; +//--- +struct METAHEADER + { + ushort mtType; + ushort mtHeaderSize; + ushort mtVersion; + uint mtSize; + ushort mtNoObjects; + uint mtMaxRecord; + ushort mtNoParameters; + }; +//--- +struct METARECORD + { + uint rdSize; + ushort rdFunction; + ushort rdParm[1]; + }; +//--- +struct TEXTMETRICW + { + int tmHeight; + int tmAscent; + int tmDescent; + int tmInternalLeading; + int tmExternalLeading; + int tmAveCharWidth; + int tmMaxCharWidth; + int tmWeight; + int tmOverhang; + int tmDigitizedAspectX; + int tmDigitizedAspectY; + short tmFirstChar; + short tmLastChar; + short tmDefaultChar; + short tmBreakChar; + uchar tmItalic; + uchar tmUnderlined; + uchar tmStruckOut; + uchar tmPitchAndFamily; + uchar tmCharSet; + }; +//--- +struct OUTLINETEXTMETRICW + { + uint otmSize; + TEXTMETRICW otmTextMetrics; + uchar otmFiller; + PANOSE otmPanoseNumber; + uint otmfsSelection; + uint otmfsType; + int otmsCharSlopeRise; + int otmsCharSlopeRun; + int otmItalicAngle; + uint otmEMSquare; + int otmAscent; + int otmDescent; + uint otmLineGap; + uint otmsCapEmHeight; + uint otmsXHeight; + RECT otmrcFontBox; + int otmMacAscent; + int otmMacDescent; + uint otmMacLineGap; + uint otmusMinimumPPEM; + POINT otmptSubscriptSize; + POINT otmptSubscriptOffset; + POINT otmptSuperscriptSize; + POINT otmptSuperscriptOffset; + uint otmsStrikeoutSize; + int otmsStrikeoutPosition; + int otmsUnderscoreSize; + int otmsUnderscorePosition; + PVOID otmpFamilyName; //char otmpFamilyName[]; + PVOID otmpFaceName; //char otmpFaceName[]; + PVOID otmpStyleName; //char otmpStyleName[]; + PVOID otmpFullName; //char otmpFullName[]; + }; +//--- +struct PELARRAY + { + int paXCount; + int paYCount; + int paXExt; + int paYExt; + uchar paRGBs; + }; +//--- +struct POINTFX + { + FIXED x; + FIXED y; + }; +//--- +struct POLYTEXTW + { + int x; + int y; + uint n; + const string lpstr; + uint uiFlags; + RECT rcl; + PVOID pdx; + }; +//--- +struct PSFEATURE_CUSTPAPER + { + int lOrientation; + int lWidth; + int lHeight; + int lWidthOffset; + int lHeightOffset; + }; +//--- +struct PSFEATURE_OUTPUT + { + int bPageIndependent; + int bSetPageDevice; + }; +//--- +struct PSINJECTDATA + { + uint DataBytes; + ushort InjectionPoint; + ushort PageNumber; + }; +//--- +struct RASTERIZER_STATUS + { + short nSize; + short wFlags; + short nLanguageID; + }; +//--- +struct RGNDATAHEADER + { + uint dwSize; + uint iType; + uint nCount; + uint nRgnSize; + RECT rcBound; + }; +//--- +struct RGNDATA + { + RGNDATAHEADER rdh; + char Buffer[1]; + }; +//--- +struct TTPOLYCURVE + { + ushort wType; + ushort cpfx; + POINTFX apfx[1]; + }; +//--- +struct TTPOLYGONHEADER + { + uint cb; + uint dwType; + POINTFX pfxStart; + }; +//--- +struct DEVMODEW + { + short dmDeviceName[CCHDEVICENAME]; + ushort dmSpecVersion; + ushort dmDriverVersion; + ushort dmSize; + ushort dmDriverExtra; + uint dmFields; + short dmOrientation; + short dmPaperSize; + short dmPaperLength; + short dmPaperWidth; + short dmScale; + short dmCopies; + short dmDefaultSource; + short dmPrintQuality; + short dmColor; + short dmDuplex; + short dmYResolution; + short dmTTOption; + short dmCollate; + short dmFormName[CCHFORMNAME]; + ushort dmLogPixels; + uint dmBitsPerPel; + uint dmPelsWidth; + uint dmPelsHeight; + uint dmDisplayFlags; + uint dmDisplayFrequency; + uint dmICMMethod; + uint dmICMIntent; + uint dmMediaType; + uint dmDitherType; + uint dmReserved1; + uint dmReserved2; + uint dmPanningWidth; + uint dmPanningHeight; + }; +//--- +struct WGLSWAP + { + HANDLE hdc; + uint uiFlags; + }; +//--- +union DISPLAYCONFIG_MODE + { + DISPLAYCONFIG_TARGET_MODE targetMode; + DISPLAYCONFIG_SOURCE_MODE sourceMode; + DISPLAYCONFIG_DESKTOP_IMAGE_INFO desktopImageInfo; + }; +//--- +struct DISPLAYCONFIG_MODE_INFO + { + DISPLAYCONFIG_MODE_INFO_TYPE infoType; + uint id; + LUID adapterId; + DISPLAYCONFIG_MODE mode; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "gdi32.dll" +int AbortDoc(HANDLE hdc); +int AbortPath(HANDLE hdc); +HANDLE AddFontMemResourceEx(PVOID file_view,uint size,PVOID resrved,uint &num_fonts); +int AddFontResourceExW(const string name,uint fl,PVOID res); +int AddFontResourceW(string); +int AngleArc(HANDLE hdc,int x,int y,uint r,float StartAngle,float SweepAngle); +int AnimatePalette(HANDLE pal,uint start_index,uint entries,PALETTEENTRY &ppe); +int Arc(HANDLE hdc,int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); +int ArcTo(HANDLE hdc,int left,int top,int right,int bottom,int xr1,int yr1,int xr2,int yr2); +int BeginPath(HANDLE hdc); +int BitBlt(HANDLE hdc,int x,int y,int cx,int cy,HANDLE src,int x1,int y1,uint rop); +int CancelDC(HANDLE hdc); +int CheckColorsInGamut(HANDLE hdc,RGBTRIPLE &lpRGBTriple,PVOID buffer,uint count); +int ChoosePixelFormat(HANDLE hdc,PIXELFORMATDESCRIPTOR &ppfd); +int Chord(HANDLE hdc,int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); +HANDLE CloseEnhMetaFile(HANDLE hdc); +int CloseFigure(HANDLE hdc); +HANDLE CloseMetaFile(HANDLE hdc); +int ColorCorrectPalette(HANDLE hdc,HANDLE pal,uint first,uint num); +int ColorMatchToTarget(HANDLE hdc,HANDLE target,uint action); +int CombineRgn(HANDLE dst,HANDLE src1,HANDLE src2,int mode); +int CombineTransform(XFORM &out,XFORM &lpxf1,XFORM &lpxf2); +HANDLE CopyEnhMetaFileW(HANDLE enh,const string file_name); +HANDLE CopyMetaFileW(HANDLE,string LPCWSTR); +HANDLE CreateBitmap(int width,int height,uint planes,uint bit_count,PVOID bits); +HANDLE CreateBitmap(int width,int height,uint planes,uint bit_count,char &bits[]); +HANDLE CreateBitmapIndirect(BITMAP &pbm); +HANDLE CreateBrushIndirect(LOGBRUSH &plbrush); +HANDLE CreateColorSpaceW(LOGCOLORSPACEW &lplcs); +HANDLE CreateCompatibleBitmap(HANDLE hdc,int cx,int cy); +HANDLE CreateCompatibleDC(HANDLE hdc); +HANDLE CreateDCW(const string driver,const string device,const string port,DEVMODEW &pdm); +HANDLE CreateDIBitmap(HANDLE hdc,BITMAPINFOHEADER &pbmih,uint init,PVOID bits,BITMAPINFO &pbmi,uint usage); +HANDLE CreateDIBPatternBrush(HANDLE h,uint usage); +HANDLE CreateDIBPatternBrushPt(PVOID lpPackedDIB,uint usage); +HANDLE CreateDIBSection(HANDLE hdc,BITMAPINFO &pbmi,uint usage,PVOID bits,HANDLE section,uint offset); +HANDLE CreateDiscardableBitmap(HANDLE hdc,int cx,int cy); +HANDLE CreateEllipticRgn(int x1,int y1,int x2,int y2); +HANDLE CreateEllipticRgnIndirect(RECT &lprect); +HANDLE CreateEnhMetaFileW(HANDLE hdc,const string filename,RECT &lprc,const string desc); +HANDLE CreateFontIndirectExW(ENUMLOGFONTEXDVW &); +HANDLE CreateFontIndirectW(LOGFONTW &lplf); +HANDLE CreateFontW(int height,int width,int escapement,int orientation,int weight,uint italic,uint underline,uint strike_out,uint char_set,uint out_precision,uint clip_precision,uint quality,uint pitch_and_family,const string face_name); +HANDLE CreateHalftonePalette(HANDLE hdc); +HANDLE CreateHatchBrush(int hatch,uint clr); +HANDLE CreateICW(const string driver,const string device,const string port,DEVMODEW &pdm); +HANDLE CreateMetaFileW(const string file); +HANDLE CreatePalette(LOGPALETTE &plpal); +HANDLE CreatePatternBrush(HANDLE hbm); +HANDLE CreatePen(int style,int width,uint clr); +HANDLE CreatePenIndirect(LOGPEN &plpen); +HANDLE CreatePolygonRgn(POINT &pptl[],int point,int mode); +HANDLE CreatePolyPolygonRgn(const POINT &pptl[],const int &pc[],int poly,int mode); +HANDLE CreateRectRgn(int x1,int y1,int x2,int y2); +HANDLE CreateRectRgnIndirect(RECT &lprect); +HANDLE CreateRoundRectRgn(int x1,int y1,int x2,int y2,int w,int h); +int CreateScalableFontResourceW(uint hidden,const string font,const string file,const string path); +HANDLE CreateSolidBrush(uint clr); +int DeleteColorSpace(HANDLE hcs); +int DeleteDC(HANDLE hdc); +int DeleteEnhMetaFile(HANDLE hmf); +int DeleteMetaFile(HANDLE hmf); +int DeleteObject(PVOID ho); +int DescribePixelFormat(HANDLE hdc,int pixel_format,uint bytes,PIXELFORMATDESCRIPTOR &ppfd); +int DPtoLP(HANDLE hdc,POINT &lppt,int c); +int DrawEscape(HANDLE hdc,int escape,int in,uchar &in[]); +int Ellipse(HANDLE hdc,int left,int top,int right,int bottom); +int EndDoc(HANDLE hdc); +int EndPage(HANDLE hdc); +int EndPath(HANDLE hdc); +int EnumEnhMetaFile(HANDLE hdc,HANDLE hmf,PVOID proc,PVOID param,RECT &rect); +int EnumFontFamiliesExW(HANDLE hdc,LOGFONTW &logfont,PVOID proc,PVOID param,uint flags); +int EnumFontFamiliesW(HANDLE hdc,const string logfont,PVOID proc,PVOID param); +int EnumFontsW(HANDLE hdc,const string logfont,PVOID proc,PVOID param); +int EnumICMProfilesW(HANDLE hdc,PVOID proc,PVOID param); +int EnumMetaFile(HANDLE hdc,HANDLE hmf,PVOID proc,PVOID param); +int EnumObjects(HANDLE hdc,int type,PVOID func,PVOID param); +int EqualRgn(HANDLE hrgn1,HANDLE hrgn2); +int Escape(HANDLE hdc,int escape,int in,uchar &in[],PVOID out); +int ExcludeClipRect(HANDLE hdc,int left,int top,int right,int bottom); +HANDLE ExtCreatePen(uint pen_style,uint width,LOGBRUSH &plbrush,uint style,const uint &pstyle[]); +HANDLE ExtCreateRegion(XFORM &lpx,uint count,RGNDATA &data); +int ExtEscape(HANDLE hdc,int escape,int inp,uchar &in_data[],int output,uchar &out_data[]); +int ExtFloodFill(HANDLE hdc,int x,int y,uint clr,uint type); +int ExtSelectClipRgn(HANDLE hdc,HANDLE hrgn,int mode); +int ExtTextOutW(HANDLE hdc,int x,int y,uint options,const RECT &lprect,const string str,uint c,const int &dx[]); +int FillPath(HANDLE hdc); +int FillRgn(HANDLE hdc,HANDLE hrgn,HANDLE hbr); +int FixBrushOrgEx(HANDLE hdc,int x,int y,POINT &ptl); +int FlattenPath(HANDLE hdc); +int FloodFill(HANDLE hdc,int x,int y,uint clr); +int FrameRgn(HANDLE hdc,HANDLE hrgn,HANDLE hbr,int w,int h); +int GdiAlphaBlend(HANDLE dest,int dest,int dest,int dest,int dest,HANDLE src,int src,int src,int src,int src,BLENDFUNCTION &ftn); +int GdiComment(HANDLE hdc,uint size,const uchar &data[]); +int GdiFlush(void); +uint GdiGetBatchLimit(void); +int GdiGradientFill(HANDLE hdc,TRIVERTEX &vertex,uint vertex,PVOID mesh,uint count,uint mode); +uint GdiSetBatchLimit(uint dw); +int GdiTransparentBlt(HANDLE dest,int dest,int dest,int dest,int dest,HANDLE src,int src,int src,int src,int src,uint transparent); +int GetArcDirection(HANDLE hdc); +int GetAspectRatioFilterEx(HANDLE hdc,SIZE &lpsize); +int GetBitmapBits(HANDLE hbit,int cb,PVOID bits); +int GetBitmapDimensionEx(HANDLE hbit,SIZE &lpsize); +uint GetBkColor(HANDLE hdc); +int GetBkMode(HANDLE hdc); +uint GetBoundsRect(HANDLE hdc,RECT &lprect,uint flags); +int GetBrushOrgEx(HANDLE hdc,POINT &lppt); +int GetCharABCWidthsFloatW(HANDLE hdc,uint first,uint last,ABCFLOAT &lpABC[]); +int GetCharABCWidthsI(HANDLE hdc,uint first,uint cgi,ushort &pgi[],ABC &pabc[]); +int GetCharABCWidthsW(HANDLE hdc,uint first,uint last,ABC &lpABC[]); +uint GetCharacterPlacementW(HANDLE hdc,const string str,int count,int mex_extent,GCP_RESULTSW &results,uint flags); +int GetCharWidthFloatW(HANDLE hdc,uint first,uint last,float &buffer[]); +int GetCharWidthI(HANDLE hdc,uint first,uint cgi,ushort &pgi[],int &widths[]); +int GetCharWidthW(HANDLE hdc,uint first,uint last,int &buffer[]); +int GetClipBox(HANDLE hdc,RECT &lprect); +int GetClipRgn(HANDLE hdc,HANDLE hrgn); +int GetColorAdjustment(HANDLE hdc,COLORADJUSTMENT &lpca); +HANDLE GetColorSpace(HANDLE hdc); +PVOID GetCurrentObject(HANDLE hdc,uint type); +int GetCurrentPositionEx(HANDLE hdc,POINT &lppt); +uint GetDCBrushColor(HANDLE hdc); +int GetDCOrgEx(HANDLE hdc,POINT &lppt); +uint GetDCPenColor(HANDLE hdc); +int GetDeviceCaps(HANDLE hdc,int index); +int GetDeviceGammaRamp(HANDLE hdc,PVOID ramp); +int GetDeviceGammaRamp(HANDLE hdc,ushort &ramp[]); +uint GetDIBColorTable(HANDLE hdc,uint start,uint entries,RGBQUAD &prgbq[]); +int GetDIBits(HANDLE hdc,HANDLE hbm,uint start,uint lines,PVOID bits,BITMAPINFO &lpbmi,uint usage); +uint GetEnhMetaFileBits(HANDLE hEMF,uint size,uchar &data[]); +uint GetEnhMetaFileDescriptionW(HANDLE hemf,uint buffer,string description); +uint GetEnhMetaFileHeader(HANDLE hemf,uint size,ENHMETAHEADER &enh_meta_header); +uint GetEnhMetaFilePaletteEntries(HANDLE hemf,uint num_entries,PALETTEENTRY &palette_entries); +uint GetEnhMetaFilePixelFormat(HANDLE hemf,uint buffer,PIXELFORMATDESCRIPTOR &ppfd); +HANDLE GetEnhMetaFileW(const string name); +uint GetFontData(HANDLE hdc,uint table,uint offset,PVOID buffer,uint buffer); +uint GetFontLanguageInfo(HANDLE hdc); +uint GetFontUnicodeRanges(HANDLE hdc,PVOID lpgs); +uint GetFontUnicodeRanges(HANDLE hdc,GLYPHSET &lpgs); +uint GetGlyphIndicesW(HANDLE hdc,const string lpstr,int c,ushort &pgi[],uint fl); +uint GetGlyphOutlineW(HANDLE hdc,uint symbol,uint format,GLYPHMETRICS &lpgm,uint buffer,PVOID buffer,MAT2 &lpmat2); +int GetGraphicsMode(HANDLE hdc); +int GetICMProfileW(HANDLE hdc,uint &buf_size,ushort &filename[]); +uint GetKerningPairsW(HANDLE hdc,uint pairs,KERNINGPAIR &kern_pair); +uint GetLayout(HANDLE hdc); +int GetLogColorSpaceW(HANDLE color_space,LOGCOLORSPACEW &buffer,uint size); +int GetMapMode(HANDLE hdc); +uint GetMetaFileBitsEx(HANDLE hMF,uint buffer,PVOID data); +HANDLE GetMetaFileW(const string name); +int GetMetaRgn(HANDLE hdc,HANDLE hrgn); +int GetMiterLimit(HANDLE hdc,float &plimit); +uint GetNearestColor(HANDLE hdc,uint clr); +uint GetNearestPaletteIndex(HANDLE h,uint clr); +uint GetObjectType(PVOID h); +int GetObjectW(HANDLE h,int c,PVOID pv); +uint GetOutlineTextMetricsW(HANDLE hdc,uint copy,OUTLINETEXTMETRICW &potm); +uint GetPaletteEntries(HANDLE hpal,uint start,uint entries,PALETTEENTRY &pal_entries); +int GetPath(HANDLE hdc,POINT &apt,uchar &aj,int cpt); +uint GetPixel(HANDLE hdc,int x,int y); +int GetPixelFormat(HANDLE hdc); +int GetPolyFillMode(HANDLE hdc); +int GetRandomRgn(HANDLE hdc,HANDLE hrgn,int i); +int GetRasterizerCaps(RASTERIZER_STATUS &lpraststat,uint bytes); +uint GetRegionData(HANDLE hrgn,uint count,RGNDATA &rgn_data); +uint GetRegionData(HANDLE hrgn,uint count,PVOID rgn_data); +int GetRgnBox(HANDLE hrgn,RECT &lprc); +int GetROP2(HANDLE hdc); +PVOID GetStockObject(int i); +int GetStretchBltMode(HANDLE hdc); +uint GetSystemPaletteEntries(HANDLE hdc,uint start,uint entries,PALETTEENTRY &pal_entries); +uint GetSystemPaletteUse(HANDLE hdc); +uint GetTextAlign(HANDLE hdc); +int GetTextCharacterExtra(HANDLE hdc); +int GetTextCharset(HANDLE hdc); +int GetTextCharsetInfo(HANDLE hdc,FONTSIGNATURE &sig,uint flags); +uint GetTextColor(HANDLE hdc); +int GetTextExtentExPointI(HANDLE hdc,ushort &str[],int str_size,int max_extent,int &fit,int &dx[],SIZE &size); +int GetTextExtentExPointW(HANDLE hdc,const string str,int str,int max_extent,int &fit,int &dx[],SIZE &size); +int GetTextExtentPoint32W(HANDLE hdc,const string str,int c,SIZE &psizl); +int GetTextExtentPointI(HANDLE hdc,ushort &in[],int cgi,SIZE &psize); +int GetTextExtentPointW(HANDLE hdc,const string str,int c,SIZE &lpsz); +int GetTextFaceW(HANDLE hdc,int c,ushort &name[]); +int GetTextMetricsW(HANDLE hdc,TEXTMETRICW &lptm); +int GetViewportExtEx(HANDLE hdc,SIZE &lpsize); +int GetViewportOrgEx(HANDLE hdc,POINT &lppoint); +int GetWindowExtEx(HANDLE hdc,SIZE &lpsize); +int GetWindowOrgEx(HANDLE hdc,POINT &lppoint); +uint GetWinMetaFileBits(HANDLE hemf,uint data16,uchar &data16,int map_mode,HANDLE ref); +int GetWorldTransform(HANDLE hdc,XFORM &lpxf); +int IntersectClipRect(HANDLE hdc,int left,int top,int right,int bottom); +int InvertRgn(HANDLE hdc,HANDLE hrgn); +int LineTo(HANDLE hdc,int x,int y); +int LPtoDP(HANDLE hdc,POINT &lppt[],int c); +int MaskBlt(HANDLE dest,int dest,int dest,int width,int height,HANDLE src,int src,int src,HANDLE mask,int mask,int mask,uint rop); +int ModifyWorldTransform(HANDLE hdc,XFORM &lpxf,uint mode); +int MoveToEx(HANDLE hdc,int x,int y,POINT &lppt); +int OffsetClipRgn(HANDLE hdc,int x,int y); +int OffsetRgn(HANDLE hrgn,int x,int y); +int OffsetViewportOrgEx(HANDLE hdc,int x,int y,POINT &lppt); +int OffsetWindowOrgEx(HANDLE hdc,int x,int y,POINT &lppt); +int PaintRgn(HANDLE hdc,HANDLE hrgn); +int PatBlt(HANDLE hdc,int x,int y,int w,int h,uint rop); +HANDLE PathToRegion(HANDLE hdc); +int Pie(HANDLE hdc,int left,int top,int right,int bottom,int xr1,int yr1,int xr2,int yr2); +int PlayEnhMetaFile(HANDLE hdc,HANDLE hmf,RECT &lprect); +int PlayEnhMetaFileRecord(HANDLE hdc,HANDLETABLE &pht,ENHMETARECORD &pmr,uint cht); +int PlayMetaFile(HANDLE hdc,HANDLE hmf); +int PlayMetaFileRecord(HANDLE hdc,HANDLETABLE &handle_table,METARECORD &lpMR,uint objs); +int PlgBlt(HANDLE dest,POINT &point,HANDLE src,int src,int src,int width,int height,HANDLE mask,int mask,int mask); +int PolyBezier(HANDLE hdc,POINT &apt,uint cpt); +int PolyBezierTo(HANDLE hdc,POINT &apt,uint cpt); +int PolyDraw(HANDLE hdc,const POINT &apt,const uchar &aj[],int cpt); +int Polygon(HANDLE hdc,const POINT &apt,int cpt); +int Polyline(HANDLE hdc,const POINT &apt,int cpt); +int PolylineTo(HANDLE hdc,const POINT &apt,uint cpt); +int PolyPolygon(HANDLE hdc,const POINT &apt,int &asz[],int csz); +int PolyPolyline(HANDLE hdc,const POINT &apt,uint &asz[],uint csz); +int PolyTextOutW(HANDLE hdc,POLYTEXTW &ppt,int nstrings); +int PtInRegion(HANDLE hrgn,int x,int y); +int PtVisible(HANDLE hdc,int x,int y); +uint RealizePalette(HANDLE hdc); +int Rectangle(HANDLE hdc,int left,int top,int right,int bottom); +int RectInRegion(HANDLE hrgn,RECT &lprect); +int RectVisible(HANDLE hdc,RECT &lprect); +int RemoveFontMemResourceEx(HANDLE h); +int RemoveFontResourceExW(const string name,uint fl,PVOID pdv); +int RemoveFontResourceW(const string file_name); +HANDLE ResetDCW(HANDLE hdc,DEVMODEW &lpdm); +int ResizePalette(HANDLE hpal,uint n); +int RestoreDC(HANDLE hdc,int nSavedDC); +int RoundRect(HANDLE hdc,int left,int top,int right,int bottom,int width,int height); +int SaveDC(HANDLE hdc); +int ScaleViewportExtEx(HANDLE hdc,int xn,int dx,int yn,int yd,SIZE &lpsz); +int ScaleWindowExtEx(HANDLE hdc,int xn,int xd,int yn,int yd,SIZE &lpsz); +int SelectClipPath(HANDLE hdc,int mode); +int SelectClipRgn(HANDLE hdc,HANDLE hrgn); +PVOID SelectObject(HANDLE hdc,PVOID h); +HANDLE SelectPalette(HANDLE hdc,HANDLE pal,int force_bkgd); +int SetAbortProc(HANDLE hdc,PVOID proc); +int SetArcDirection(HANDLE hdc,int dir); +int SetBitmapBits(HANDLE hbm,uint cb,const uchar &bits[]); +int SetBitmapDimensionEx(HANDLE hbm,int w,int h,SIZE &lpsz); +uint SetBkColor(HANDLE hdc,uint clr); +int SetBkMode(HANDLE hdc,int mode); +uint SetBoundsRect(HANDLE hdc,RECT &lprect,uint flags); +int SetBrushOrgEx(HANDLE hdc,int x,int y,POINT &lppt); +int SetColorAdjustment(HANDLE hdc,COLORADJUSTMENT &lpca); +HANDLE SetColorSpace(HANDLE hdc,HANDLE hcs); +uint SetDCBrushColor(HANDLE hdc,uint clr); +uint SetDCPenColor(HANDLE hdc,uint clr); +int SetDeviceGammaRamp(HANDLE hdc,PVOID ramp); +uint SetDIBColorTable(HANDLE hdc,uint start,uint entries,RGBQUAD &prgbq); +int SetDIBits(HANDLE hdc,HANDLE hbm,uint start,uint lines,PVOID bits,BITMAPINFO &lpbmi,uint ColorUse); +int SetDIBitsToDevice(HANDLE hdc,int dest,int dest,uint w,uint h,int src,int src,uint StartScan,uint lines,PVOID bits,BITMAPINFO &lpbmi,uint ColorUse); +HANDLE SetEnhMetaFileBits(uint size,const uchar &pb[]); +int SetGraphicsMode(HANDLE hdc,int mode); +int SetICMMode(HANDLE hdc,int mode); +int SetICMProfileW(HANDLE hdc,string file_name); +uint SetLayout(HANDLE hdc,uint l); +int SetMapMode(HANDLE hdc,int mode); +uint SetMapperFlags(HANDLE hdc,uint flags); +HANDLE SetMetaFileBitsEx(uint buffer,const uchar &data[]); +int SetMetaRgn(HANDLE hdc); +int SetMiterLimit(HANDLE hdc,float limit,float &old); +uint SetPaletteEntries(HANDLE hpal,uint start,uint entries,PALETTEENTRY &pal_entries); +uint SetPixel(HANDLE hdc,int x,int y,uint clr); +int SetPixelFormat(HANDLE hdc,int format,PIXELFORMATDESCRIPTOR &ppfd); +int SetPixelV(HANDLE hdc,int x,int y,uint clr); +int SetPolyFillMode(HANDLE hdc,int mode); +int SetRectRgn(HANDLE hrgn,int left,int top,int right,int bottom); +int SetROP2(HANDLE hdc,int rop2); +int SetStretchBltMode(HANDLE hdc,int mode); +uint SetSystemPaletteUse(HANDLE hdc,uint use); +uint SetTextAlign(HANDLE hdc,uint align); +int SetTextCharacterExtra(HANDLE hdc,int extra); +uint SetTextColor(HANDLE hdc,uint clr); +int SetTextJustification(HANDLE hdc,int extra,int count); +int SetViewportExtEx(HANDLE hdc,int x,int y,SIZE &lpsz); +int SetViewportOrgEx(HANDLE hdc,int x,int y,POINT &lppt); +int SetWindowExtEx(HANDLE hdc,int x,int y,SIZE &lpsz); +int SetWindowOrgEx(HANDLE hdc,int x,int y,POINT &lppt); +HANDLE SetWinMetaFileBits(uint size,const uchar &lpMeta16Data[],HANDLE ref,const METAFILEPICT &lpMFP); +int SetWorldTransform(HANDLE hdc,XFORM &lpxf); +int StartDocW(HANDLE hdc,DOCINFOW &lpdi); +int StartPage(HANDLE hdc); +int StretchBlt(HANDLE dest,int dest,int dest,int dest,int dest,HANDLE src,int src,int src,int src,int src,uint rop); +int StretchDIBits(HANDLE hdc,int dest,int dest,int DestWidth,int DestHeight,int src,int src,int SrcWidth,int SrcHeight,PVOID bits,BITMAPINFO &lpbmi,uint usage,uint rop); +int StrokeAndFillPath(HANDLE hdc); +int StrokePath(HANDLE hdc); +int SwapBuffers(HANDLE); +int TextOutW(HANDLE hdc,int x,int y,const string str,int c); +int TranslateCharsetInfo(PVOID src,CHARSETINFO &cs,uint flags); +int UnrealizeObject(PVOID h); +int UpdateColors(HANDLE hdc); +int UpdateICMRegKeyW(uint reserved,string lpszCMID,string file_name,uint command); +int WidenPath(HANDLE hdc); +#import + +#import "Opengl32.dll" +int wglCopyContext(HANDLE,HANDLE,uint); +HANDLE wglCreateContext(HANDLE); +HANDLE wglCreateLayerContext(HANDLE,int); +int wglDeleteContext(HANDLE); +int wglDescribeLayerPlane(HANDLE,int,int,uint,LAYERPLANEDESCRIPTOR &); +HANDLE wglGetCurrentContext(void); +HANDLE wglGetCurrentDC(void); +int wglGetLayerPaletteEntries(HANDLE,int,int,int,const uint &[]); +PVOID wglGetProcAddress(string); +int wglMakeCurrent(HANDLE,HANDLE); +int wglRealizeLayerPalette(HANDLE,int,int); +int wglSetLayerPaletteEntries(HANDLE,int,int,int,const uint &[]); +int wglShareLists(HANDLE,HANDLE); +int wglSwapLayerBuffers(HANDLE,uint); +uint wglSwapMultipleBuffers(uint,WGLSWAP &); +int wglUseFontBitmapsW(HANDLE,uint,uint,uint); +int wglUseFontOutlinesW(HANDLE,uint,uint,uint,float,float,int,GLYPHMETRICSFLOAT &); +#import +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/WinAPI/winnt.mqh b/WinAPI/winnt.mqh new file mode 100644 index 0000000..bfbb840 --- /dev/null +++ b/WinAPI/winnt.mqh @@ -0,0 +1,3642 @@ +//+------------------------------------------------------------------+ +//| winnt.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include + +//--- +#define UNWIND_HISTORY_TABLE_SIZE 12 +#define SIZE_OF_80387_REGISTERS 80 +#define MAXIMUM_SUPPORTED_EXTENSION 512 +#define WOW64_SIZE_OF_80387_REGISTERS 80 +#define WOW64_MAXIMUM_SUPPORTED_EXTENSION 512 +#define SID_HASH_SIZE 32 +#define POLICY_AUDIT_SUBCATEGORY_COUNT 59 +#define TOKEN_SOURCE_LENGTH 8 +#define MAXIMUM_XSTATE_FEATURES 64 +#define POWER_SYSTEM_MAXIMUM 7 +#define NUM_DISCHARGE_POLICIES 4 +#define HIBERFILE_TYPE_MAX 0x03 +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 +#define IMAGE_SIZEOF_SHORT_NAME 8 +#define IMAGE_ENCLAVE_LONG_ID_LENGTH 32 +#define IMAGE_ENCLAVE_SHORT_ID_LENGTH 16 +#define RTL_CORRELATION_VECTOR_STRING_LENGTH 129 + +//--- +enum SID_NAME_USE + { + SidTypeUser=1, + SidTypeGroup, + SidTypeDomain, + SidTypeAlias, + SidTypeWellKnownGroup, + SidTypeDeletedAccount, + SidTypeInvalid, + SidTypeUnknown, + SidTypeComputer, + SidTypeLabel, + SidTypeLogonSession + }; +//--- +enum ACL_INFORMATION_CLASS + { + AclRevisionInformation=1, + AclSizeInformation + }; +//--- +enum AUDIT_EVENT_TYPE + { + AuditEventObjectAccess, + AuditEventDirectoryServiceAccess + }; +//--- +enum ACCESS_REASON_TYPE + { + AccessReasonNone=0x00000000, + AccessReasonAllowedAce=0x00010000, + AccessReasonDeniedAce=0x00020000, + AccessReasonAllowedParentAce=0x00030000, + AccessReasonDeniedParentAce=0x00040000, + AccessReasonNotGrantedByCape=0x00050000, + AccessReasonNotGrantedByParentCape=0x00060000, + AccessReasonNotGrantedToAppContainer=0x00070000, + AccessReasonMissingPrivilege=0x00100000, + AccessReasonFromPrivilege=0x00200000, + AccessReasonIntegrityLevel=0x00300000, + AccessReasonOwnership=0x00400000, + AccessReasonNullDacl=0x00500000, + AccessReasonEmptyDacl=0x00600000, + AccessReasonNoSD=0x00700000, + AccessReasonNoGrant=0x00800000, + AccessReasonTrustLabel=0x00900000, + AccessReasonFilterAce=0x00a00000 + }; +//--- +enum SECURITY_IMPERSONATION_LEVEL + { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation + }; +//--- +enum TOKEN_TYPE + { + TokenPrimary=1, + TokenImpersonation + }; +//--- +enum TOKEN_ELEVATION_TYPE + { + TokenElevationTypeDefault=1, + TokenElevationTypeFull, + TokenElevationTypeLimited + }; +//--- +enum TOKEN_INFORMATION_CLASS + { + TokenUser=1, + TokenGroups, + TokenPrivileges, + TokenOwner, + TokenPrimaryGroup, + TokenDefaultDacl, + TokenSource, + TokenType, + TokenImpersonationLevel, + TokenStatistics, + TokenRestrictedSids, + TokenSessionId, + TokenGroupsAndPrivileges, + TokenSessionReference, + TokenSandBoxInert, + TokenAuditPolicy, + TokenOrigin, + TokenElevationType, + TokenLinkedToken, + TokenElevation, + TokenHasRestrictions, + TokenAccessInformation, + TokenVirtualizationAllowed, + TokenVirtualizationEnabled, + TokenIntegrityLevel, + TokenUIAccess, + TokenMandatoryPolicy, + TokenLogonSid, + TokenIsAppContainer, + TokenCapabilities, + TokenAppContainerSid, + TokenAppContainerNumber, + TokenUserClaimAttributes, + TokenDeviceClaimAttributes, + TokenRestrictedUserClaimAttributes, + TokenRestrictedDeviceClaimAttributes, + TokenDeviceGroups, + TokenRestrictedDeviceGroups, + TokenSecurityAttributes, + TokenIsRestricted, + TokenProcessTrustLevel, + TokenPrivateNameSpace, + TokenSingletonAttributes, + TokenBnoIsolation, + TokenChildProcessFlags, + MaxTokenInfoClass + }; +//--- +enum MANDATORY_LEVEL + { + MandatoryLevelUntrusted=0, + MandatoryLevelLow, + MandatoryLevelMedium, + MandatoryLevelHigh, + MandatoryLevelSystem, + MandatoryLevelSecureProcess, + MandatoryLevelCount + }; +//--- +enum SE_IMAGE_SIGNATURE_TYPE + { + SeImageSignatureNone=0, + SeImageSignatureEmbedded, + SeImageSignatureCache, + SeImageSignatureCatalogCached, + SeImageSignatureCatalogNotCached, + SeImageSignatureCatalogHint, + SeImageSignaturePackageCatalog + }; +//--- +enum SE_LEARNING_MODE_DATA_TYPE + { + SeLearningModeInvalidType=0, + SeLearningModeSettings, + SeLearningModeMax + }; +//--- +enum HARDWARE_COUNTER_TYPE + { + PMCCounter, + MaxHardwareCounterType + }; +//--- +enum PROCESS_MITIGATION_POLICY + { + ProcessDEPPolicy, + ProcessASLRPolicy, + ProcessDynamicCodePolicy, + ProcessStrictHandleCheckPolicy, + ProcessSystemCallDisablePolicy, + ProcessMitigationOptionsMask, + ProcessExtensionPointDisablePolicy, + ProcessControlFlowGuardPolicy, + ProcessSignaturePolicy, + ProcessFontDisablePolicy, + ProcessImageLoadPolicy, + ProcessSystemCallFilterPolicy, + ProcessPayloadRestrictionPolicy, + ProcessChildProcessPolicy, + MaxProcessMitigationPolicy + }; +//--- +enum JOBOBJECT_RATE_CONTROL_TOLERANCE + { + ToleranceLow=1, + ToleranceMedium, + ToleranceHigh + }; +//--- +enum JOBOBJECT_RATE_CONTROL_TOLERANCE_INTERVAL + { + ToleranceIntervalShort=1, + ToleranceIntervalMedium, + ToleranceIntervalLong + }; +//--- +enum JOB_OBJECT_NET_RATE_CONTROL_FLAGS + { + JOB_OBJECT_NET_RATE_CONTROL_ENABLE=0x1, + JOB_OBJECT_NET_RATE_CONTROL_MAX_BANDWIDTH=0x2, + JOB_OBJECT_NET_RATE_CONTROL_DSCP_TAG=0x4, + JOB_OBJECT_NET_RATE_CONTROL_VALID_FLAGS=0x7 + }; +//--- +enum JOB_OBJECT_IO_RATE_CONTROL_FLAGS + { + JOB_OBJECT_IO_RATE_CONTROL_ENABLE=0x1, + JOB_OBJECT_IO_RATE_CONTROL_STANDALONE_VOLUME=0x2, + JOB_OBJECT_IO_RATE_CONTROL_FORCE_UNIT_ACCESS_ALL=0x4, + JOB_OBJECT_IO_RATE_CONTROL_FORCE_UNIT_ACCESS_ON_SOFT_CAP=0x8, + JOB_OBJECT_IO_RATE_CONTROL_VALID_FLAGS=JOB_OBJECT_IO_RATE_CONTROL_ENABLE| + JOB_OBJECT_IO_RATE_CONTROL_STANDALONE_VOLUME| + JOB_OBJECT_IO_RATE_CONTROL_FORCE_UNIT_ACCESS_ALL| + JOB_OBJECT_IO_RATE_CONTROL_FORCE_UNIT_ACCESS_ON_SOFT_CAP + }; +//--- +enum JOBOBJECT_IO_ATTRIBUTION_CONTROL_FLAGS + { + JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE=0x1, + JOBOBJECT_IO_ATTRIBUTION_CONTROL_DISABLE=0x2, + JOBOBJECT_IO_ATTRIBUTION_CONTROL_VALID_FLAGS=0x3 + }; +//--- +enum JOBOBJECTINFOCLASS + { + JobObjectBasicAccountingInformation=1, + JobObjectBasicLimitInformation, + JobObjectBasicProcessIdList, + JobObjectBasicUIRestrictions, + JobObjectSecurityLimitInformation, + JobObjectEndOfJobTimeInformation, + JobObjectAssociateCompletionPortInformation, + JobObjectBasicAndIoAccountingInformation, + JobObjectExtendedLimitInformation, + JobObjectJobSetInformation, + JobObjectGroupInformation, + JobObjectNotificationLimitInformation, + JobObjectLimitViolationInformation, + JobObjectGroupInformationEx, + JobObjectCpuRateControlInformation, + JobObjectCompletionFilter, + JobObjectCompletionCounter, + JobObjectReserved1Information=18, + JobObjectReserved2Information, + JobObjectReserved3Information, + JobObjectReserved4Information, + JobObjectReserved5Information, + JobObjectReserved6Information, + JobObjectReserved7Information, + JobObjectReserved8Information, + JobObjectReserved9Information, + JobObjectReserved10Information, + JobObjectReserved11Information, + JobObjectReserved12Information, + JobObjectReserved13Information, + JobObjectReserved14Information=31, + JobObjectNetRateControlInformation, + JobObjectNotificationLimitInformation2, + JobObjectLimitViolationInformation2, + JobObjectCreateSilo, + JobObjectSiloBasicInformation, + JobObjectReserved15Information=37, + JobObjectReserved16Information=38, + JobObjectReserved17Information=39, + JobObjectReserved18Information=40, + JobObjectReserved19Information=41, + JobObjectReserved20Information=42, + JobObjectReserved21Information=43, + JobObjectReserved22Information=44, + JobObjectReserved23Information=45, + JobObjectReserved24Information=46, + JobObjectReserved25Information=47, + MaxJobObjectInfoClass + }; +//--- +enum SERVERSILO_STATE + { + SERVERSILO_INITING=0, + SERVERSILO_STARTED, + SERVERSILO_SHUTTING_DOWN, + SERVERSILO_TERMINATING, + SERVERSILO_TERMINATED + }; +//--- +enum FIRMWARE_TYPE + { + FirmwareTypeUnknown, + FirmwareTypeBios, + FirmwareTypeUefi, + FirmwareTypeMax + }; +//--- +enum LOGICAL_PROCESSOR_RELATIONSHIP + { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll=0xffff + }; +//--- +enum PROCESSOR_CACHE_TYPE + { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace + }; +//--- +enum CPU_SET_INFORMATION_TYPE + { + CpuSetInformation + }; +//--- +enum MEM_EXTENDED_PARAMETER_TYPE + { + MemExtendedParameterInvalidType=0, + MemExtendedParameterAddressRequirements, + MemExtendedParameterNumaNode, + MemExtendedParameterPartitionHandle, + MemExtendedParameterMax + }; +//--- +enum SharedVirtualDiskSupportType + { + SharedVirtualDisksUnsupported=0, + SharedVirtualDisksSupported=1, + SharedVirtualDiskSnapshotsSupported=3, + SharedVirtualDiskCDPSnapshotsSupported=7 + }; +//--- +enum SharedVirtualDiskHandleState + { + SharedVirtualDiskHandleStateNone=0, + SharedVirtualDiskHandleStateFileShared=1, + SharedVirtualDiskHandleStateHandleShared=3 + }; +//--- +enum SYSTEM_POWER_STATE + { + PowerSystemUnspecified=0, + PowerSystemWorking=1, + PowerSystemSleeping1=2, + PowerSystemSleeping2=3, + PowerSystemSleeping3=4, + PowerSystemHibernate=5, + PowerSystemShutdown=6, + PowerSystemMaximum=7 + }; +//--- +enum DEVICE_POWER_STATE + { + PowerDeviceUnspecified=0, + PowerDeviceD0, + PowerDeviceD1, + PowerDeviceD2, + PowerDeviceD3, + PowerDeviceMaximum + }; +//--- +enum MONITOR_DISPLAY_STATE + { + PowerMonitorOff=0, + PowerMonitorOn, + PowerMonitorDim + }; +//--- +enum USER_ACTIVITY_PRESENCE + { + PowerUserPresent=0, + PowerUserNotPresent, + PowerUserInactive, + PowerUserMaximum, + PowerUserInvalid=PowerUserMaximum + }; +//--- +enum POWER_REQUEST_TYPE + { + PowerRequestDisplayRequired, + PowerRequestSystemRequired, + PowerRequestAwayModeRequired, + PowerRequestExecutionRequired + }; +//--- +enum POWER_MONITOR_REQUEST_TYPE + { + MonitorRequestTypeOff, + MonitorRequestTypeOnAndPresent, + MonitorRequestTypeToggleOn + }; +//--- +enum POWER_PLATFORM_ROLE + { + PlatformRoleUnspecified=0, + PlatformRoleDesktop, + PlatformRoleMobile, + PlatformRoleWorkstation, + PlatformRoleEnterpriseServer, + PlatformRoleSOHOServer, + PlatformRoleAppliancePC, + PlatformRolePerformanceServer, + PlatformRoleSlate, + PlatformRoleMaximum + }; +//--- +enum HIBERFILE_BUCKET_SIZE + { + HiberFileBucket1GB=0, + HiberFileBucket2GB, + HiberFileBucket4GB, + HiberFileBucket8GB, + HiberFileBucket16GB, + HiberFileBucket32GB, + HiberFileBucketUnlimited, + HiberFileBucketMax + }; +//--- +enum IMAGE_AUX_SYMBOL_TYPE + { + IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF=1 + }; +//--- +enum IMPORT_OBJECT_TYPE + { + IMPORT_OBJECT_CODE=0, + IMPORT_OBJECT_DATA=1, + IMPORT_OBJECT_CONST=2 + }; +//--- +enum IMPORT_OBJECT_NAME_TYPE + { + IMPORT_OBJECT_ORDINAL=0, + IMPORT_OBJECT_NAME=1, + IMPORT_OBJECT_NAME_NO_PREFIX=2, + IMPORT_OBJECT_NAME_UNDECORATE=3, + IMPORT_OBJECT_NAME_EXPORTAS=4 + }; +//--- +enum ReplacesCorHdrNumericDefines + { + COMIMAGE_FLAGS_ILONLY=0x00000001, + COMIMAGE_FLAGS_32BITREQUIRED=0x00000002, + COMIMAGE_FLAGS_IL_LIBRARY=0x00000004, + COMIMAGE_FLAGS_STRONGNAMESIGNED=0x00000008, + COMIMAGE_FLAGS_NATIVE_ENTRYPOINT=0x00000010, + COMIMAGE_FLAGS_TRACKDEBUGDATA=0x00010000, + COMIMAGE_FLAGS_32BITPREFERRED=0x00020000, + COR_VERSION_MAJOR_V2=2, + COR_VERSION_MAJOR=COR_VERSION_MAJOR_V2, + COR_VERSION_MINOR=5, + COR_DELETED_NAME_LENGTH=8, + COR_VTABLEGAP_NAME_LENGTH=8, + NATIVE_TYPE_MAX_CB=1, + COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF, + IMAGE_COR_MIH_METHODRVA=0x01, + IMAGE_COR_MIH_EHRVA=0x02, + IMAGE_COR_MIH_BASICBLOCK=0x08, + COR_VTABLE_32BIT=0x01, + COR_VTABLE_64BIT=0x02, + COR_VTABLE_FROM_UNMANAGED=0x04, + COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN=0x08, + COR_VTABLE_CALL_MOST_DERIVED=0x10, + IMAGE_COR_EATJ_THUNK_SIZE=32, + MAX_CLASS_NAME=1024, + MAX_PACKAGE_NAME=1024 + }; +//--- +enum RTL_UMS_THREAD_INFO_CLASS + { + UmsThreadInvalidInfoClass=0, + UmsThreadUserContext, + UmsThreadPriority, + UmsThreadAffinity, + UmsThreadTeb, + UmsThreadIsSuspended, + UmsThreadIsTerminated, + UmsThreadMaxInfoClass + }; +//--- +enum RTL_UMS_SCHEDULER_REASON + { + UmsSchedulerStartup=0, + UmsSchedulerThreadBlocked, + UmsSchedulerThreadYield + }; +//--- +enum OS_DEPLOYEMENT_STATE_VALUES + { + OS_DEPLOYMENT_STANDARD=1, + OS_DEPLOYMENT_COMPACT + }; +//--- +enum IMAGE_POLICY_ENTRY_TYPE + { + ImagePolicyEntryTypeNone=0, + ImagePolicyEntryTypeBool, + ImagePolicyEntryTypeInt8, + ImagePolicyEntryTypeUInt8, + ImagePolicyEntryTypeInt16, + ImagePolicyEntryTypeUInt16, + ImagePolicyEntryTypeInt32, + ImagePolicyEntryTypeUInt32, + ImagePolicyEntryTypeInt64, + ImagePolicyEntryTypeUInt64, + ImagePolicyEntryTypeAnsiString, + ImagePolicyEntryTypeUnicodeString, + ImagePolicyEntryTypeOverride, + ImagePolicyEntryTypeMaximum + }; +//--- +enum IMAGE_POLICY_ID + { + ImagePolicyIdNone=0, + ImagePolicyIdEtw, + ImagePolicyIdDebug, + ImagePolicyIdCrashDump, + ImagePolicyIdCrashDumpKey, + ImagePolicyIdCrashDumpKeyGuid, + ImagePolicyIdParentSd, + ImagePolicyIdParentSdRev, + ImagePolicyIdSvn, + ImagePolicyIdDeviceId, + ImagePolicyIdCapability, + ImagePolicyIdScenarioId, + ImagePolicyIdMaximum + }; +//--- +enum HEAP_INFORMATION_CLASS + { + HeapCompatibilityInformation=0, + HeapEnableTerminationOnCorruption=1, + HeapOptimizeResources=3 + }; +//--- +enum ACTIVATION_CONTEXT_INFO_CLASS + { + ActivationContextBasicInformation=1, + ActivationContextDetailedInformation=2, + AssemblyDetailedInformationInActivationContext=3, + FileInformationInAssemblyOfAssemblyInActivationContext=4, + RunlevelInformationInActivationContext=5, + CompatibilityInformationInActivationContext=6, + ActivationContextManifestResourceName=7, + MaxActivationContextInfoClass, + AssemblyDetailedInformationInActivationContxt=3, + FileInformationInAssemblyOfAssemblyInActivationContxt=4 + }; +//--- +enum SERVICE_NODE_TYPE + { + DriverType=0x00000001, + FileSystemType=0x00000002, + Win32ServiceOwnProcess=0x00000010, + Win32ServiceShareProcess=0x00000020, + AdapterType=0x00000004, + RecognizerType=0x00000008 + }; +//--- +enum SERVICE_LOAD_TYPE + { + BootLoad=0x00000000, + SystemLoad=0x00000001, + AutoLoad=0x00000002, + DemandLoad=0x00000003, + DisableLoad=0x00000004 + }; +//--- +enum SERVICE_ERROR_TYPE + { + IgnoreError=0x00000000, + NormalError=0x00000001, + SevereError=0x00000002, + CriticalError=0x00000003 + }; +//--- +enum TAPE_DRIVE_PROBLEM_TYPE + { + TapeDriveProblemNone, + TapeDriveReadWriteWarning, + TapeDriveReadWriteError, + TapeDriveReadWarning, + TapeDriveWriteWarning, + TapeDriveReadError, + TapeDriveWriteError, + TapeDriveHardwareError, + TapeDriveUnsupportedMedia, + TapeDriveScsiConnectionError, + TapeDriveTimetoClean, + TapeDriveCleanDriveNow, + TapeDriveMediaLifeExpired, + TapeDriveSnappedTape + }; +//--- +enum TRANSACTION_OUTCOME + { + TransactionOutcomeUndetermined=1, + TransactionOutcomeCommitted, + TransactionOutcomeAborted + }; +//--- +enum TRANSACTION_STATE + { + TransactionStateNormal=1, + TransactionStateIndoubt, + TransactionStateCommittedNotify + }; +//--- +enum TRANSACTION_INFORMATION_CLASS + { + TransactionBasicInformation, + TransactionPropertiesInformation, + TransactionEnlistmentInformation, + TransactionSuperiorEnlistmentInformation, + TransactionBindInformation, + TransactionDTCPrivateInformation + }; +//--- +enum TRANSACTIONMANAGER_INFORMATION_CLASS + { + TransactionManagerBasicInformation, + TransactionManagerLogInformation, + TransactionManagerLogPathInformation, + TransactionManagerRecoveryInformation=4, + TransactionManagerOnlineProbeInformation=3, + TransactionManagerOldestTransactionInformation=5 + }; +//--- +enum RESOURCEMANAGER_INFORMATION_CLASS + { + ResourceManagerBasicInformation, + ResourceManagerCompletionInformation + }; +//--- +enum ENLISTMENT_INFORMATION_CLASS + { + EnlistmentBasicInformation, + EnlistmentRecoveryInformation, + EnlistmentCrmInformation + }; +//--- +enum KTMOBJECT_TYPE + { + KTMOBJECT_TRANSACTION, + KTMOBJECT_TRANSACTION_MANAGER, + KTMOBJECT_RESOURCE_MANAGER, + KTMOBJECT_ENLISTMENT, + KTMOBJECT_INVALID + }; +//--- +enum TP_CALLBACK_PRIORITY + { + TP_CALLBACK_PRIORITY_HIGH, + TP_CALLBACK_PRIORITY_NORMAL, + TP_CALLBACK_PRIORITY_LOW, + TP_CALLBACK_PRIORITY_INVALID, + TP_CALLBACK_PRIORITY_COUNT=TP_CALLBACK_PRIORITY_INVALID + }; +//--- +enum POWER_USER_PRESENCE_TYPE + { + UserNotPresent=0, + UserPresent=1, + UserUnknown=0xff + }; +//--- +enum POWER_MONITOR_REQUEST_REASON + { + MonitorRequestReasonUnknown, + MonitorRequestReasonPowerButton, + MonitorRequestReasonRemoteConnection, + MonitorRequestReasonScMonitorpower, + MonitorRequestReasonUserInput, + MonitorRequestReasonAcDcDisplayBurst, + MonitorRequestReasonUserDisplayBurst, + MonitorRequestReasonPoSetSystemState, + MonitorRequestReasonSetThreadExecutionState, + MonitorRequestReasonFullWake, + MonitorRequestReasonSessionUnlock, + MonitorRequestReasonScreenOffRequest, + MonitorRequestReasonIdleTimeout, + MonitorRequestReasonPolicyChange, + MonitorRequestReasonSleepButton, + MonitorRequestReasonLid, + MonitorRequestReasonBatteryCountChange, + MonitorRequestReasonGracePeriod, + MonitorRequestReasonPnP, + MonitorRequestReasonDP, + MonitorRequestReasonSxTransition, + MonitorRequestReasonSystemIdle, + MonitorRequestReasonNearProximity, + MonitorRequestReasonThermalStandby, + MonitorRequestReasonResumePdc, + MonitorRequestReasonResumeS4, + MonitorRequestReasonTerminal, + MonitorRequestReasonPdcSignal, + MonitorRequestReasonAcDcDisplayBurstSuppressed, + MonitorRequestReasonSystemStateEntered, + MonitorRequestReasonWinrt, + MonitorRequestReasonUserInputKeyboard, + MonitorRequestReasonUserInputMouse, + MonitorRequestReasonUserInputTouch, + MonitorRequestReasonUserInputPen, + MonitorRequestReasonUserInputAccelerometer, + MonitorRequestReasonUserInputHid, + MonitorRequestReasonUserInputPoUserPresent, + MonitorRequestReasonUserInputSessionSwitch, + MonitorRequestReasonUserInputInitialization, + MonitorRequestReasonPdcSignalWindowsMobilePwrNotif, + MonitorRequestReasonPdcSignalWindowsMobileShell, + MonitorRequestReasonPdcSignalHeyCortana, + MonitorRequestReasonPdcSignalHolographicShell, + MonitorRequestReasonPdcSignalFingerprint, + MonitorRequestReasonMax + }; +//--- +enum POWER_ACTION + { + PowerActionNone=0, + PowerActionReserved, + PowerActionSleep, + PowerActionHibernate, + PowerActionShutdown, + PowerActionShutdownReset, + PowerActionShutdownOff, + PowerActionWarmEject, + PowerActionDisplayOff + }; +//--- +enum ACTCTX_REQUESTED_RUN_LEVEL + { + ACTCTX_RUN_LEVEL_UNSPECIFIED=0, + ACTCTX_RUN_LEVEL_AS_INVOKER, + ACTCTX_RUN_LEVEL_HIGHEST_AVAILABLE, + ACTCTX_RUN_LEVEL_REQUIRE_ADMIN, + ACTCTX_RUN_LEVEL_NUMBERS + }; +//--- +enum ACTCTX_COMPATIBILITY_ELEMENT_TYPE + { + ACTCTX_COMPATIBILITY_ELEMENT_TYPE_UNKNOWN=0, + ACTCTX_COMPATIBILITY_ELEMENT_TYPE_OS, + ACTCTX_COMPATIBILITY_ELEMENT_TYPE_MITIGATION + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//--- +struct PROCESSOR_NUMBER + { + ushort Group; + uchar Number; + uchar Reserved; + }; +//--- +struct GROUP_AFFINITY + { + ulong Mask; + ushort Group; + ushort Reserved[3]; + }; +//--- +struct FLOAT128 + { + long LowPart; + long HighPart; + }; +//--- +struct LARGE_INTEGER + { + long QuadPart; + }; +//--- +struct ULARGE_INTEGER + { + ulong QuadPart; + }; +//--- +struct LUID + { + uint LowPart; + int HighPart; + }; +//--- +struct LIST_ENTRY + { + PVOID Flink; + PVOID Blink; + }; +//--- +struct SINGLE_LIST_ENTRY + { + PVOID Next; + }; +//--- +struct LIST_ENTRY32 + { + uint Flink; + uint Blink; + }; +//--- +struct LIST_ENTRY64 + { + ulong Flink; + ulong Blink; + }; +//--- +struct OBJECTID + { + GUID Lineage; + uint Uniquifier; + }; +//--- +struct M128A + { + ulong Low; + long High; + }; +//--- +struct XSAVE_FORMAT + { + ushort Controlushort; + ushort Statusushort; + uchar Tagushort; + uchar Reserved1; + ushort ErrorOpcode; + uint ErrorOffset; + ushort ErrorSelector; + ushort Reserved2; + uint DataOffset; + ushort DataSelector; + ushort Reserved3; + uint MxCsr; + uint MxCsr_Mask; + M128A FloatRegisters[8]; + M128A XmmRegisters[16]; + uchar Reserved4[96]; + }; +//--- +struct XSAVE_AREA_HEADER + { + ulong Mask; + ulong CompactionMask; + ulong Reserved2[6]; + }; +//--- +struct XSAVE_AREA + { + XSAVE_FORMAT LegacyState; + XSAVE_AREA_HEADER Header; + }; +//--- +struct XSTATE_CONTEXT + { + ulong Mask; + uint Length; + uint Reserved1; + PVOID Area; + uint Reserved2; + PVOID Buffer; + uint Reserved3; + }; +//--- +struct SCOPE_TABLE_AMD64 + { + uint Count; + uint BeginAddress; + uint EndAddress; + uint HandlerAddress; + uint JumpTarget; + }; +//--- +struct UNWIND_HISTORY_TABLE_ENTRY + { + ulong ImageBase; + PVOID FunctionEntry; + }; +//--- +struct UNWIND_HISTORY_TABLE + { + uint Count; + uchar LocalHint; + uchar GlobalHint; + uchar Search; + uchar Once; + ulong LowAddress; + ulong HighAddress; + UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; + }; +//--- +struct SCOPE_TABLE_ARM64 + { + uint Count; + uint BeginAddress; + uint EndAddress; + uint HandlerAddress; + uint JumpTarget; + }; +//--- +struct NEON128 + { + ulong Low; + long High; + }; +//--- +struct DISPATCHER_CONTEXT + { + uint ControlPc; + uint ImageBase; + PVOID FunctionEntry; + uint EstablisherFrame; + uint TargetPc; + PVOID ContextRecord; + PVOID LanguageHandler; + PVOID HandlerData; + PVOID HistoryTable; + uint ScopeIndex; + uchar ControlPcIsUnwound; + PVOID NonVolatileRegisters; + uint Reserved; + }; +//--- +struct KNONVOLATILE_CONTEXT_POINTERS + { + PVOID FloatingContext[16]; + PVOID IntegerContext[16]; + }; +//--- +struct SCOPE_TABLE_ARM + { + uint Count; + uint BeginAddress; + uint EndAddress; + uint HandlerAddress; + uint JumpTarget; + }; +//--- +struct DISPATCHER_CONTEXT_ARM64 + { + ulong ControlPc; + ulong ImageBase; + PVOID FunctionEntry; + ulong EstablisherFrame; + ulong TargetPc; + PVOID ContextRecord; + PVOID LanguageHandler; + PVOID HandlerData; + PVOID HistoryTable; + uint ScopeIndex; + uchar ControlPcIsUnwound; + PVOID NonVolatileRegisters; + }; +//--- +struct KNONVOLATILE_CONTEXT_POINTERS_ARM64 + { + PVOID X19; + PVOID X20; + PVOID X21; + PVOID X22; + PVOID X23; + PVOID X24; + PVOID X25; + PVOID X26; + PVOID X27; + PVOID X28; + PVOID Fp; + PVOID Lr; + PVOID D8; + PVOID D9; + PVOID D10; + PVOID D11; + PVOID D12; + PVOID D13; + PVOID D14; + PVOID D15; + }; +//--- +struct FLOATING_SAVE_AREA + { + uint Controlushort; + uint Statusushort; + uint Tagushort; + uint ErrorOffset; + uint ErrorSelector; + uint DataOffset; + uint DataSelector; + uchar RegisterArea[SIZE_OF_80387_REGISTERS]; + uint Spare0; + }; +//--- +struct CONTEXT + { + ulong P1Home; + ulong P2Home; + ulong P3Home; + ulong P4Home; + ulong P5Home; + ulong P6Home; + uint ContextFlags; + uint MxCsr; + ushort SegCs; + ushort SegDs; + ushort SegEs; + ushort SegFs; + ushort SegGs; + ushort SegSs; + uint EFlags; + ulong Dr0; + ulong Dr1; + ulong Dr2; + ulong Dr3; + ulong Dr6; + ulong Dr7; + ulong Rax; + ulong Rcx; + ulong Rdx; + ulong Rbx; + ulong Rsp; + ulong Rbp; + ulong Rsi; + ulong Rdi; + ulong R8; + ulong R9; + ulong R10; + ulong R11; + ulong R12; + ulong R13; + ulong R14; + ulong R15; + ulong Rip; + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + M128A VectorRegister[26]; + ulong VectorControl; + ulong DebugControl; + ulong LastBranchToRip; + ulong LastBranchFromRip; + ulong LastExceptionToRip; + ulong LastExceptionFromRip; + }; +//--- +struct WOW64_FLOATING_SAVE_AREA + { + uint Controlushort; + uint Statusushort; + uint Tagushort; + uint ErrorOffset; + uint ErrorSelector; + uint DataOffset; + uint DataSelector; + uchar RegisterArea[WOW64_SIZE_OF_80387_REGISTERS]; + uint Cr0NpxState; + }; +//--- +struct WOW64_CONTEXT + { + uint ContextFlags; + uint Dr0; + uint Dr1; + uint Dr2; + uint Dr3; + uint Dr6; + uint Dr7; + WOW64_FLOATING_SAVE_AREA FloatSave; + uint SegGs; + uint SegFs; + uint SegEs; + uint SegDs; + uint Edi; + uint Esi; + uint Ebx; + uint Edx; + uint Ecx; + uint Eax; + uint Ebp; + uint Eip; + uint SegCs; + uint EFlags; + uint Esp; + uint SegSs; + uchar ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION]; + }; +//--- +struct WOW64_LDT_ENTRY + { + uint LimitLow; + uint BaseLow; + uchar BaseMid; + uchar Flags1; + uchar Flags2; + uchar BaseHi; + }; +//--- +struct WOW64_DESCRIPTOR_TABLE_ENTRY + { + uint Selector; + WOW64_LDT_ENTRY Descriptor; + }; +//--- +struct EXCEPTION_RECORD + { + uint ExceptionCode; + uint ExceptionFlags; + PVOID ExceptionRecord; + PVOID ExceptionAddress; + uint NumberParameters; + PVOID ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; + }; +//--- +struct EXCEPTION_RECORD32 + { + uint ExceptionCode; + uint ExceptionFlags; + uint ExceptionRecord; + uint ExceptionAddress; + uint NumberParameters; + uint ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; + }; +//--- +struct EXCEPTION_RECORD64 + { + uint ExceptionCode; + uint ExceptionFlags; + ulong ExceptionRecord; + ulong ExceptionAddress; + uint NumberParameters; + uint __unusedAlignment; + ulong ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; + }; +//--- +struct EXCEPTION_POINTERS + { + PVOID ExceptionRecord; + PVOID ContextRecord; + }; +//--- +struct GENERIC_MAPPING + { + uint GenericRead; + uint GenericWrite; + uint GenericExecute; + uint GenericAll; + }; +//--- +struct LUID_AND_ATTRIBUTES + { + LUID Luid; + uint Attributes; + }; +//--- +struct SID_IDENTIFIER_AUTHORITY + { + uchar Value[6]; + }; +//--- +//--- +struct SID + { + uchar Revision; + uchar SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + uint SubAuthority[ANYSIZE_ARRAY]; + }; +//--- +struct SID_AND_ATTRIBUTES + { + SID Sid; + uint Attributes; + }; +//--- +struct SID_AND_ATTRIBUTES_HASH + { + uint SidCount; + PVOID SidAttr; + ulong Hash[SID_HASH_SIZE]; + }; +//--- +struct ACL + { + uchar AclRevision; + uchar Sbz1; + ushort AclSize; + ushort AceCount; + ushort Sbz2; + }; +//--- +struct ACE_HEADER + { + uchar AceType; + uchar AceFlags; + ushort AceSize; + }; +//--- +struct ACCESS_ALLOWED_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct ACCESS_DENIED_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_AUDIT_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_ALARM_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_RESOURCE_ATTRIBUTE_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_SCOPED_POLICY_ID_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_MANDATORY_LABEL_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_PROCESS_TRUST_LABEL_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_ACCESS_FILTER_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct ACCESS_ALLOWED_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct ACCESS_DENIED_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct SYSTEM_AUDIT_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct SYSTEM_ALARM_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct ACCESS_ALLOWED_CALLBACK_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct ACCESS_DENIED_CALLBACK_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_AUDIT_CALLBACK_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct SYSTEM_ALARM_CALLBACK_ACE + { + ACE_HEADER Header; + uint Mask; + uint SidStart; + }; +//--- +struct ACCESS_ALLOWED_CALLBACK_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct ACCESS_DENIED_CALLBACK_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct SYSTEM_AUDIT_CALLBACK_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct SYSTEM_ALARM_CALLBACK_OBJECT_ACE + { + ACE_HEADER Header; + uint Mask; + uint Flags; + GUID ObjectType; + GUID InheritedObjectType; + uint SidStart; + }; +//--- +struct ACL_REVISION_INFORMATION + { + uint AclRevision; + }; +//--- +struct ACL_SIZE_INFORMATION + { + uint AceCount; + uint AclBytesInUse; + uint AclBytesFree; + }; +//--- +struct SECURITY_DESCRIPTOR_RELATIVE + { + uchar Revision; + uchar Sbz1; + ushort Control; + uint Owner; + uint Group; + uint Sacl; + uint Dacl; + }; +//--- +struct SECURITY_DESCRIPTOR + { + uchar Revision; + uchar Sbz1; + ushort Control; + uchar offset[4]; + PVOID Owner; + PVOID Group; + PVOID Sacl; + PVOID Dacl; + }; +//--- +struct SECURITY_OBJECT_AI_PARAMS + { + uint Size; + uint ConstraintMask; + }; +//--- +struct OBJECT_TYPE_LIST + { + ushort Level; + ushort Sbz; + GUID ObjectType; + }; +//--- +struct PRIVILEGE_SET + { + uint PrivilegeCount; + uint Control; + LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; + }; +//--- +struct ACCESS_REASONS + { + uint Data[32]; + }; +//--- +struct SE_SECURITY_DESCRIPTOR + { + uint Size; + uint Flags; + PVOID SecurityDescriptor; + }; +//--- +struct SE_ACCESS_REQUEST + { + uint Size; + PVOID SeSecurityDescriptor; + uint DesiredAccess; + uint PreviouslyGrantedAccess; + PVOID PrincipalSelfSid; + PVOID GenericMapping; + uint ObjectTypeListCount; + PVOID ObjectTypeList; + }; +//--- +struct SE_ACCESS_REPLY + { + uint Size; + uint ResultListCount; + PVOID GrantedAccess; + uint AccessStatus; + PVOID AccessReason; + PVOID Privileges; + }; +//--- +struct TOKEN_USER + { + SID_AND_ATTRIBUTES User; + }; +//--- +struct SE_TOKEN_USER + { + TOKEN_USER TokenUser; + SID Sid; + }; +//--- +struct TOKEN_GROUPS + { + uint GroupCount; + SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; + }; +//--- +struct TOKEN_PRIVILEGES + { + uint PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; + }; +//--- +struct TOKEN_OWNER + { + PVOID Owner; + }; +//--- +struct TOKEN_PRIMARY_GROUP + { + PVOID PrimaryGroup; + }; +//--- +struct TOKEN_DEFAULT_DACL + { + PVOID DefaultDacl; + }; +//--- +struct TOKEN_USER_CLAIMS + { + PVOID UserClaims; + }; +//--- +struct TOKEN_DEVICE_CLAIMS + { + PVOID DeviceClaims; + }; +//--- +struct TOKEN_GROUPS_AND_PRIVILEGES + { + uint SidCount; + uint SidLength; + PVOID Sids; + uint RestrictedSidCount; + uint RestrictedSidLength; + PVOID RestrictedSids; + uint PrivilegeCount; + uint PrivilegeLength; + PVOID Privileges; + LUID AuthenticationId; + }; +//--- +struct TOKEN_LINKED_TOKEN + { + HANDLE LinkedToken; + }; +//--- +struct TOKEN_ELEVATION + { + uint TokenIsElevated; + }; +//--- +struct TOKEN_MANDATORY_LABEL + { + SID_AND_ATTRIBUTES Label; + }; +//--- +struct TOKEN_MANDATORY_POLICY + { + uint Policy; + }; +//--- +struct TOKEN_ACCESS_INFORMATION + { + PVOID SidHash; + PVOID RestrictedSidHash; + PVOID Privileges; + LUID AuthenticationId; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + TOKEN_MANDATORY_POLICY MandatoryPolicy; + uint Flags; + uint AppContainerNumber; + PVOID PackageSid; + PVOID CapabilitiesHash; + PVOID TrustLevelSid; + PVOID SecurityAttributes; + }; +//--- +struct TOKEN_AUDIT_POLICY + { + uchar PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT)>>1)+1]; + }; +//--- +struct TOKEN_SOURCE + { + char SourceName[TOKEN_SOURCE_LENGTH]; + LUID SourceIdentifier; + }; +//--- +struct TOKEN_STATISTICS + { + LUID TokenId; + LUID AuthenticationId; + long ExpirationTime; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + uint DynamicCharged; + uint DynamicAvailable; + uint GroupCount; + uint PrivilegeCount; + LUID ModifiedId; + }; +//--- +struct TOKEN_CONTROL + { + LUID TokenId; + LUID AuthenticationId; + LUID ModifiedId; + TOKEN_SOURCE TokenSource; + }; +//--- +struct TOKEN_ORIGIN + { + LUID OriginatingLogonSession; + }; +//--- +struct TOKEN_APPCONTAINER_INFORMATION + { + PVOID TokenAppContainer; + }; +//--- +struct TOKEN_SID_INFORMATION + { + PVOID Sid; + }; +//--- +struct TOKEN_BNO_ISOLATION_INFORMATION + { + string IsolationPrefix; + uchar IsolationEnabled; + }; +//--- +struct CLAIM_SECURITY_ATTRIBUTE_FQBN_VALUE + { + ulong Version; + string Name; + }; +//--- +struct CLAIM_SECURITY_ATTRIBUTE_OCTET_STRING_VALUE + { + PVOID pValue; + uint ValueLength; + }; +//--- +struct CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 + { + uint Name; + ushort ValueType; + ushort Reserved; + uint Flags; + uint ValueCount; + uint pInt64[ANYSIZE_ARRAY]; + }; +//--- +struct Attribute + { + ushort Version; + ushort Reserved; + uint AttributeCount; + PVOID pAttributeV1; + }; +//--- +struct SECURITY_QUALITY_OF_SERVICE + { + uint Length; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + uchar ContextTrackingMode; + uchar EffectiveOnly; + }; +//--- +struct SE_IMPERSONATION_STATE + { + PVOID Token; + uchar CopyOnOpen; + uchar EffectiveOnly; + SECURITY_IMPERSONATION_LEVEL Level; + }; +//--- +struct SECURITY_CAPABILITIES + { + PVOID AppContainerSid; + PVOID Capabilities; + uint CapabilityCount; + uint Reserved; + }; +//--- +struct JOB_SET_ARRAY + { + HANDLE JobHandle; + uint MemberLevel; + uint Flags; + }; +//--- +struct EXCEPTION_REGISTRATION_RECORD + { + PVOID Next; + PVOID Handler; + }; +//--- +struct NT_TIB + { + PVOID ExceptionList; + PVOID StackBase; + PVOID StackLimit; + PVOID SubSystemTib; + PVOID FiberData; + PVOID ArbitraryUserPointer; + PVOID Self; + }; +//--- +struct UMS_CREATE_THREAD_ATTRIBUTES + { + uint UmsVersion; + PVOID UmsContext; + PVOID UmsCompletionList; + }; +//--- +struct WOW64_ARCHITECTURE_INFORMATION + { + uint Info; + }; +//--- +struct QUOTA_LIMITS + { + ulong PagedPoolLimit; + ulong NonPagedPoolLimit; + ulong MinimumWorkingSetSize; + ulong MaximumWorkingSetSize; + ulong PagefileLimit; + long TimeLimit; + }; +//--- +struct QUOTA_LIMITS_EX + { + ulong PagedPoolLimit; + ulong NonPagedPoolLimit; + ulong MinimumWorkingSetSize; + ulong MaximumWorkingSetSize; + ulong PagefileLimit; + long TimeLimit; + ulong WorkingSetLimit; + ulong Reserved2; + ulong Reserved3; + ulong Reserved4; + uint Flags; + uint CpuRateLimit; + }; +//--- +struct IO_COUNTERS + { + ulong ReadOperationCount; + ulong WriteOperationCount; + ulong OtherOperationCount; + ulong ReadTransferCount; + ulong WriteTransferCount; + ulong OtherTransferCount; + }; +//--- +struct JOBOBJECT_BASIC_ACCOUNTING_INFORMATION + { + long TotalUserTime; + long TotalKernelTime; + long ThisPeriodTotalUserTime; + long ThisPeriodTotalKernelTime; + uint TotalPageFaultCount; + uint TotalProcesses; + uint ActiveProcesses; + uint TotalTerminatedProcesses; + }; +//--- +struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + long PerProcessUserTimeLimit; + long PerJobUserTimeLimit; + uint LimitFlags; + ulong MinimumWorkingSetSize; + ulong MaximumWorkingSetSize; + uint ActiveProcessLimit; + ulong Affinity; + uint PriorityClass; + uint SchedulingClass; + }; +//--- +struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + IO_COUNTERS IoInfo; + ulong ProcessMemoryLimit; + ulong JobMemoryLimit; + ulong PeakProcessMemoryUsed; + ulong PeakJobMemoryUsed; + }; +//--- +struct JOBOBJECT_BASIC_PROCESS_ID_LIST + { + uint NumberOfAssignedProcesses; + uint NumberOfProcessIdsInList; + ulong ProcessIdList[1]; + }; +//--- +struct JOBOBJECT_BASIC_UI_RESTRICTIONS + { + uint UIRestrictionsClass; + }; +//--- +struct JOBOBJECT_SECURITY_LIMIT_INFORMATION + { + uint SecurityLimitFlags; + HANDLE JobToken; + PVOID SidsToDisable; + PVOID PrivilegesToDelete; + PVOID RestrictedSids; + }; +//--- +struct JOBOBJECT_END_OF_JOB_TIME_INFORMATION + { + uint EndOfJobTimeAction; + }; +//--- +struct JOBOBJECT_ASSOCIATE_COMPLETION_PORT + { + PVOID CompletionKey; + HANDLE CompletionPort; + }; +//--- +struct JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION + { + JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo; + IO_COUNTERS IoInfo; + }; +//--- +struct JOBOBJECT_JOBSET_INFORMATION + { + uint MemberLevel; + }; +//--- +struct JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION + { + ulong IoReadBytesLimit; + ulong IoWriteBytesLimit; + long PerJobUserTimeLimit; + ulong JobMemoryLimit; + JOBOBJECT_RATE_CONTROL_TOLERANCE RateControlTolerance; + JOBOBJECT_RATE_CONTROL_TOLERANCE_INTERVAL RateControlToleranceInterval; + uint LimitFlags; + }; +//--- +struct JOBOBJECT_LIMIT_VIOLATION_INFORMATION + { + uint LimitFlags; + uint ViolationLimitFlags; + ulong IoReadBytes; + ulong IoReadBytesLimit; + ulong IoWriteBytes; + ulong IoWriteBytesLimit; + long PerJobUserTime; + long PerJobUserTimeLimit; + ulong JobMemory; + ulong JobMemoryLimit; + JOBOBJECT_RATE_CONTROL_TOLERANCE RateControlTolerance; + JOBOBJECT_RATE_CONTROL_TOLERANCE RateControlToleranceLimit; + }; +//--- +struct JOBOBJECT_NET_RATE_CONTROL_INFORMATION + { + ulong MaxBandwidth; + JOB_OBJECT_NET_RATE_CONTROL_FLAGS ControlFlags; + uchar DscpTag; + }; +//--- +struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE + { + long MaxIops; + long MaxBandwidth; + long ReservationIops; + string VolumeName; + uint BaseIoSize; + JOB_OBJECT_IO_RATE_CONTROL_FLAGS ControlFlags; + ushort VolumeNameLength; + }; +//--- +struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 + { + long MaxIops; + long MaxBandwidth; + long ReservationIops; + string VolumeName; + uint BaseIoSize; + JOB_OBJECT_IO_RATE_CONTROL_FLAGS ControlFlags; + ushort VolumeNameLength; + long CriticalReservationIops; + long ReservationBandwidth; + long CriticalReservationBandwidth; + long MaxTimePercent; + long ReservationTimePercent; + long CriticalReservationTimePercent; + }; +//--- +struct JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V3 + { + long MaxIops; + long MaxBandwidth; + long ReservationIops; + string VolumeName; + uint BaseIoSize; + JOB_OBJECT_IO_RATE_CONTROL_FLAGS ControlFlags; + ushort VolumeNameLength; + long CriticalReservationIops; + long ReservationBandwidth; + long CriticalReservationBandwidth; + long MaxTimePercent; + long ReservationTimePercent; + long CriticalReservationTimePercent; + long SoftMaxIops; + long SoftMaxBandwidth; + long SoftMaxTimePercent; + long LimitExcessNotifyIops; + long LimitExcessNotifyBandwidth; + long LimitExcessNotifyTimePercent; + }; +//--- +struct JOBOBJECT_IO_ATTRIBUTION_STATS + { + ulong IoCount; + ulong TotalNonOverlappedQueueTime; + ulong TotalNonOverlappedServiceTime; + ulong TotalSize; + }; +//--- +struct JOBOBJECT_IO_ATTRIBUTION_INFORMATION + { + uint ControlFlags; + JOBOBJECT_IO_ATTRIBUTION_STATS ReadStats; + JOBOBJECT_IO_ATTRIBUTION_STATS WriteStats; + }; +//--- +struct SILOOBJECT_BASIC_INFORMATION + { + uint SiloId; + uint SiloParentId; + uint NumberOfProcesses; + uchar IsInServerSilo; + uchar Reserved[3]; + }; +//--- +struct SERVERSILO_BASIC_INFORMATION + { + uint ServiceSessionId; + SERVERSILO_STATE State; + uint ExitStatus; + }; +//--- +struct CACHE_DESCRIPTOR + { + uchar Level; + uchar Associativity; + ushort LineSize; + uint Size; + PROCESSOR_CACHE_TYPE Type; + }; +//--- +struct ProcessorCore + { + ulong ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + uchar Flags; + }; +//--- +struct PROCESSOR_RELATIONSHIP + { + uchar Flags; + uchar EfficiencyClass; + uchar Reserved[20]; + ushort GroupCount; + GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; + }; +//--- +struct NUMA_NODE_RELATIONSHIP + { + uint NodeNumber; + uchar Reserved[20]; + GROUP_AFFINITY GroupMask; + }; +//--- +struct CACHE_RELATIONSHIP + { + uchar Level; + uchar Associativity; + ushort LineSize; + uint CacheSize; + PROCESSOR_CACHE_TYPE Type; + uchar Reserved[20]; + GROUP_AFFINITY GroupMask; + }; +//--- +struct PROCESSOR_GROUP_INFO + { + uchar MaximumProcessorCount; + uchar ActiveProcessorCount; + uchar Reserved[38]; + ulong ActiveProcessorMask; + }; +//--- +struct GROUP_RELATIONSHIP + { + ushort MaximumGroupCount; + ushort ActiveGroupCount; + uchar Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; + }; +//--- +struct SYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION + { + ulong CycleTime; + }; +//--- +struct XSTATE_FEATURE + { + uint Offset; + uint Size; + }; +//--- +struct XSTATE_CONFIGURATION + { + ulong EnabledFeatures; + ulong EnabledVolatileFeatures; + uint Size; + uint ControlFlags; + XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; + ulong EnabledSupervisorFeatures; + ulong AlignedFeatures; + uint AllFeatureSize; + uint AllFeatures[MAXIMUM_XSTATE_FEATURES]; + }; +//--- +struct MEMORY_BASIC_INFORMATION + { + PVOID BaseAddress; + PVOID AllocationBase; + uint AllocationProtect; + ulong RegionSize; + uint State; + uint Protect; + uint Type; + }; +//--- +struct MEMORY_BASIC_INFORMATION32 + { + uint BaseAddress; + uint AllocationBase; + uint AllocationProtect; + uint RegionSize; + uint State; + uint Protect; + uint Type; + }; +//--- +struct MEMORY_BASIC_INFORMATION64 + { + ulong BaseAddress; + ulong AllocationBase; + uint AllocationProtect; + uint __alignment1; + ulong RegionSize; + uint State; + uint Protect; + uint Type; + uint __alignment2; + }; +//--- +struct CFG_CALL_TARGET_INFO + { + ulong Offset; + ulong Flags; + }; +//--- +struct MEM_ADDRESS_REQUIREMENTS + { + PVOID LowestStartingAddress; + PVOID HighestEndingAddress; + ulong Alignment; + }; +//--- +struct ENCLAVE_CREATE_INFO_SGX + { + uchar Secs[4096]; + }; +//--- +struct ENCLAVE_INIT_INFO_SGX + { + uchar SigStruct[1808]; + uchar Reserved1[240]; + uchar EInitToken[304]; + uchar Reserved2[1744]; + }; +//--- +struct ENCLAVE_CREATE_INFO_VBS + { + uint Flags; + uchar OwnerID[32]; + }; +//--- +struct ENCLAVE_INIT_INFO_VBS + { + uint Length; + uint ThreadCount; + }; +//--- +struct FILE_ID_128 + { + uchar Identifier[16]; + }; +//--- +struct FILE_NOTIFY_INFORMATION + { + uint NextEntryOffset; + uint Action; + uint FileNameLength; + short FileName[1]; + }; +//--- +struct FILE_NOTIFY_EXTENDED_INFORMATION + { + uint NextEntryOffset; + uint Action; + long CreationTime; + long LastModificationTime; + long LastChangeTime; + long LastAccessTime; + long AllocatedLength; + long FileSize; + uint FileAttributes; + uint ReparsePointTag; + long FileId; + long ParentFileId; + uint FileNameLength; + short FileName[1]; + }; +//--- +struct GenericReparseBuffer + { + uint ReparseTag; + ushort ReparseDataLength; + ushort Reserved; + GUID ReparseGuid; + uchar DataBuffer[1]; + }; +//--- +struct SCRUB_DATA_INPUT + { + uint Size; + uint Flags; + uint MaximumIos; + uint ObjectId[4]; + uint Reserved[13]; + uchar ResumeContext[816]; + }; +//--- +struct SCRUB_PARITY_EXTENT + { + long Offset; + ulong Length; + }; +//--- +struct SCRUB_PARITY_EXTENT_DATA + { + ushort Size; + ushort Flags; + ushort NumberOfParityExtents; + ushort MaximumNumberOfParityExtents; + SCRUB_PARITY_EXTENT ParityExtents[ANYSIZE_ARRAY]; + }; +//--- +struct SCRUB_DATA_OUTPUT + { + uint Size; + uint Flags; + uint Status; + ulong ErrorFileOffset; + ulong ErrorLength; + ulong NumberOfBytesRepaired; + ulong NumberOfBytesFailed; + ulong InternalFileReference; + ushort ResumeContextLength; + ushort ParityExtentDataOffset; + uint Reserved[5]; + uchar ResumeContext[816]; + }; +//--- +struct SHARED_VIRTUAL_DISK_SUPPORT + { + SharedVirtualDiskSupportType SharedVirtualDiskSupport; + SharedVirtualDiskHandleState HandleState; + }; +//--- +struct NETWORK_APP_INSTANCE_EA + { + GUID AppInstanceID; + uint CsvFlags; + }; +//--- +struct CM_POWER_DATA + { + uint PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + uint PD_Capabilities; + uint PD_D1Latency; + uint PD_D2Latency; + uint PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; + }; +//--- +struct POWER_USER_PRESENCE + { + POWER_USER_PRESENCE_TYPE UserPresence; + }; +//--- +struct POWER_SESSION_CONNECT + { + uchar Connected; + uchar Console; + }; +//--- +struct POWER_SESSION_TIMEOUTS + { + uint InputTimeout; + uint DisplayTimeout; + }; +//--- +struct POWER_SESSION_RIT_STATE + { + uchar Active; + uint LastInputTime; + }; +//--- +struct POWER_SESSION_WINLOGON + { + uint SessionId; + uchar Console; + uchar Locked; + }; +//--- +struct POWER_IDLE_RESILIENCY + { + uint CoalescingTimeout; + uint IdleResiliencyPeriod; + }; +//--- +struct POWER_MONITOR_INVOCATION + { + uchar Console; + POWER_MONITOR_REQUEST_REASON RequestReason; + }; +//--- +struct RESUME_PERFORMANCE + { + uint PostTimeMs; + ulong TotalResumeTimeMs; + ulong ResumeCompleteTimestamp; + }; +//--- +struct APPLICATIONLAUNCH_SETTING_VALUE + { + long ActivationTime; + uint Flags; + uint ButtonInstanceID; + }; +//--- +struct POWER_PLATFORM_INFORMATION + { + uchar AoAc; + }; +//--- +struct POWER_ACTION_POLICY + { + POWER_ACTION Action; + uint Flags; + uint EventCode; + }; +//--- +struct SYSTEM_POWER_LEVEL + { + uchar Enable; + uchar Spare[3]; + uint BatteryLevel; + POWER_ACTION_POLICY PowerPolicy; + SYSTEM_POWER_STATE MinSystemState; + }; +//--- +struct SYSTEM_POWER_POLICY + { + uint Revision; + POWER_ACTION_POLICY PowerButton; + POWER_ACTION_POLICY SleepButton; + POWER_ACTION_POLICY LidClose; + SYSTEM_POWER_STATE LidOpenWake; + uint Reserved; + POWER_ACTION_POLICY Idle; + uint IdleTimeout; + uchar IdleSensitivity; + uchar DynamicThrottle; + uchar Spare2[2]; + SYSTEM_POWER_STATE MinSleep; + SYSTEM_POWER_STATE MaxSleep; + SYSTEM_POWER_STATE ReducedLatencySleep; + uint WinLogonFlags; + uint Spare3; + uint DozeS4Timeout; + uint BroadcastCapacityResolution; + SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES]; + uint VideoTimeout; + uchar VideoDimDisplay; + uint VideoReserved[3]; + uint SpindownTimeout; + uchar OptimizeForPower; + uchar FanThrottleTolerance; + uchar ForcedThrottle; + uchar MinThrottle; + POWER_ACTION_POLICY OverThrottled; + }; +//--- +struct PROCESSOR_POWER_POLICY_INFO + { + uint TimeCheck; + uint DemoteLimit; + uint PromoteLimit; + uchar DemotePercent; + uchar PromotePercent; + uchar Spare[2]; + uint Flags; + }; +//--- +struct PROCESSOR_POWER_POLICY + { + uint Revision; + uchar DynamicThrottle; + uchar Spare[3]; + uint Flags; + uint PolicyCount; + PROCESSOR_POWER_POLICY_INFO Policy[3]; + }; +//--- +struct ADMINISTRATOR_POWER_POLICY + { + SYSTEM_POWER_STATE MinSleep; + SYSTEM_POWER_STATE MaxSleep; + uint MinVideoTimeout; + uint MaxVideoTimeout; + uint MinSpindownTimeout; + uint MaxSpindownTimeout; + }; +//--- +struct HIBERFILE_BUCKET + { + ulong MaxPhysicalMemory; + uint PhysicalMemoryPercent[HIBERFILE_TYPE_MAX]; + }; +//--- +struct IMAGE_DOS_HEADER + { + ushort e_magic; + ushort e_cblp; + ushort e_cp; + ushort e_crlc; + ushort e_cparhdr; + ushort e_minalloc; + ushort e_maxalloc; + ushort e_ss; + ushort e_sp; + ushort e_csum; + ushort e_ip; + ushort e_cs; + ushort e_lfarlc; + ushort e_ovno; + ushort e_res[4]; + ushort e_oemid; + ushort e_oeminfo; + ushort e_res2[10]; + int e_lfanew; + }; +//--- +struct IMAGE_OS2_HEADER + { + ushort ne_magic; + char ne_ver; + char ne_rev; + ushort ne_enttab; + ushort ne_cbenttab; + int ne_crc; + ushort ne_flags; + ushort ne_autodata; + ushort ne_heap; + ushort ne_stack; + int ne_csip; + int ne_sssp; + ushort ne_cseg; + ushort ne_cmod; + ushort ne_cbnrestab; + ushort ne_segtab; + ushort ne_rsrctab; + ushort ne_restab; + ushort ne_modtab; + ushort ne_imptab; + int ne_nrestab; + ushort ne_cmovent; + ushort ne_align; + ushort ne_cres; + uchar ne_exetyp; + uchar ne_flagsothers; + ushort ne_pretthunks; + ushort ne_psegrefbytes; + ushort ne_swaparea; + ushort ne_expver; + }; +//--- +struct IMAGE_VXD_HEADER + { + ushort e32_magic; + uchar e32_border; + uchar e32_ushorter; + uint e32_level; + ushort e32_cpu; + ushort e32_os; + uint e32_ver; + uint e32_mflags; + uint e32_mpages; + uint e32_startobj; + uint e32_eip; + uint e32_stackobj; + uint e32_esp; + uint e32_pagesize; + uint e32_lastpagesize; + uint e32_fixupsize; + uint e32_fixupsum; + uint e32_ldrsize; + uint e32_ldrsum; + uint e32_objtab; + uint e32_objcnt; + uint e32_objmap; + uint e32_itermap; + uint e32_rsrctab; + uint e32_rsrccnt; + uint e32_restab; + uint e32_enttab; + uint e32_dirtab; + uint e32_dircnt; + uint e32_fpagetab; + uint e32_frectab; + uint e32_impmod; + uint e32_impmodcnt; + uint e32_impproc; + uint e32_pagesum; + uint e32_datapage; + uint e32_preload; + uint e32_nrestab; + uint e32_cbnrestab; + uint e32_nressum; + uint e32_autodata; + uint e32_debuginfo; + uint e32_debuglen; + uint e32_instpreload; + uint e32_instdemand; + uint e32_heapsize; + uchar e32_res3[12]; + uint e32_winresoff; + uint e32_winreslen; + ushort e32_devid; + ushort e32_ddkver; + }; +//--- +struct IMAGE_FILE_HEADER + { + ushort Machine; + ushort NumberOfSections; + uint TimeDateStamp; + uint PointerToSymbolTable; + uint NumberOfSymbols; + ushort SizeOfOptionalHeader; + ushort Characteristics; + }; +//--- +struct IMAGE_DATA_DIRECTORY + { + uint VirtualAddress; + uint Size; + }; +//--- +struct IMAGE_OPTIONAL_HEADER32 + { + ushort Magic; + uchar MajorLinkerVersion; + uchar MinorLinkerVersion; + uint SizeOfCode; + uint SizeOfInitializedData; + uint SizeOfUninitializedData; + uint AddressOfEntryPoint; + uint BaseOfCode; + uint BaseOfData; + uint ImageBase; + uint SectionAlignment; + uint FileAlignment; + ushort MajorOperatingSystemVersion; + ushort MinorOperatingSystemVersion; + ushort MajorImageVersion; + ushort MinorImageVersion; + ushort MajorSubsystemVersion; + ushort MinorSubsystemVersion; + uint Win32VersionValue; + uint SizeOfImage; + uint SizeOfHeaders; + uint CheckSum; + ushort Subsystem; + ushort DllCharacteristics; + uint SizeOfStackReserve; + uint SizeOfStackCommit; + uint SizeOfHeapReserve; + uint SizeOfHeapCommit; + uint LoaderFlags; + uint NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; + }; +//--- +struct IMAGE_ROM_OPTIONAL_HEADER + { + ushort Magic; + uchar MajorLinkerVersion; + uchar MinorLinkerVersion; + uint SizeOfCode; + uint SizeOfInitializedData; + uint SizeOfUninitializedData; + uint AddressOfEntryPoint; + uint BaseOfCode; + uint BaseOfData; + uint BaseOfBss; + uint GprMask; + uint CprMask[4]; + uint GpValue; + }; +//--- +struct IMAGE_OPTIONAL_HEADER64 + { + ushort Magic; + uchar MajorLinkerVersion; + uchar MinorLinkerVersion; + uint SizeOfCode; + uint SizeOfInitializedData; + uint SizeOfUninitializedData; + uint AddressOfEntryPoint; + uint BaseOfCode; + ulong ImageBase; + uint SectionAlignment; + uint FileAlignment; + ushort MajorOperatingSystemVersion; + ushort MinorOperatingSystemVersion; + ushort MajorImageVersion; + ushort MinorImageVersion; + ushort MajorSubsystemVersion; + ushort MinorSubsystemVersion; + uint Win32VersionValue; + uint SizeOfImage; + uint SizeOfHeaders; + uint CheckSum; + ushort Subsystem; + ushort DllCharacteristics; + ulong SizeOfStackReserve; + ulong SizeOfStackCommit; + ulong SizeOfHeapReserve; + ulong SizeOfHeapCommit; + uint LoaderFlags; + uint NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; + }; +//--- +struct IMAGE_NT_HEADERS64 + { + uint Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER64 OptionalHeader; + }; +//--- +struct IMAGE_NT_HEADERS32 + { + uint Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER32 OptionalHeader; + }; +//--- +struct IMAGE_ROM_HEADERS + { + IMAGE_FILE_HEADER FileHeader; + IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; + }; +//--- +struct ANON_OBJECT_HEADER + { + ushort Sig1; + ushort Sig2; + ushort Version; + ushort Machine; + uint TimeDateStamp; + GUID ClassID; + uint SizeOfData; + }; +//--- +struct ANON_OBJECT_HEADER_V2 + { + ushort Sig1; + ushort Sig2; + ushort Version; + ushort Machine; + uint TimeDateStamp; + GUID ClassID; + uint SizeOfData; + uint Flags; + uint MetaDataSize; + uint MetaDataOffset; + }; +//--- +struct ANON_OBJECT_HEADER_BIGOBJ + { + ushort Sig1; + ushort Sig2; + ushort Version; + ushort Machine; + uint TimeDateStamp; + GUID ClassID; + uint SizeOfData; + uint Flags; + uint MetaDataSize; + uint MetaDataOffset; + uint NumberOfSections; + uint PointerToSymbolTable; + uint NumberOfSymbols; + }; +//--- +struct IMAGE_SECTION_HEADER + { + uchar Name[IMAGE_SIZEOF_SHORT_NAME]; + uint PhysicalAddress; + uint VirtualAddress; + uint SizeOfRawData; + uint PointerToRawData; + uint PointerToRelocations; + uint PointerToLinenumbers; + ushort NumberOfRelocations; + ushort NumberOfLinenumbers; + uint Characteristics; + }; +//--- +struct IMAGE_SYMBOL + { + uchar ShortName[8]; + uint Value; + short SectionNumber; + ushort Type; + uchar StorageClass; + uchar NumberOfAuxSymbols; + }; +//--- +struct IMAGE_SYMBOL_EX + { + uchar ShortName[8]; + uint Value; + int SectionNumber; + ushort Type; + uchar StorageClass; + uchar NumberOfAuxSymbols; + }; +//--- +struct IMAGE_AUX_SYMBOL_TOKEN_DEF + { + uchar bAuxType; + uchar bReserved; + uint SymbolTableIndex; + uchar rgbReserved[12]; + }; +//--- +struct IMAGE_LINENUMBER + { + uint VirtualAddress; + ushort Linenumber; + }; +//--- +struct IMAGE_BASE_RELOCATION + { + uint VirtualAddress; + uint SizeOfBlock; + }; +//--- +struct IMAGE_ARCHIVE_MEMBER_HEADER + { + uchar Name[16]; + uchar Date[12]; + uchar UserID[6]; + uchar GroupID[6]; + uchar Mode[8]; + uchar Size[10]; + uchar EndHeader[2]; + }; +//--- +struct IMAGE_EXPORT_DIRECTORY + { + uint Characteristics; + uint TimeDateStamp; + ushort MajorVersion; + ushort MinorVersion; + uint Name; + uint Base; + uint NumberOfFunctions; + uint NumberOfNames; + uint AddressOfFunctions; + uint AddressOfNames; + uint AddressOfNameOrdinals; + }; +//--- +struct IMAGE_IMPORT_BY_NAME + { + ushort Hint; + char Name[1]; + }; +//--- +struct IMAGE_THUNK_DATA64 + { + ulong Data; + }; +//--- +struct IMAGE_THUNK_DATA32 + { + uint Data; + }; +//--- +struct IMAGE_BOUND_IMPORT_DESCRIPTOR + { + uint TimeDateStamp; + ushort OffsetModuleName; + ushort NumberOfModuleForwarderRefs; + }; +//--- +struct IMAGE_BOUND_FORWARDER_REF + { + uint TimeDateStamp; + ushort OffsetModuleName; + ushort Reserved; + }; +//--- +struct IMAGE_RESOURCE_DIRECTORY + { + uint Characteristics; + uint TimeDateStamp; + ushort MajorVersion; + ushort MinorVersion; + ushort NumberOfNamedEntries; + ushort NumberOfIdEntries; + }; +//--- +struct IMAGE_RESOURCE_DIRECTORY_STRING + { + ushort Length; + char NameString[1]; + }; +//--- +struct IMAGE_RESOURCE_DIR_STRING_U + { + ushort Length; + short NameString[1]; + }; +//--- +struct IMAGE_RESOURCE_DATA_ENTRY + { + uint OffsetToData; + uint Size; + uint CodePage; + uint Reserved; + }; +//--- +struct IMAGE_LOAD_CONFIG_CODE_INTEGRITY + { + ushort Flags; + ushort Catalog; + uint CatalogOffset; + uint Reserved; + }; +//--- +struct IMAGE_DYNAMIC_RELOCATION_TABLE + { + uint Version; + uint Size; + }; +//--- +struct IMAGE_DYNAMIC_RELOCATION32 + { + uint Symbol; + uint BaseRelocSize; + }; +//--- +struct IMAGE_DYNAMIC_RELOCATION64 + { + ulong Symbol; + uint BaseRelocSize; + }; +//--- +struct IMAGE_DYNAMIC_RELOCATION32_V2 + { + uint HeaderSize; + uint FixupInfoSize; + uint Symbol; + uint SymbolGroup; + uint Flags; + }; +//--- +struct IMAGE_DYNAMIC_RELOCATION64_V2 + { + uint HeaderSize; + uint FixupInfoSize; + ulong Symbol; + uint SymbolGroup; + uint Flags; + }; +//--- +struct IMAGE_PROLOGUE_DYNAMIC_RELOCATION_HEADER + { + uchar PrologueByteCount; + }; +//--- +struct IMAGE_EPILOGUE_DYNAMIC_RELOCATION_HEADER + { + uint EpilogueCount; + uchar EpilogueByteCount; + uchar BranchDescriptorElementSize; + ushort BranchDescriptorCount; + }; +//--- +struct IMAGE_LOAD_CONFIG_DIRECTORY32 + { + uint Size; + uint TimeDateStamp; + ushort MajorVersion; + ushort MinorVersion; + uint GlobalFlagsClear; + uint GlobalFlagsSet; + uint CriticalSectionDefaultTimeout; + uint DeCommitFreeBlockThreshold; + uint DeCommitTotalFreeThreshold; + uint LockPrefixTable; + uint MaximumAllocationSize; + uint VirtualMemoryThreshold; + uint ProcessHeapFlags; + uint ProcessAffinityMask; + ushort CSDVersion; + ushort DependentLoadFlags; + uint EditList; + uint SecurityCookie; + uint SEHandlerTable; + uint SEHandlerCount; + uint GuardCFCheckFunctionPointer; + uint GuardCFDispatchFunctionPointer; + uint GuardCFFunctionTable; + uint GuardCFFunctionCount; + uint GuardFlags; + IMAGE_LOAD_CONFIG_CODE_INTEGRITY CodeIntegrity; + uint GuardAddressTakenIatEntryTable; + uint GuardAddressTakenIatEntryCount; + uint GuardLongJumpTargetTable; + uint GuardLongJumpTargetCount; + uint DynamicValueRelocTable; + uint CHPEMetadataPointer; + uint GuardRFFailureRoutine; + uint GuardRFFailureRoutineFunctionPointer; + uint DynamicValueRelocTableOffset; + ushort DynamicValueRelocTableSection; + ushort Reserved2; + uint GuardRFVerifyStackPointerFunctionPointer; + uint HotPatchTableOffset; + uint Reserved3; + uint EnclaveConfigurationPointer; + }; +//--- +struct IMAGE_LOAD_CONFIG_DIRECTORY64 + { + uint Size; + uint TimeDateStamp; + ushort MajorVersion; + ushort MinorVersion; + uint GlobalFlagsClear; + uint GlobalFlagsSet; + uint CriticalSectionDefaultTimeout; + ulong DeCommitFreeBlockThreshold; + ulong DeCommitTotalFreeThreshold; + ulong LockPrefixTable; + ulong MaximumAllocationSize; + ulong VirtualMemoryThreshold; + ulong ProcessAffinityMask; + uint ProcessHeapFlags; + ushort CSDVersion; + ushort DependentLoadFlags; + ulong EditList; + ulong SecurityCookie; + ulong SEHandlerTable; + ulong SEHandlerCount; + ulong GuardCFCheckFunctionPointer; + ulong GuardCFDispatchFunctionPointer; + ulong GuardCFFunctionTable; + ulong GuardCFFunctionCount; + uint GuardFlags; + IMAGE_LOAD_CONFIG_CODE_INTEGRITY CodeIntegrity; + ulong GuardAddressTakenIatEntryTable; + ulong GuardAddressTakenIatEntryCount; + ulong GuardLongJumpTargetTable; + ulong GuardLongJumpTargetCount; + ulong DynamicValueRelocTable; + ulong CHPEMetadataPointer; + ulong GuardRFFailureRoutine; + ulong GuardRFFailureRoutineFunctionPointer; + uint DynamicValueRelocTableOffset; + ushort DynamicValueRelocTableSection; + ushort Reserved2; + ulong GuardRFVerifyStackPointerFunctionPointer; + uint HotPatchTableOffset; + uint Reserved3; + ulong EnclaveConfigurationPointer; + }; +//--- +struct IMAGE_HOT_PATCH_INFO + { + uint Version; + uint Size; + uint SequenceNumber; + uint BaseImageList; + uint BaseImageCount; + uint BufferOffset; + }; +//--- +struct IMAGE_HOT_PATCH_BASE + { + uint SequenceNumber; + uint Flags; + uint OriginalTimeDateStamp; + uint OriginalCheckSum; + uint CodeIntegrityInfo; + uint CodeIntegritySize; + uint PatchTable; + uint BufferOffset; + }; +//--- +struct IMAGE_HOT_PATCH_HASHES + { + uchar SHA256[32]; + uchar SHA1[20]; + }; +//--- +struct IMAGE_CE_RUNTIME_FUNCTION_ENTRY + { + uint FuncStart; + uint Flags; + }; +//--- +struct IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY + { + ulong BeginAddress; + ulong EndAddress; + ulong ExceptionHandler; + ulong HandlerData; + ulong PrologEndAddress; + }; +//--- +struct IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY + { + uint BeginAddress; + uint EndAddress; + uint ExceptionHandler; + uint HandlerData; + uint PrologEndAddress; + }; +//--- +struct IMAGE_ENCLAVE_CONFIG32 + { + uint Size; + uint MinimumRequiredConfigSize; + uint PolicyFlags; + uint NumberOfImports; + uint ImportList; + uint ImportEntrySize; + uchar FamilyID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uchar ImageID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uint ImageVersion; + uint SecurityVersion; + uint EnclaveSize; + uint NumberOfThreads; + uint EnclaveFlags; + }; +//--- +struct IMAGE_ENCLAVE_CONFIG64 + { + uint Size; + uint MinimumRequiredConfigSize; + uint PolicyFlags; + uint NumberOfImports; + uint ImportList; + uint ImportEntrySize; + uchar FamilyID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uchar ImageID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uint ImageVersion; + uint SecurityVersion; + ulong EnclaveSize; + uint NumberOfThreads; + uint EnclaveFlags; + }; +//--- +struct IMAGE_ENCLAVE_IMPORT + { + uint MatchType; + uint MinimumSecurityVersion; + uchar UniqueOrAuthorID[IMAGE_ENCLAVE_LONG_ID_LENGTH]; + uchar FamilyID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uchar ImageID[IMAGE_ENCLAVE_SHORT_ID_LENGTH]; + uint ImportName; + uint Reserved; + }; +//--- +struct IMAGE_DEBUG_DIRECTORY + { + uint Characteristics; + uint TimeDateStamp; + ushort MajorVersion; + ushort MinorVersion; + uint Type; + uint SizeOfData; + uint AddressOfRawData; + uint PointerToRawData; + }; +//--- +struct IMAGE_COFF_SYMBOLS_HEADER + { + uint NumberOfSymbols; + uint LvaToFirstSymbol; + uint NumberOfLinenumbers; + uint LvaToFirstLinenumber; + uint RvaToFirstByteOfCode; + uint RvaToLastByteOfCode; + uint RvaToFirstByteOfData; + uint RvaToLastByteOfData; + }; +//--- +struct FPO_DATA + { + uint ulOffStart; + uint cbProcSize; + uint cdwLocals; + ushort cdwParams; + ushort data; + }; +//--- +struct IMAGE_DEBUG_MISC + { + uint DataType; + uint Length; + uchar Unicode; + uchar Reserved[3]; + uchar Data[1]; + }; +//--- +struct IMAGE_FUNCTION_ENTRY + { + uint StartingAddress; + uint EndingAddress; + uint EndOfPrologue; + }; +//--- +struct IMAGE_SEPARATE_DEBUG_HEADER + { + ushort Signature; + ushort Flags; + ushort Machine; + ushort Characteristics; + uint TimeDateStamp; + uint CheckSum; + uint ImageBase; + uint SizeOfImage; + uint NumberOfSections; + uint ExportedNamesSize; + uint DebugDirectorySize; + uint SectionAlignment; + uint Reserved[2]; + }; +//--- +struct NON_PAGED_DEBUG_INFO + { + ushort Signature; + ushort Flags; + uint Size; + ushort Machine; + ushort Characteristics; + uint TimeDateStamp; + uint CheckSum; + uint SizeOfImage; + ulong ImageBase; + }; +//--- +struct IMAGE_ARCHITECTURE_HEADER + { + int mask; + uint FirstEntryRVA; + }; +//--- +struct IMAGE_ARCHITECTURE_ENTRY + { + uint FixupInstRVA; + uint NewInst; + }; +//--- +struct SLIST_ENTRY + { + PVOID Next; + }; +//--- +struct RTL_BARRIER + { + uint Reserved1; + uint Reserved2; + ulong Reserved3[2]; + uint Reserved4; + uint Reserved5; + }; +//--- +struct MESSAGE_RESOURCE_ENTRY + { + ushort Length; + ushort Flags; + uchar Text[1]; + }; +//--- +struct MESSAGE_RESOURCE_BLOCK + { + uint LowId; + uint HighId; + uint OffsetToEntries; + }; +//--- +struct MESSAGE_RESOURCE_DATA + { + uint NumberOfBlocks; + MESSAGE_RESOURCE_BLOCK Blocks[1]; + }; +//--- +struct OSVERSIONINFOW + { + uint dwOSVersionInfoSize; + uint dwMajorVersion; + uint dwMinorVersion; + uint dwBuildNumber; + uint dwPlatformId; + ushort szCSDVersion[128]; + }; +//--- +struct OSVERSIONINFOEXW + { + uint dwOSVersionInfoSize; + uint dwMajorVersion; + uint dwMinorVersion; + uint dwBuildNumber; + uint dwPlatformId; + short szCSDVersion[128]; + ushort wServicePackMajor; + ushort wServicePackMinor; + ushort wSuiteMask; + uchar wProductType; + uchar wReserved; + }; +//--- +struct NV_MEMORY_RANGE + { + PVOID BaseAddress; + ulong Length; + }; +//--- +struct CORRELATION_VECTOR + { + char Version; + char Vector[RTL_CORRELATION_VECTOR_STRING_LENGTH]; + }; +//--- +struct CUSTOM_SYSTEM_EVENT_TRIGGER_CONFIG + { + uint Size; + const string TriggerId; + }; +//--- +struct IMAGE_POLICY_ENTRY + { + IMAGE_POLICY_ENTRY_TYPE Type; + IMAGE_POLICY_ID PolicyId; + PVOID Value; + }; +//--- +struct IMAGE_POLICY_METADATA + { + uchar Version; + uchar Reserved0[7]; + ulong ApplicationId; + IMAGE_POLICY_ENTRY Policies[]; + }; +//--- +struct RTL_CRITICAL_SECTION_DEBUG + { + ushort Type; + ushort CreatorBackTraceIndex; + PVOID CriticalSection; + LIST_ENTRY ProcessLocksList; + uint EntryCount; + uint ContentionCount; + uint Flags; + ushort CreatorBackTraceIndexHigh; + ushort Spareushort; + }; +//--- +struct RTL_CRITICAL_SECTION + { + PVOID DebugInfo; + int LockCount; + int RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + ulong SpinCount; + }; +//--- +struct RTL_SRWLOCK + { + PVOID Ptr; + }; +//--- +struct RTL_CONDITION_VARIABLE + { + PVOID Ptr; + }; +//--- +struct HEAP_OPTIMIZE_RESOURCES_INFORMATION + { + uint Version; + uint Flags; + }; +//--- +struct ACTIVATION_CONTEXT_QUERY_INDEX + { + uint ulAssemblyIndex; + uint ulFileIndexInAssembly; + }; +//--- +struct ASSEMBLY_FILE_DETAILED_INFORMATION + { + uint ulFlags; + uint ulFilenameLength; + uint ulPathLength; + const string lpFileName; + const string lpFilePath; + }; +//--- +struct ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION + { + uint ulFlags; + uint ulEncodedAssemblyIdentityLength; + uint ulManifestPathType; + uint ulManifestPathLength; + long liManifestLastWriteTime; + uint ulPolicyPathType; + uint ulPolicyPathLength; + long liPolicyLastWriteTime; + uint ulMetadataSatelliteRosterIndex; + uint ulManifestVersionMajor; + uint ulManifestVersionMinor; + uint ulPolicyVersionMajor; + uint ulPolicyVersionMinor; + uint ulAssemblyDirectoryNameLength; + const string lpAssemblyEncodedAssemblyIdentity; + const string lpAssemblyManifestPath; + const string lpAssemblyPolicyPath; + const string lpAssemblyDirectoryName; + uint ulFileCount; + }; +//--- +struct ACTIVATION_CONTEXT_RUN_LEVEL_INFORMATION + { + uint ulFlags; + ACTCTX_REQUESTED_RUN_LEVEL RunLevel; + uint UiAccess; + }; +//--- +struct COMPATIBILITY_CONTEXT_ELEMENT + { + GUID Id; + ACTCTX_COMPATIBILITY_ELEMENT_TYPE Type; + }; +//--- +struct ACTIVATION_CONTEXT_COMPATIBILITY_INFORMATION + { + uint ElementCount; + COMPATIBILITY_CONTEXT_ELEMENT Elements[]; + }; +//--- +struct SUPPORTED_OS_INFO + { + ushort MajorVersion; + ushort MinorVersion; + }; +//--- +struct ACTIVATION_CONTEXT_DETAILED_INFORMATION + { + uint dwFlags; + uint ulFormatVersion; + uint ulAssemblyCount; + uint ulRootManifestPathType; + uint ulRootManifestPathChars; + uint ulRootConfigurationPathType; + uint ulRootConfigurationPathChars; + uint ulAppDirPathType; + uint ulAppDirPathChars; + const string lpRootManifestPath; + const string lpRootConfigurationPath; + const string lpAppDirPath; + }; +//--- +struct HARDWARE_COUNTER_DATA + { + HARDWARE_COUNTER_TYPE Type; + uint Reserved; + ulong Value; + }; +//--- +struct PERFORMANCE_DATA + { + ushort Size; + uchar Version; + uchar HwCountersCount; + uint ContextSwitchCount; + ulong WaitReasonBitMap; + ulong CycleTime; + uint RetryCount; + uint Reserved; + HARDWARE_COUNTER_DATA HwCounters[MAX_HW_COUNTERS]; + }; +//--- +struct EVENTLOGRECORD + { + uint Length; + uint Reserved; + uint RecordNumber; + uint TimeGenerated; + uint TimeWritten; + uint EventID; + ushort EventType; + ushort NumStrings; + ushort EventCategory; + ushort ReservedFlags; + uint ClosingRecordNumber; + uint StringOffset; + uint UserSidLength; + uint UserSidOffset; + uint DataLength; + uint DataOffset; + }; +//--- +struct TAPE_ERASE + { + uint Type; + uchar Immediate; + }; +//--- +struct TAPE_PREPARE + { + uint Operation; + uchar Immediate; + }; +//--- +struct TAPE_WRITE_MARKS + { + uint Type; + uint Count; + uchar Immediate; + }; +//--- +struct TAPE_GET_POSITION + { + uint Type; + uint Partition; + long Offset; + }; +//--- +struct TAPE_SET_POSITION + { + uint Method; + uint Partition; + long Offset; + uchar Immediate; + }; +//--- +struct TAPE_GET_DRIVE_PARAMETERS + { + uchar ECC; + uchar Compression; + uchar DataPadding; + uchar ReportSetmarks; + uint DefaultBlockSize; + uint MaximumBlockSize; + uint MinimumBlockSize; + uint MaximumPartitionCount; + uint FeaturesLow; + uint FeaturesHigh; + uint EOTWarningZoneSize; + }; +//--- +struct TAPE_SET_DRIVE_PARAMETERS + { + uchar ECC; + uchar Compression; + uchar DataPadding; + uchar ReportSetmarks; + uint EOTWarningZoneSize; + }; +//--- +struct TAPE_GET_MEDIA_PARAMETERS + { + long Capacity; + long Remaining; + uint BlockSize; + uint PartitionCount; + uchar WriteProtected; + }; +//--- +struct TAPE_SET_MEDIA_PARAMETERS + { + uint BlockSize; + }; +//--- +struct TAPE_CREATE_PARTITION + { + uint Method; + uint Count; + uint Size; + }; +//--- +struct TAPE_WMI_OPERATIONS + { + uint Method; + uint DataBufferSize; + PVOID DataBuffer; + }; +//--- +struct TRANSACTION_BASIC_INFORMATION + { + GUID TransactionId; + uint State; + uint Outcome; + }; +//--- +struct TRANSACTIONMANAGER_BASIC_INFORMATION + { + GUID TmIdentity; + long VirtualClock; + }; +//--- +struct TRANSACTIONMANAGER_LOG_INFORMATION + { + GUID LogIdentity; + }; +//--- +struct TRANSACTIONMANAGER_LOGPATH_INFORMATION + { + uint LogPathLength; + short LogPath[1]; + }; +//--- +struct TRANSACTIONMANAGER_RECOVERY_INFORMATION + { + ulong LastRecoveredLsn; + }; +//--- +struct TRANSACTIONMANAGER_OLDEST_INFORMATION + { + GUID OldestTransactionGuid; + }; +//--- +struct TRANSACTION_PROPERTIES_INFORMATION + { + uint IsolationLevel; + uint IsolationFlags; + long Timeout; + uint Outcome; + uint DescriptionLength; + short Description[1]; + }; +//--- +struct TRANSACTION_BIND_INFORMATION + { + HANDLE TmHandle; + }; +//--- +struct TRANSACTION_ENLISTMENT_PAIR + { + GUID EnlistmentId; + GUID ResourceManagerId; + }; +//--- +struct TRANSACTION_ENLISTMENTS_INFORMATION + { + uint NumberOfEnlistments; + TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; + }; +//--- +struct TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION + { + TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; + }; +//--- +struct RESOURCEMANAGER_BASIC_INFORMATION + { + GUID ResourceManagerId; + uint DescriptionLength; + short Description[1]; + }; +//--- +struct RESOURCEMANAGER_COMPLETION_INFORMATION + { + HANDLE IoCompletionPortHandle; + ulong CompletionKey; + }; +//--- +struct ENLISTMENT_BASIC_INFORMATION + { + GUID EnlistmentId; + GUID TransactionId; + GUID ResourceManagerId; + }; +//--- +struct ENLISTMENT_CRM_INFORMATION + { + GUID CrmTransactionManagerId; + GUID CrmResourceManagerId; + GUID CrmEnlistmentId; + }; +//--- +struct TRANSACTION_LIST_ENTRY + { + GUID UOW; + }; +//--- +struct TRANSACTION_LIST_INFORMATION + { + uint NumberOfTransactions; + TRANSACTION_LIST_ENTRY TransactionInformation[1]; + }; +//--- +struct KTMOBJECT_CURSOR + { + GUID LastQuery; + uint ObjectIdCount; + GUID ObjectIds[1]; + }; +//--- +struct TP_POOL_STACK_INFORMATION + { + ulong StackReserve; + ulong StackCommit; + }; +//--- +struct TP_CALLBACK_ENVIRON_V3 + { + uint Version; + PVOID Pool; + PVOID CleanupGroup; + PVOID CleanupGroupCancelCallback; + PVOID RaceDll; + PVOID ActivationContext; + PVOID FinalizationCallback; + uint Flags; + TP_CALLBACK_PRIORITY CallbackPriority; + uint Size; + }; +//--- +struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION + { + ulong ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + uchar offset[4]; + ulong Reserved[2]; + }; +//--- +struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX + { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + uint Size; + uchar info[72]; + }; +//--- +struct SYSTEM_CPU_SET_INFORMATION + { + uint Size; + CPU_SET_INFORMATION_TYPE Type; + uint Id; + ushort Group; + uchar LogicalProcessorIndex; + uchar CoreIndex; + uchar LastLevelCacheIndex; + uchar NumaNodeIndex; + uchar EfficiencyClass; + uchar AllFlags; + uint Reserved; + ulong AllocationTag; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "kernel32.dll" +ushort RtlCaptureStackBackTrace(uint frames_to_skip,uint frames_to_capture,PVOID &back_trace[],uint &back_trace_hash); +ulong RtlCompareMemory(const uchar &source1[],const uchar &source2[],ulong length); +ulong VerSetConditionMask(ulong condition_mask,uint type_mask,uchar condition); +#import + +#import "Win32k.sys" +void RtlCaptureContext(PVOID context_record); +void RtlUnwind(PVOID target_frame,PVOID target_ip,EXCEPTION_RECORD &exception_record,PVOID return_value); +PVOID RtlLookupFunctionEntry(ulong control_pc,PVOID image_base,UNWIND_HISTORY_TABLE &history_table); +void RtlUnwindEx(PVOID target_frame,PVOID target_ip,EXCEPTION_RECORD &exception_record,PVOID return_value,PVOID context_record,UNWIND_HISTORY_TABLE &history_table); +PVOID RtlVirtualUnwind(uint handler_type,ulong image_base,ulong control_pc,PVOID function_entry,PVOID context_record,PVOID &handler_data,PVOID establisher_frame,KNONVOLATILE_CONTEXT_POINTERS &context_pointers); +PVOID RtlLookupFunctionEntry(ulong control_pc,uint &image_base,UNWIND_HISTORY_TABLE &history_table); +void RtlUnwindEx(PVOID target_frame,PVOID target_ip,EXCEPTION_RECORD &exception_record,PVOID return_value,PVOID context_record,UNWIND_HISTORY_TABLE &history_table); +PVOID RtlVirtualUnwind(uint handler_type,uint image_base,uint control_pc,PVOID function_entry,PVOID context_record,PVOID &handler_data,uint &establisher_frame,KNONVOLATILE_CONTEXT_POINTERS &context_pointers); +PVOID RtlLookupFunctionEntry(ulong control_pc,PVOID image_base,UNWIND_HISTORY_TABLE &history_table); +void RtlUnwindEx(PVOID target_frame,PVOID target_ip,EXCEPTION_RECORD &exception_record,PVOID return_value,PVOID context_record,UNWIND_HISTORY_TABLE &history_table); +PVOID RtlVirtualUnwind(uint handler_type,ulong image_base,ulong control_pc,PVOID function_entry,PVOID context_record,PVOID &handler_data,PVOID establisher_frame,KNONVOLATILE_CONTEXT_POINTERS &context_pointers); +void RtlUnwindEx(PVOID target_frame,PVOID target_ip,EXCEPTION_RECORD &exception_record,PVOID return_value,PVOID context_record,PVOID history_table); +PVOID RtlPcToFileHeader(PVOID pc_value,PVOID &base_of_image); +#import +//+------------------------------------------------------------------+ diff --git a/WinAPI/winreg.mqh b/WinAPI/winreg.mqh new file mode 100644 index 0000000..6135205 --- /dev/null +++ b/WinAPI/winreg.mqh @@ -0,0 +1,77 @@ +//+------------------------------------------------------------------+ +//| winreg.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//--- +struct VALENTW + { + PVOID ve_valuename; + uint ve_valuelen; + uchar offset1[4]; + PVOID ve_valueptr; + uint ve_type; + uchar offset2[4]; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "advapi32.dll" +int AbortSystemShutdownW(string machine_name); +uint CheckForHiberboot(uchar &hiberboot,uchar clear_flag); +uint InitiateShutdownW(string machine_name,string message,uint grace_period,uint shutdown_flags,uint reason); +int InitiateSystemShutdownExW(string machine_name,string message,uint timeout,int force_apps_closed,int reboot_after_shutdown,uint reason); +int InitiateSystemShutdownW(string machine_name,string message,uint timeout,int force_apps_closed,int reboot_after_shutdown); +int RegCloseKey(HANDLE key); +int RegConnectRegistryExW(const string machine_name,HANDLE key,uint Flags,HANDLE &result); +int RegConnectRegistryW(const string machine_name,HANDLE key,HANDLE &result); +int RegCopyTreeW(HANDLE key_src,const string sub_key,HANDLE key_dest); +int RegCreateKeyExW(HANDLE key,const string sub_key,PVOID reserved,string class_name,uint options,uint desired,PVOID security_attributes,HANDLE &result,uint &disposition); +int RegCreateKeyTransactedW(HANDLE key,const string sub_key,PVOID reserved,string class_name,uint options,uint desired,PVOID security_attributes,HANDLE &result,uint &disposition,HANDLE transaction,PVOID extended_parameter); +int RegCreateKeyW(HANDLE key,const string sub_key,HANDLE &result); +int RegDeleteKeyExW(HANDLE key,const string sub_key,uint desired,PVOID reserved); +int RegDeleteKeyTransactedW(HANDLE key,const string sub_key,uint desired,PVOID reserved,HANDLE transaction,PVOID extended_parameter); +int RegDeleteKeyValueW(HANDLE key,const string sub_key,const string value_name); +int RegDeleteKeyW(HANDLE key,const string sub_key); +int RegDeleteTreeW(HANDLE key,const string sub_key); +int RegDeleteValueW(HANDLE key,const string value_name); +int RegDisablePredefinedCache(void); +int RegDisablePredefinedCacheEx(void); +int RegDisableReflectionKey(HANDLE base); +int RegEnableReflectionKey(HANDLE base); +int RegEnumKeyExW(HANDLE key,uint index,ushort &name[],uint &name_size,PVOID reserved,ushort &class_name[],uint &class_size,FILETIME &last_write_time); +int RegEnumKeyW(HANDLE key,uint index,ushort &name[],uint &name_size); +int RegEnumValueW(HANDLE key,uint index,ushort &value_name[],uint &value_name_size,PVOID reserved,uint &type,uchar &data[],uint &data_size); +int RegFlushKey(HANDLE key); +int RegGetKeySecurity(HANDLE key,uint SecurityInformation,SECURITY_DESCRIPTOR &security_descriptor,uint &security_descriptor_size); +int RegGetValueW(HANDLE key,const string sub_key,const string value,uint flags,uint &type,uchar &data[],uint &data_size); +int RegLoadAppKeyW(const string file,HANDLE &result,uint desired,uint options,PVOID reserved); +int RegLoadKeyW(HANDLE key,const string sub_key,const string file); +int RegLoadMUIStringW(HANDLE key,const string value,ushort &out_buf[],uint &out_buf_size,uint &data,uint flags,const string directory); +int RegNotifyChangeKeyValue(HANDLE key,int watch_subtree,uint notify_filter,HANDLE event,int asynchronous); +int RegOpenCurrentUser(uint desired,HANDLE &result); +int RegOpenKeyExW(HANDLE key,const string sub_key,uint options,uint desired,HANDLE &result); +int RegOpenKeyTransactedW(HANDLE key,const string sub_key,uint options,uint desired,HANDLE &result,HANDLE transaction,PVOID extended_paremeter); +int RegOpenKeyW(HANDLE key,const string sub_key,HANDLE &result); +int RegOpenUserClassesRoot(HANDLE token,uint options,uint desired,HANDLE &result); +int RegOverridePredefKey(HANDLE key,HANDLE new_key); +int RegQueryInfoKeyW(HANDLE key,string class_name,uint &class_size,PVOID reserved,uint &sub_keys,uint &max_sub_key_len,uint &max_class_len,uint &values,uint &max_value_name_len,uint &max_value_len,uint &security_descriptor,FILETIME &last_write_time); +int RegQueryMultipleValuesW(HANDLE key,VALENTW &val_list[],uint num_vals,ushort &value_buf[],uint &totsize); +int RegQueryReflectionKey(HANDLE base,int &is_reflection_disabled); +int RegQueryValueExW(HANDLE key,const string value_name,PVOID reserved,uint &type,uchar &data[],uint &data_size); +int RegQueryValueW(HANDLE key,const string sub_key,uchar &data[],uint &data_size); +int RegRenameKey(HANDLE key,const string sub_key_name,const string new_key_name); +int RegReplaceKeyW(HANDLE key,const string sub_key,const string new_file,const string old_file); +int RegRestoreKeyW(HANDLE key,const string file,uint flags); +int RegSaveKeyExW(HANDLE key,const string file,PVOID security_attributes,uint flags); +int RegSaveKeyW(HANDLE key,const string file,PVOID security_attributes); +int RegSetKeySecurity(HANDLE key,uint SecurityInformation,SECURITY_DESCRIPTOR &security_descriptor); +int RegSetKeyValueW(HANDLE key,const string sub_key,const string value_name,uint type,const uchar &data[],uint data); +int RegSetValueExW(HANDLE key,const string value_name,PVOID reserved,uint type,const uchar &data[],uint data_size); +int RegSetValueW(HANDLE key,const string sub_key,uint type,const ushort &data[],uint data_size); +int RegUnLoadKeyW(HANDLE key,const string sub_key); +#import +//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/WinAPI/winuser.mqh b/WinAPI/winuser.mqh new file mode 100644 index 0000000..bea3127 --- /dev/null +++ b/WinAPI/winuser.mqh @@ -0,0 +1,1825 @@ +//+------------------------------------------------------------------+ +//| WinUser.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#include +#include + +//--- +#define POINTER_DEVICE_PRODUCT_STRING_MAX 520 +#define KL_NAMELENGTH 9 + +//--- +enum AR_STATE + { + AR_ENABLED=0x0, + AR_DISABLED=0x1, + AR_SUPPRESSED=0x2, + AR_REMOTESESSION=0x4, + AR_MULTIMON=0x8, + AR_NOSENSOR=0x10, + AR_NOT_SUPPORTED=0x20, + AR_DOCKED=0x40, + AR_LAPTOP=0x80 + }; +//--- +enum DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS + { + DCDC_DEFAULT=0x0000, + DCDC_DISABLE_FONT_UPDATE=0x0001, + DCDC_DISABLE_RELAYOUT=0x0002 + }; +//--- +enum DIALOG_DPI_CHANGE_BEHAVIORS + { + DDC_DEFAULT=0x0000, + DDC_DISABLE_ALL=0x0001, + DDC_DISABLE_RESIZE=0x0002, + DDC_DISABLE_CONTROL_RELAYOUT=0x0004 + }; +//--- +enum EDIT_CONTROL_FEATURE + { + EDIT_CONTROL_FEATURE_ENTERPRISE_DATA_PROTECTION_PASTE_SUPPORT=0, + EDIT_CONTROL_FEATURE_PASTE_NOTIFICATIONS=1 + }; +//--- +enum FEEDBACK_TYPE + { + FEEDBACK_TOUCH_CONTACTVISUALIZATION=1, + FEEDBACK_PEN_BARRELVISUALIZATION=2, + FEEDBACK_PEN_TAP=3, + FEEDBACK_PEN_DOUBLETAP=4, + FEEDBACK_PEN_PRESSANDHOLD=5, + FEEDBACK_PEN_RIGHTTAP=6, + FEEDBACK_TOUCH_TAP=7, + FEEDBACK_TOUCH_DOUBLETAP=8, + FEEDBACK_TOUCH_PRESSANDHOLD=9, + FEEDBACK_TOUCH_RIGHTTAP=10, + FEEDBACK_GESTURE_PRESSANDTAP=11, + FEEDBACK_MAX=0xFFFFFFFF + }; +//--- +enum HANDEDNESS + { + HANDEDNESS_LEFT=0, + HANDEDNESS_RIGHT + }; +//--- +enum INPUT_MESSAGE_DEVICE_TYPE + { + IMDT_UNAVAILABLE=0x00000000, + IMDT_KEYBOARD=0x00000001, + IMDT_MOUSE=0x00000002, + IMDT_TOUCH=0x00000004, + IMDT_PEN=0x00000008, + IMDT_TOUCHPAD=0x00000010 + }; +//--- +enum INPUT_MESSAGE_ORIGIN_ID + { + IMO_UNAVAILABLE=0x00000000, + IMO_HARDWARE=0x00000001, + IMO_INJECTED=0x00000002, + IMO_SYSTEM=0x00000004 + }; +//--- +enum ORIENTATION_PREFERENCE + { + ORIENTATION_PREFERENCE_NONE=0x0, + ORIENTATION_PREFERENCE_LANDSCAPE=0x1, + ORIENTATION_PREFERENCE_PORTRAIT=0x2, + ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED=0x4, + ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED=0x8 + }; +//--- +enum POINTER_BUTTON_CHANGE_TYPE + { + POINTER_CHANGE_NONE, + POINTER_CHANGE_FIRSTBUTTON_DOWN, + POINTER_CHANGE_FIRSTBUTTON_UP, + POINTER_CHANGE_SECONDBUTTON_DOWN, + POINTER_CHANGE_SECONDBUTTON_UP, + POINTER_CHANGE_THIRDBUTTON_DOWN, + POINTER_CHANGE_THIRDBUTTON_UP, + POINTER_CHANGE_FOURTHBUTTON_DOWN, + POINTER_CHANGE_FOURTHBUTTON_UP, + POINTER_CHANGE_FIFTHBUTTON_DOWN, + POINTER_CHANGE_FIFTHBUTTON_UP + }; +//--- +enum POINTER_DEVICE_CURSOR_TYPE + { + POINTER_DEVICE_CURSOR_TYPE_UNKNOWN=0x00000000, + POINTER_DEVICE_CURSOR_TYPE_TIP=0x00000001, + POINTER_DEVICE_CURSOR_TYPE_ERASER=0x00000002, + POINTER_DEVICE_CURSOR_TYPE_MAX=0xFFFFFFFF + }; +//--- +enum POINTER_DEVICE_TYPE + { + POINTER_DEVICE_TYPE_INTEGRATED_PEN=0x00000001, + POINTER_DEVICE_TYPE_EXTERNAL_PEN=0x00000002, + POINTER_DEVICE_TYPE_TOUCH=0x00000003, + POINTER_DEVICE_TYPE_TOUCH_PAD=0x00000004, + POINTER_DEVICE_TYPE_MAX=0xFFFFFFFF + }; +//--- +struct ACCEL + { + uchar fVirt; + ushort key; + ushort cmd; + }; +//--- +struct ACCESSTIMEOUT + { + uint cbSize; + uint dwFlags; + uint iTimeOutMSec; + }; +//--- +struct ALTTABINFO + { + uint cbSize; + int cItems; + int cColumns; + int cRows; + int iColFocus; + int iRowFocus; + int cxItem; + int cyItem; + POINT ptStart; + }; +//--- +struct ANIMATIONINFO + { + uint cbSize; + int iMinAnimate; + }; +//--- +struct AUDIODESCRIPTION + { + uint cbSize; + int Enabled; + uint Locale; + }; +//--- +struct BSMINFO + { + uint cbSize; + HANDLE hdesk; + HANDLE hwnd; + LUID luid; + }; +//--- +struct CBT_CREATEWNDA + { + HANDLE hwndInsertAfter; + }; +//--- +struct CBT_CREATEWNDW + { + HANDLE hwndInsertAfter; + }; +//--- +struct CBTACTIVATESTRUCT + { + int fMouse; + HANDLE hWndActive; + }; +//--- +struct CHANGEFILTERSTRUCT + { + uint cbSize; + uint ExtStatus; + }; +//--- +struct CLIENTCREATESTRUCT + { + HANDLE hWindowMenu; + uint idFirstChild; + }; +//--- +struct COMBOBOXINFO + { + uint cbSize; + RECT rcItem; + RECT rcButton; + uint stateButton; + HANDLE hwndCombo; + HANDLE hwndItem; + HANDLE hwndList; + }; +//--- +struct COMPAREITEMSTRUCT + { + uint CtlType; + uint CtlID; + HANDLE hwndItem; + uint itemID1; + ulong itemData1; + uint itemID2; + ulong itemData2; + uint dwLocaleId; + }; +//--- +struct COPYDATASTRUCT + { + ulong dwData; + uint cbData; + }; +//--- +struct CREATESTRUCTW pack(8) + { + PVOID lpCreateParams; + HANDLE hInstance; + HANDLE hMenu; + HANDLE hwndParent; + int cy; + int cx; + int y; + int x; + int style; + PVOID lpszName; + PVOID lpszClass; + uint dwExStyle; + }; +//--- +struct CURSORINFO + { + uint cbSize; + uint flags; + HANDLE hCursor; + POINT ptScreenPos; + }; +//--- +struct CURSORSHAPE + { + int xHotSpot; + int yHotSpot; + int cx; + int cy; + int cbWidth; + uchar Planes; + uchar BitsPixel; + }; +//--- +struct CWPRETSTRUCT + { + PVOID lResult; + PVOID lParam; + PVOID wParam; + uint message; + HANDLE hwnd; + }; +//--- +struct CWPSTRUCT + { + PVOID lParam; + PVOID wParam; + uint message; + HANDLE hwnd; + }; +//--- +struct DEBUGHOOKINFO + { + uint idThread; + uint idThreadInstaller; + PVOID lParam; + PVOID wParam; + int code; + }; +//--- +struct DELETEITEMSTRUCT + { + uint CtlType; + uint CtlID; + uint itemID; + HANDLE hwndItem; + ulong itemData; + }; +//--- +struct DLGITEMTEMPLATE + { + uint style; + uint dwExtendedStyle; + short x; + short y; + short cx; + short cy; + ushort id; + }; +//--- +struct DLGTEMPLATE + { + uint style; + uint dwExtendedStyle; + ushort cdit; + short x; + short y; + short cx; + short cy; + }; +//--- +struct DRAWITEMSTRUCT + { + uint CtlType; + uint CtlID; + uint itemID; + uint itemAction; + uint itemState; + HANDLE hwndItem; + HANDLE hDC; + RECT rcItem; + ulong itemData; + }; +//--- +struct DRAWTEXTPARAMS + { + uint cbSize; + int iTabLength; + int iLeftMargin; + int iRightMargin; + uint uiLengthDrawn; + }; +//--- +struct DROPSTRUCT + { + HANDLE hwndSource; + HANDLE hwndSink; + uint wFmt; + ulong dwData; + POINT ptDrop; + uint dwControlData; + }; +//--- +struct EVENTMSG + { + uint message; + uint paramL; + uint paramH; + uint time; + HANDLE hwnd; + }; +//--- +struct FILTERKEYS + { + uint cbSize; + uint dwFlags; + uint iWaitMSec; + uint iDelayMSec; + uint iRepeatMSec; + uint iBounceMSec; + }; +//--- +struct FLASHWINFO + { + uint cbSize; + HANDLE hwnd; + uint dwFlags; + uint uCount; + uint dwTimeout; + }; +//--- +struct GESTURECONFIG + { + uint dwID; + uint dwWant; + uint dwBlock; + }; +//--- +struct GESTUREINFO + { + uint cbSize; + uint dwFlags; + uint dwID; + HANDLE hwndTarget; + POINTS ptsLocation; + uint dwInstanceID; + uint dwSequenceID; + ulong ullArguments; + uint cbExtraArgs; + }; +//--- +struct GESTURENOTIFYSTRUCT + { + uint cbSize; + uint dwFlags; + HANDLE hwndTarget; + POINTS ptsLocation; + uint dwInstanceID; + }; +//--- +struct GUITHREADINFO + { + uint cbSize; + uint flags; + HANDLE hwndActive; + HANDLE hwndFocus; + HANDLE hwndCapture; + HANDLE hwndMenuOwner; + HANDLE hwndMoveSize; + HANDLE hwndCaret; + RECT rcCaret; + }; +//--- +struct HARDWAREHOOKSTRUCT + { + HANDLE hwnd; + uint message; + PVOID wParam; + PVOID lParam; + }; +//--- +struct HARDWAREINPUT + { + uint uMsg; + ushort wParamL; + ushort wParamH; + }; +//--- +struct HELPINFO + { + uint cbSize; + int iContextType; + int iCtrlId; + HANDLE hItemHandle; + uint dwContextId; + POINT MousePos; + }; +//--- +struct HELPWININFOA + { + int wStructSize; + int x; + int y; + int dx; + int dy; + int wMax; + char rgchMember[2]; + }; +//--- +struct HELPWININFOW + { + int wStructSize; + int x; + int y; + int dx; + int dy; + int wMax; + short rgchMember[2]; + }; +//--- +struct HIGHCONTRASTW + { + uint cbSize; + uint dwFlags; + string lpszDefaultScheme; + }; +//--- +struct ICONINFO + { + int fIcon; + uint xHotspot; + uint yHotspot; + HANDLE hbmMask; + HANDLE hbmColor; + }; +//--- +struct ICONINFOEXW + { + uint cbSize; + int fIcon; + uint xHotspot; + uint yHotspot; + HANDLE hbmMask; + HANDLE hbmColor; + ushort wResID; + short szModName[MAX_PATH]; + short szResName[MAX_PATH]; + }; +//--- +struct ICONMETRICSW + { + uint cbSize; + int iHorzSpacing; + int iVertSpacing; + int iTitleWrap; + LOGFONTW lfFont; + }; +//--- +struct INPUT_INJECTION_VALUE + { + ushort page; + ushort usage; + int value; + ushort index; + }; +//--- +struct INPUT_MESSAGE_SOURCE + { + INPUT_MESSAGE_DEVICE_TYPE deviceType; + INPUT_MESSAGE_ORIGIN_ID originId; + }; +//--- +struct KBDLLHOOKSTRUCT + { + uint vkCode; + uint scanCode; + uint flags; + uint time; + ulong dwExtraInfo; + }; +//--- +struct KEYBDINPUT + { + ushort wVk; + ushort wScan; + uint dwFlags; + uint time; + ulong dwExtraInfo; + }; +//--- +struct LASTINPUTINFO + { + uint cbSize; + uint dwTime; + }; +//--- +struct MDICREATESTRUCTW + { + PVOID szClass; + PVOID szTitle; + HANDLE hOwner; + int x; + int y; + int cx; + int cy; + uint style; + PVOID lParam; + }; +//--- +struct MDINEXTMENU + { + HANDLE hmenuIn; + HANDLE hmenuNext; + HANDLE hwndNext; + }; +//--- +struct MEASUREITEMSTRUCT + { + uint CtlType; + uint CtlID; + uint itemID; + uint itemWidth; + uint itemHeight; + ulong itemData; + }; +//--- +struct MENUBARINFO + { + uint cbSize; + RECT rcBar; + HANDLE hMenu; + HANDLE hwndMenu; + int Focused; + }; +//--- +struct MENUGETOBJECTINFO + { + uint dwFlags; + uint uPos; + HANDLE hmenu; + PVOID riid; + PVOID pvObj; + }; +//--- +struct MENUINFO + { + uint cbSize; + uint fMask; + uint dwStyle; + uint cyMax; + HANDLE hbrBack; + uint dwContextHelpID; + ulong dwMenuData; + }; +//--- +struct MENUITEMINFOW + { + uint cbSize; + uint fMask; + uint fType; + uint fState; + uint wID; + HANDLE hSubMenu; + HANDLE hbmpChecked; + HANDLE hbmpUnchecked; + ulong dwItemData; + string dwTypeData; + uint cch; + HANDLE hbmpItem; + }; +//--- +struct MENUITEMTEMPLATE + { + ushort mtOption; + ushort mtID; + short mtString[1]; + }; +//--- +struct MENUITEMTEMPLATEHEADER + { + ushort versionNumber; + ushort offset; + }; +//--- +struct MINIMIZEDMETRICS + { + uint cbSize; + int iWidth; + int iHorzGap; + int iVertGap; + int iArrange; + }; +//--- +struct MINMAXINFO + { + POINT ptReserved; + POINT ptMaxSize; + POINT ptMaxPosition; + POINT ptMinTrackSize; + POINT ptMaxTrackSize; + }; +//--- +struct MONITORINFO + { + uint cbSize; + RECT rcMonitor; + RECT rcWork; + uint dwFlags; + }; +//--- +struct MOUSEHOOKSTRUCT + { + POINT pt; + HANDLE hwnd; + uint wHitTestCode; + ulong dwExtraInfo; + }; +//--- +struct MOUSEHOOKSTRUCTEX: public MONITORINFO + { + uint mouseData; + }; +//--- +struct MOUSEINPUT pack(8) + { + int dx; + int dy; + uint mouseData; + uint dwFlags; + uint time; + ulong dwExtraInfo; + }; +//--- +struct MOUSEKEYS + { + uint cbSize; + uint dwFlags; + uint iMaxSpeed; + uint iTimeToMaxSpeed; + uint iCtrlSpeed; + uint dwReserved1; + uint dwReserved2; + }; +//--- +struct MOUSEMOVEPOINT + { + int x; + int y; + uint time; + ulong dwExtraInfo; + }; +//--- +struct MSG + { + HANDLE hwnd; + uint message; + PVOID wParam; + PVOID lParam; + uint time; + POINT pt; + uint lPrivate; + }; +//--- +struct MSGBOXPARAMSW + { + uint cbSize; + HANDLE hwndOwner; + HANDLE hInstance; + PVOID lpszText; + PVOID lpszCaption; + uint dwStyle; + PVOID lpszIcon; + uint dwContextHelpId; + PVOID lpfnMsgBoxCallback; + uint dwLanguageId; + }; +//--- +struct MSLLHOOKSTRUCT + { + POINT pt; + uint mouseData; + uint flags; + uint time; + ulong dwExtraInfo; + }; +//--- +struct MULTIKEYHELPW + { + short mkKeylist; + short szKeyphrase[1]; + }; +//--- +struct NCCALCSIZE_PARAMS + { + RECT rgrc[3]; + PVOID lppos; + }; +//--- +struct NMHDR + { + HANDLE hwndFrom; + ulong idFrom; + uint code; + }; +//--- +struct NONCLIENTMETRICSW + { + uint cbSize; + int iBorderWidth; + int iScrollWidth; + int iScrollHeight; + int iCaptionWidth; + int iCaptionHeight; + LOGFONTW lfCaptionFont; + int iSmCaptionWidth; + int iSmCaptionHeight; + LOGFONTW lfSmCaptionFont; + int iMenuWidth; + int iMenuHeight; + LOGFONTW lfMenuFont; + LOGFONTW lfStatusFont; + LOGFONTW lfMessageFont; + int iPaddedBorderWidth; + }; +//--- +struct PAINTSTRUCT + { + HANDLE hdc; + int fErase; + RECT rcPaint; + int fRestore; + int fIncUpdate; + uchar rgbReserved[32]; + }; +//--- +struct POINTER_DEVICE_CURSOR_INFO + { + uint cursorId; + POINTER_DEVICE_CURSOR_TYPE cursor; + }; +//--- +struct POINTER_DEVICE_INFO pack(8) + { + uint displayOrientation; + HANDLE device; + POINTER_DEVICE_TYPE pointerDeviceType; + HANDLE monitor; + uint startingCursorId; + ushort maxActiveContacts; + short productString[POINTER_DEVICE_PRODUCT_STRING_MAX]; + }; +//--- +struct POINTER_DEVICE_PROPERTY + { + int logicalMin; + int logicalMax; + int physicalMin; + int physicalMax; + uint unit; + uint unitExponent; + ushort usagePageId; + ushort usageId; + }; +//--- +struct POINTER_INFO + { + uint pointerType; + uint pointerId; + uint frameId; + uint pointerFlags; + HANDLE sourceDevice; + HANDLE hwndTarget; + POINT ptPixelLocation; + POINT ptHimetricLocation; + POINT ptPixelLocationRaw; + POINT ptHimetricLocationRaw; + uint dwTime; + uint historyCount; + int InputData; + uint dwKeyStates; + ulong PerformanceCount; + POINTER_BUTTON_CHANGE_TYPE ButtonChangeType; + }; +//--- +struct POINTER_PEN_INFO + { + POINTER_INFO pointerInfo; + uint penFlags; + uint penMask; + uint pressure; + uint rotation; + int tiltX; + int tiltY; + }; +//--- +struct POINTER_TOUCH_INFO + { + POINTER_INFO pointerInfo; + uint touchFlags; + uint touchMask; + RECT rcContact; + RECT rcContactRaw; + uint orientation; + uint pressure; + }; +//--- +struct POWERBROADCAST_SETTING + { + GUID PowerSetting; + uint DataLength; + uchar Data[1]; + }; +//--- +struct RAWINPUTDEVICE + { + ushort usUsagePage; + ushort usUsage; + uint dwFlags; + HANDLE hwndTarget; + }; +//--- +struct RAWINPUTDEVICELIST + { + HANDLE hDevice; + uint dwType; + }; +//--- +struct RAWINPUTHEADER + { + uint dwType; + uint dwSize; + HANDLE hDevice; + PVOID wParam; + }; +//--- +struct RID_DEVICE_INFO_HID + { + uint dwVendorId; + uint dwProductId; + uint dwVersionNumber; + ushort usUsagePage; + ushort usUsage; + }; +//--- +struct RID_DEVICE_INFO_KEYBOARD + { + uint dwType; + uint dwSubType; + uint dwKeyboardMode; + uint dwNumberOfFunctionKeys; + uint dwNumberOfIndicators; + uint dwNumberOfKeysTotal; + }; +//--- +struct RID_DEVICE_INFO_MOUSE + { + uint dwId; + uint dwNumberOfButtons; + uint dwSampleRate; + int fHasHorizontalWheel; + }; +//--- +struct SCROLLBARINFO + { + uint cbSize; + RECT rcScrollBar; + int dxyLineButton; + int xyThumbTop; + int xyThumbBottom; + int reserved; + }; +//--- +struct SCROLLINFO + { + uint cbSize; + uint fMask; + int nMin; + int nMax; + uint nPage; + int nPos; + int nTrackPos; + }; +//--- +struct SERIALKEYSW + { + uint cbSize; + uint dwFlags; + string lpszActivePort; + string lpszPort; + uint iBaudRate; + uint iPortState; + uint iActive; + }; +//--- +struct SHELLHOOKINFO + { + HANDLE hwnd; + RECT rc; + }; +//--- +struct SOUNDSENTRYW + { + uint cbSize; + uint dwFlags; + uint iFSTextEffect; + uint iFSTextEffectMSec; + uint iFSTextEffectColorBits; + uint iFSGrafEffect; + uint iFSGrafEffectMSec; + uint iFSGrafEffectColor; + uint iWindowsEffect; + uint iWindowsEffectMSec; + string lpszWindowsEffectDLL; + uint iWindowsEffectOrdinal; + }; +//--- +struct STICKYKEYS + { + uint cbSize; + uint dwFlags; + }; +//--- +struct STYLESTRUCT + { + uint styleOld; + uint styleNew; + }; +//--- +struct TITLEBARINFO + { + uint cbSize; + RECT rcTitleBar; + }; +//--- +struct TITLEBARINFOEX + { + uint cbSize; + RECT rcTitleBar; + }; +//--- +struct TOGGLEKEYS + { + uint cbSize; + uint dwFlags; + }; +//--- +struct TOUCH_HIT_TESTING_INPUT + { + uint pointerId; + POINT point; + RECT boundingBox; + RECT nonOccludedBoundingBox; + uint orientation; + }; +//--- +struct TOUCH_HIT_TESTING_PROXIMITY_EVALUATION + { + ushort score; + POINT adjustedPoint; + }; +//--- +struct TOUCHINPUT + { + int x; + int y; + HANDLE hSource; + uint dwID; + uint dwFlags; + uint dwMask; + uint dwTime; + ulong dwExtraInfo; + uint cxContact; + uint cyContact; + }; +//--- +struct TOUCHPREDICTIONPARAMETERS + { + uint cbSize; + uint dwLatency; + uint dwSampleTime; + uint bUseHWTimeStamp; + }; +//--- +struct TPMPARAMS + { + uint cbSize; + RECT rcExclude; + }; +//--- +struct TRACKMOUSEEVENT + { + uint cbSize; + uint dwFlags; + HANDLE hwndTrack; + uint dwHoverTime; + }; +//--- +struct UPDATELAYEREDWINDOWINFO + { + uint cbSize; + HANDLE hdcDst; + HANDLE hdcSrc; + uint crKey; + uint dwFlags; + }; +//--- +struct USAGE_PROPERTIES + { + ushort level; + ushort page; + ushort usage; + int logicalMinimum; + int logicalMaximum; + ushort unit; + ushort exponent; + uchar count; + int physicalMinimum; + int physicalMaximum; + }; +//--- +struct USEROBJECTFLAGS + { + int fInherit; + int fReserved; + uint dwFlags; + }; +//--- +struct WINDOWINFO + { + uint cbSize; + RECT rcWindow; + RECT rcClient; + uint dwStyle; + uint dwExStyle; + uint dwWindowStatus; + uint cxWindowBorders; + uint cyWindowBorders; + ushort atomWindowType; + ushort wCreatorVersion; + }; +//--- +struct WINDOWPLACEMENT + { + uint length; + uint flags; + uint showCmd; + POINT ptMinPosition; + POINT ptMaxPosition; + RECT rcNormalPosition; + RECT rcDevice; + }; +//--- +struct WINDOWPOS + { + HANDLE hwnd; + HANDLE hwndInsertAfter; + int x; + int y; + int cx; + int cy; + uint flags; + }; +//--- +struct WNDCLASSEXW pack(8) + { + uint cbSize; + uint style; + PVOID lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HANDLE hInstance; + HANDLE hIcon; + HANDLE hCursor; + HANDLE hbrBackground; + PVOID lpszMenuName; + PVOID lpszClassName; + HANDLE hIconSm; + }; +//--- +struct WNDCLASSW pack(8) + { + uint style; + PVOID lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HANDLE hInstance; + HANDLE hIcon; + HANDLE hCursor; + HANDLE hbrBackground; + PVOID lpszMenuName; + PVOID lpszClassName; + }; +//--- +struct WTSSESSION_NOTIFICATION + { + uint cbSize; + uint dwSessionId; + }; +//--- +struct RAWMOUSE pack(4) + { + ushort usFlags; + uint ulButtons; + uint ulRawButtons; + int lLastX; + int lLastY; + uint ulExtraInformation; + }; +//--- +struct RAWKEYBOARD + { + ushort MakeCode; + ushort Flags; + ushort Reserved; + ushort VKey; + uint Message; + uint ExtraInformation; + }; +//--- +struct RAWHID + { + uint dwSizeHid; + uint dwCount; + uchar bRawData[1]; + }; +//--- +union RAWFORMAT + { + RAWMOUSE mouse; + RAWKEYBOARD keyboard; + RAWHID hid; + }; +//--- +struct RAWINPUT + { + RAWINPUTHEADER header; + RAWFORMAT data; + }; +//--- +struct INPUT_TRANSFORM + { + float _11; + float _12; + float _13; + float _14; + float _21; + float _22; + float _23; + float _24; + float _31; + float _32; + float _33; + float _34; + float _41; + float _42; + float _43; + float _44; + }; +//--- +struct MENUITEMINFO + { + uint cbSize; + uint fMask; + uint fType; + uint fState; + uint wID; + HANDLE hSubMenu; + HANDLE hbmpChecked; + HANDLE hbmpUnchecked; + uint dwItemData; + string dwTypeData; + uint cch; + }; +//--- +union INPUT_TYPE + { + MOUSEINPUT mi; + KEYBDINPUT ki; + HARDWAREINPUT hi; + }; +//--- +struct INPUT + { + uint type; + INPUT_TYPE in; + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +#import "user32.dll" +HANDLE ActivateKeyboardLayout(HANDLE hkl,uint Flags); +int AddClipboardFormatListener(HANDLE hwnd); +int AdjustWindowRect(RECT &rect,uint style,int menu); +int AdjustWindowRectEx(RECT &rect,uint style,int menu,uint ex_style); +int AdjustWindowRectExForDpi(RECT &rect,uint style,int menu,uint ex_style,uint dpi); +int AllowSetForegroundWindow(uint process_id); +int AnimateWindow(HANDLE wnd,uint time,uint flags); +int AnyPopup(void); +int AppendMenuW(HANDLE menu,uint flags,ulong uIDNewItem,const string new_item); +int AreDpiAwarenessContextsEqual(HANDLE dpiContextA,HANDLE dpiContextB); +uint ArrangeIconicWindows(HANDLE wnd); +int AttachThreadInput(uint attach,uint attach_to,int attach); +HANDLE BeginDeferWindowPos(int num_windows); +HANDLE BeginPaint(HANDLE wnd,PAINTSTRUCT &paint); +int BlockInput(int block_it); +int BringWindowToTop(HANDLE wnd); +int BroadcastSystemMessage(uint flags,uint &info,uint Msg,PVOID param,PVOID param); +int BroadcastSystemMessageExW(uint flags,uint &info,uint Msg,PVOID param,PVOID param,BSMINFO &info); +int BroadcastSystemMessageW(uint flags,uint &info,uint Msg,PVOID param,PVOID param); +int CalculatePopupWindowPosition(const POINT &point,const SIZE &size,uint flags,RECT &rect,RECT &window_position); +int CallMsgFilterW(MSG &msg,int code); +PVOID CallNextHookEx(HANDLE hhk,int code,PVOID param,PVOID param); +PVOID CallWindowProcW(PVOID prev_wnd_func,HANDLE wnd,uint Msg,PVOID param,PVOID param); +int CancelShutdown(void); +ushort CascadeWindows(HANDLE parent,uint how,const RECT &rect,uint kids,const HANDLE &kids[]); +int ChangeClipboardChain(HANDLE wnd_remove,HANDLE wnd_new_next); +int ChangeDisplaySettingsExW(const string device_name,DEVMODEW &dev_mode,HANDLE hwnd,uint dwflags,PVOID param); +int ChangeDisplaySettingsW(DEVMODEW &dev_mode,uint flags); +int ChangeMenuW(HANDLE menu,uint cmd,const string new_item,uint insert,uint flags); +int ChangeWindowMessageFilter(uint message,uint flag); +int ChangeWindowMessageFilterEx(HANDLE hwnd,uint message,uint action,CHANGEFILTERSTRUCT &change_filter_struct); +uint CharLowerBuffW(string &lpsz,uint length); +PVOID CharLowerW(string &lpsz); +PVOID CharNextW(PVOID lpsz); +PVOID CharNextW(string lpsz); +PVOID CharPrevW(const PVOID start,const PVOID current); +PVOID CharPrevW(const string start,const string current); +int CharToOemBuffW(const string src,char &dst[],uint dst_length); +int CharToOemW(const string src,char &dst[]); +uint CharUpperBuffW(string &lpsz,uint length); +PVOID CharUpperW(string &lpsz); +int CheckDlgButton(HANDLE dlg,int nIDButton,uint check); +uint CheckMenuItem(HANDLE menu,uint uIDCheckItem,uint check); +int CheckMenuRadioItem(HANDLE hmenu,uint first,uint last,uint check,uint flags); +int CheckRadioButton(HANDLE dlg,int nIDFirstButton,int nIDLastButton,int nIDCheckButton); +HANDLE ChildWindowFromPoint(HANDLE wnd_parent,POINT &point); +HANDLE ChildWindowFromPointEx(HANDLE hwnd,POINT &pt,uint flags); +int ClientToScreen(HANDLE wnd,POINT &point); +int ClipCursor(RECT &rect); +int CloseClipboard(void); +int CloseDesktop(HANDLE desktop); +int CloseGestureInfoHandle(HANDLE gesture_info); +int CloseTouchInputHandle(HANDLE touch_input); +int CloseWindow(HANDLE wnd); +int CloseWindowStation(HANDLE win_sta); +int CopyAcceleratorTableW(HANDLE accel_src,ACCEL &accel_dst,int accel_entries); +HANDLE CopyIcon(HANDLE icon); +HANDLE CopyImage(HANDLE h,uint type,int cx,int cy,uint flags); +int CopyRect(RECT &dst,RECT &src); +int CountClipboardFormats(void); +HANDLE CreateAcceleratorTableW(ACCEL &paccel,int accel); +int CreateCaret(HANDLE wnd,HANDLE bitmap,int width,int height); +HANDLE CreateCursor(HANDLE inst,int hot_spot,int hot_spot,int width,int height,PVOID pvANDPlane,PVOID pvXORPlane); +HANDLE CreateDesktopExW(const string desktop,const PVOID device,PVOID devmode,uint flags,uint desired_access,PVOID lpsa,uint heap_size,PVOID pvoid); +HANDLE CreateDesktopExW(const string desktop,const string device,PVOID devmode,uint flags,uint desired_access,PVOID lpsa,uint heap_size,PVOID pvoid); +HANDLE CreateDesktopExW(const string desktop,const PVOID device,DEVMODEW &devmode,uint flags,uint desired_access,PVOID lpsa,uint heap_size,PVOID pvoid); +HANDLE CreateDesktopExW(const string desktop,const string device,DEVMODEW &devmode,uint flags,uint desired_access,PVOID lpsa,uint heap_size,PVOID pvoid); +HANDLE CreateDesktopW(const string desktop,const PVOID device,PVOID devmode,uint flags,uint desired_access,PVOID lpsa); +HANDLE CreateDesktopW(const string desktop,const string device,PVOID devmode,uint flags,uint desired_access,PVOID lpsa); +HANDLE CreateDesktopW(const string desktop,const PVOID device,DEVMODEW &devmode,uint flags,uint desired_access,PVOID lpsa); +HANDLE CreateDesktopW(const string desktop,const string device,DEVMODEW &devmode,uint flags,uint desired_access,PVOID lpsa); +HANDLE CreateDialogIndirectParamW(HANDLE instance,const DLGTEMPLATE &dlg_template,HANDLE wnd_parent,PVOID dialog_func,PVOID init_param); +HANDLE CreateDialogParamW(HANDLE instance,const string template_name,HANDLE wnd_parent,PVOID dialog_func,PVOID init_param); +HANDLE CreateIcon(HANDLE instance,int width,int height,uchar planes,uchar bits_pixel,const uchar &lpbANDbits[],const uchar &lpbXORbits[]); +HANDLE CreateIconFromResource(uchar &presbits,uint res_size,int icon,uint ver); +HANDLE CreateIconFromResourceEx(uchar &presbits,uint res_size,int icon,uint ver,int desired,int desired,uint Flags); +HANDLE CreateIconIndirect(ICONINFO &piconinfo); +HANDLE CreateMDIWindowW(const string class_name,const string window_name,uint style,int X,int Y,int width,int height,HANDLE wnd_parent,HANDLE instance,PVOID param); +HANDLE CreateMenu(void); +HANDLE CreatePopupMenu(void); +HANDLE CreateWindowExW(uint ex_style,const PVOID class_name,const PVOID window_name,uint style,int X,int Y,int width,int height,HANDLE wnd_parent,HANDLE menu,HANDLE instance,PVOID param); +HANDLE CreateWindowExW(uint ex_style,const string class_name,const string window_name,uint style,int X,int Y,int width,int height,HANDLE wnd_parent,HANDLE menu,HANDLE instance,PVOID param); +HANDLE CreateWindowStationW(const string lpwinsta,uint flags,uint desired_access,PVOID lpsa); +PVOID DefDlgProcW(HANDLE dlg,uint Msg,PVOID param,PVOID param); +HANDLE DeferWindowPos(HANDLE win_pos_info,HANDLE wnd,HANDLE wnd_insert_after,int x,int y,int cx,int cy,uint flags); +PVOID DefFrameProcW(HANDLE wnd,HANDLE hWndMDIClient,uint msg,PVOID param,PVOID param); +PVOID DefMDIChildProcW(HANDLE wnd,uint msg,PVOID param,PVOID param); +PVOID DefRawInputProc(RAWINPUT &raw_input[],int inp,uint size_header); +PVOID DefWindowProcW(HANDLE wnd,uint Msg,PVOID param,PVOID param); +int DeleteMenu(HANDLE menu,uint position,uint flags); +int DeregisterShellHookWindow(HANDLE hwnd); +int DestroyAcceleratorTable(HANDLE accel); +int DestroyCaret(void); +int DestroyCursor(HANDLE cursor); +int DestroyIcon(HANDLE icon); +int DestroyMenu(HANDLE menu); +int DestroyWindow(HANDLE wnd); +long DialogBoxIndirectParamW(HANDLE instance,DLGTEMPLATE &dialog_template,HANDLE wnd_parent,PVOID dialog_func,PVOID init_param); +long DialogBoxParamW(HANDLE instance,const string template_name,HANDLE wnd_parent,PVOID dialog_func,PVOID init_param); +void DisableProcessWindowsGhosting(void); +PVOID DispatchMessageW(MSG &msg); +int DisplayConfigGetDeviceInfo(DISPLAYCONFIG_DEVICE_INFO_HEADER &packet); +int DisplayConfigSetDeviceInfo(DISPLAYCONFIG_DEVICE_INFO_HEADER &packet); +int DlgDirListComboBoxW(HANDLE dlg,string path_spec,int nIDComboBox,int nIDStaticPath,uint filetype); +int DlgDirListW(HANDLE dlg,string path_spec,int nIDListBox,int nIDStaticPath,uint file_type); +int DlgDirSelectComboBoxExW(HANDLE dlg,string str,int out,int combo_box); +int DlgDirSelectExW(HANDLE dlg,string str,int count,int list_box); +int DragDetect(HANDLE hwnd,POINT &pt); +uint DragObject(HANDLE parent,HANDLE from,uint fmt,ulong data,HANDLE hcur); +int DrawAnimatedRects(HANDLE hwnd,int ani,RECT &from,RECT &to); +int DrawCaption(HANDLE hwnd,HANDLE hdc,RECT &lprect,uint flags); +int DrawEdge(HANDLE hdc,RECT &qrc,uint edge,uint flags); +int DrawFocusRect(HANDLE hDC,RECT &lprc); +int DrawFrameControl(HANDLE,RECT &,uint,uint); +int DrawIcon(HANDLE hDC,int X,int Y,HANDLE icon); +int DrawIconEx(HANDLE hdc,int left,int top,HANDLE icon,int width,int width,uint if_ani_cur,HANDLE flicker_free_draw,uint flags); +int DrawMenuBar(HANDLE wnd); +int DrawStateW(HANDLE hdc,HANDLE fore,PVOID call_back,PVOID data,PVOID data,int x,int y,int cx,int cy,uint flags); +int DrawTextExW(HANDLE hdc,string text,int text,RECT &lprc,uint format,DRAWTEXTPARAMS &lpdtp); +int DrawTextW(HANDLE hdc,const string text,int text,RECT &lprc,uint format); +int EmptyClipboard(void); +int EnableMenuItem(HANDLE menu,uint uIDEnableItem,uint enable); +int EnableMouseInPointer(int enable); +int EnableNonClientDpiScaling(HANDLE hwnd); +int EnableScrollBar(HANDLE wnd,uint wSBflags,uint arrows); +int EnableWindow(HANDLE wnd,int enable); +int EndDeferWindowPos(HANDLE win_pos_info); +int EndDialog(HANDLE dlg,long result); +int EndMenu(void); +int EndPaint(HANDLE wnd,PAINTSTRUCT &paint); +int EndTask(HANDLE wnd,int shut_down,int force); +int EnumChildWindows(HANDLE wnd_parent,PVOID enum_func,PVOID param); +uint EnumClipboardFormats(uint format); +int EnumDesktopsW(HANDLE hwinsta,PVOID enum_func,PVOID param); +int EnumDesktopWindows(HANDLE desktop,PVOID lpfn,PVOID param); +int EnumDisplayDevicesW(const string device,uint dev_num,DISPLAY_DEVICEW &display_device,uint flags); +int EnumDisplayMonitors(HANDLE hdc,const RECT &clip,PVOID enum_obj,PVOID data); +int EnumDisplaySettingsExW(const string device_name,uint mode_num,DEVMODEW &dev_mode,uint flags); +int EnumDisplaySettingsW(const string device_name,uint mode_num,DEVMODEW &dev_mode); +int EnumPropsExW(HANDLE wnd,PVOID enum_func,PVOID param); +int EnumPropsW(HANDLE wnd,PVOID enum_func); +int EnumThreadWindows(uint thread_id,PVOID lpfn,PVOID param); +int EnumWindows(PVOID enum_func,PVOID param); +int EnumWindowStationsW(PVOID enum_func,PVOID param); +int EqualRect(RECT &lprc1,RECT &lprc2); +int EvaluateProximityToPolygon(uint vertices,const POINT &polygon[],const TOUCH_HIT_TESTING_INPUT &hit_testing_input[],TOUCH_HIT_TESTING_PROXIMITY_EVALUATION &proximity_eval); +int EvaluateProximityToRect(const RECT &bounding_box[],const TOUCH_HIT_TESTING_INPUT &hit_testing_input[],TOUCH_HIT_TESTING_PROXIMITY_EVALUATION &proximity_eval); +int ExcludeUpdateRgn(HANDLE hDC,HANDLE wnd); +int ExitWindowsEx(uint flags,uint reason); +int FillRect(HANDLE hDC,RECT &lprc,HANDLE hbr); +HANDLE FindWindowExW(HANDLE wnd_parent,HANDLE wnd_child_after,const string class_name,const string window); +HANDLE FindWindowW(const string class_name,const string window_name); +int FlashWindow(HANDLE wnd,int invert); +int FlashWindowEx(FLASHWINFO &pfwi); +int FrameRect(HANDLE hDC,RECT &lprc,HANDLE hbr); +HANDLE GetActiveWindow(void); +int GetAltTabInfoW(HANDLE hwnd,int item,ALTTABINFO &pati,string item_text,uint item_text); +HANDLE GetAncestor(HANDLE hwnd,uint flags); +short GetAsyncKeyState(int key); +int GetAutoRotationState(AR_STATE &state); +DPI_AWARENESS GetAwarenessFromDpiAwarenessContext(HANDLE value); +HANDLE GetCapture(void); +uint GetCaretBlinkTime(void); +int GetCaretPos(POINT &point); +int GetCIMSSM(INPUT_MESSAGE_SOURCE &message_source); +int GetClassInfoExW(HANDLE instance,const string class_name,WNDCLASSEXW &lpwcx); +int GetClassInfoW(HANDLE instance,const string class_name,WNDCLASSW &wnd_class); +ulong GetClassLongPtrW(HANDLE wnd,int index); +uint GetClassLongW(HANDLE wnd,int index); +int GetClassNameW(HANDLE wnd,ushort &class_name[],int max_count); +ushort GetClassWord(HANDLE wnd,int index); +int GetClientRect(HANDLE wnd,RECT &rect); +HANDLE GetClipboardData(uint format); +int GetClipboardFormatNameW(uint format,ushort &format_name[],int max_count); +HANDLE GetClipboardOwner(void); +uint GetClipboardSequenceNumber(void); +HANDLE GetClipboardViewer(void); +int GetClipCursor(RECT &rect); +int GetComboBoxInfo(HANDLE combo,COMBOBOXINFO &pcbi); +int GetCurrentInputMessageSource(INPUT_MESSAGE_SOURCE &message_source); +HANDLE GetCursor(void); +int GetCursorInfo(CURSORINFO &pci); +int GetCursorPos(POINT &point); +HANDLE GetDC(HANDLE wnd); +HANDLE GetDCEx(HANDLE wnd,HANDLE clip,uint flags); +HANDLE GetDesktopWindow(void); +int GetDialogBaseUnits(void); +DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS GetDialogControlDpiChangeBehavior(HANDLE wnd); +DIALOG_DPI_CHANGE_BEHAVIORS GetDialogDpiChangeBehavior(HANDLE dlg); +int GetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE &orientation); +int GetDisplayConfigBufferSizes(uint flags,uint &path_array_elements,uint &mode_info_array_elements); +int GetDlgCtrlID(HANDLE wnd); +HANDLE GetDlgItem(HANDLE dlg,int nIDDlgItem); +uint GetDlgItemInt(HANDLE dlg,int nIDDlgItem,int &translated,int signed); +uint GetDlgItemTextW(HANDLE dlg,int nIDDlgItem,string str,int max); +uint GetDoubleClickTime(void); +uint GetDpiForSystem(void); +uint GetDpiForWindow(HANDLE hwnd); +uint GetDpiFromDpiAwarenessContext(HANDLE value); +HANDLE GetFocus(void); +HANDLE GetForegroundWindow(void); +int GetGestureConfig(HANDLE hwnd,uint reserved,uint flags,uint &pcIDs,GESTURECONFIG &gesture_config[],uint size); +int GetGestureExtraArgs(HANDLE gesture_info,uint extra_args,uchar &extra_args); +int GetGestureInfo(HANDLE gesture_info,GESTUREINFO &gesture_info); +uint GetGuiResources(HANDLE process,uint flags); +int GetGUIThreadInfo(uint thread,GUITHREADINFO &pgui); +int GetIconInfo(HANDLE icon,ICONINFO &piconinfo); +int GetIconInfoExW(HANDLE hicon,ICONINFOEXW &piconinfo); +int GetInputState(void); +uint GetKBCodePage(void); +HANDLE GetKeyboardLayout(uint thread); +int GetKeyboardLayoutList(int buff,HANDLE &list[]); +int GetKeyboardLayoutNameW(ushort &pwszKLID[]); +int GetKeyboardState(uchar &key_state[]); +int GetKeyboardType(int type_flag); +int GetKeyNameTextW(long param,ushort &str[],int size); +short GetKeyState(int virt_key); +HANDLE GetLastActivePopup(HANDLE wnd); +int GetLastInputInfo(LASTINPUTINFO &plii); +int GetLayeredWindowAttributes(HANDLE hwnd,uint &key,uchar &alpha,uint &flags); +uint GetListBoxInfo(HANDLE hwnd); +HANDLE GetMenu(HANDLE wnd); +int GetMenuBarInfo(HANDLE hwnd,int object,int item,MENUBARINFO &pmbi); +int GetMenuCheckMarkDimensions(void); +uint GetMenuContextHelpId(HANDLE); +uint GetMenuDefaultItem(HANDLE menu,uint by_pos,uint flags); +int GetMenuInfo(HANDLE,MENUINFO &); +int GetMenuItemCount(HANDLE menu); +uint GetMenuItemID(HANDLE menu,int pos); +int GetMenuItemInfoW(HANDLE hmenu,uint item,int by_position,MENUITEMINFOW &lpmii); +int GetMenuItemRect(HANDLE wnd,HANDLE menu,uint item,RECT &item); +uint GetMenuState(HANDLE menu,uint id,uint flags); +int GetMenuStringW(HANDLE menu,uint uIDItem,string str,int max,uint flags); +PVOID GetMessageExtraInfo(void); +uint GetMessagePos(void); +int GetMessageTime(void); +int GetMessageW(MSG &msg,HANDLE wnd,uint msg_filter_min,uint msg_filter_max); +int GetMonitorInfoW(HANDLE monitor,MONITORINFO &lpmi); +int GetMouseMovePointsEx(uint size,MOUSEMOVEPOINT &lppt,MOUSEMOVEPOINT &buf,int buf_points,uint resolution); +HANDLE GetNextDlgGroupItem(HANDLE dlg,HANDLE ctl,int previous); +HANDLE GetNextDlgTabItem(HANDLE dlg,HANDLE ctl,int previous); +HANDLE GetOpenClipboardWindow(void); +HANDLE GetParent(HANDLE wnd); +int GetPhysicalCursorPos(POINT &point); +int GetPointerCursorId(uint pointer_id,uint &cursor_id); +int GetPointerDevice(HANDLE device,POINTER_DEVICE_INFO &device); +int GetPointerDeviceCursors(HANDLE device,uint &count,POINTER_DEVICE_CURSOR_INFO &cursors[]); +int GetPointerDeviceProperties(HANDLE device,uint &count,POINTER_DEVICE_PROPERTY &properties[]); +int GetPointerDeviceRects(HANDLE device,RECT &device_rect,RECT &rect); +int GetPointerDevices(uint &count,POINTER_DEVICE_INFO &devices[]); +int GetPointerFrameInfo(uint id,uint &count,POINTER_INFO &info[]); +int GetPointerFrameInfoHistory(uint id,uint &count,uint &count,POINTER_INFO &info[]); +int GetPointerFramePenInfo(uint id,uint &count,POINTER_PEN_INFO &info[]); +int GetPointerFramePenInfoHistory(uint id,uint &count,uint &count,POINTER_PEN_INFO &info[]); +int GetPointerFrameTouchInfo(uint id,uint &count,POINTER_TOUCH_INFO &info[]); +int GetPointerFrameTouchInfoHistory(uint id,uint &count,uint &count,POINTER_TOUCH_INFO &info[]); +int GetPointerInfo(uint id,POINTER_INFO &info[]); +int GetPointerInfoHistory(uint id,uint &count,POINTER_INFO &info[]); +int GetPointerInputTransform(uint id,uint count,INPUT_TRANSFORM &transform); +int GetPointerPenInfo(uint id,POINTER_PEN_INFO &info); +int GetPointerPenInfoHistory(uint id,uint &count,POINTER_PEN_INFO &info); +int GetPointerTouchInfo(uint id,POINTER_TOUCH_INFO &info[]); +int GetPointerTouchInfoHistory(uint id,uint &count,POINTER_TOUCH_INFO &info[]); +int GetPointerType(uint id,uint &type); +int GetPriorityClipboardFormat(uint &format_priority_list[],int formats); +int GetProcessDefaultLayout(uint &default_layout); +HANDLE GetProcessWindowStation(void); +HANDLE GetPropW(HANDLE wnd,const string str); +uint GetQueueStatus(uint flags); +uint GetRawInputBuffer(RAWINPUT &data,uint &size,uint size_header); +uint GetRawInputData(HANDLE raw_input,uint command,PVOID data,uint &size,uint size_header); +uint GetRawInputDeviceInfoW(HANDLE device,uint command,PVOID data,uint &size); +uint GetRawInputDeviceList(RAWINPUTDEVICELIST &raw_input_device_list,uint &num_devices,uint size); +int GetRawPointerDeviceData(uint id,uint count,uint count,POINTER_DEVICE_PROPERTY &properties[],int &values[]); +uint GetRegisteredRawInputDevices(RAWINPUTDEVICE &raw_input_devices,uint &num_devices,uint size); +int GetScrollBarInfo(HANDLE hwnd,int object,SCROLLBARINFO &psbi); +int GetScrollInfo(HANDLE hwnd,int bar,SCROLLINFO &lpsi); +int GetScrollPos(HANDLE wnd,int bar); +int GetScrollRange(HANDLE wnd,int bar,int &min_pos,int &max_pos); +HANDLE GetShellWindow(void); +HANDLE GetSubMenu(HANDLE menu,int pos); +uint GetSysColor(int index); +HANDLE GetSysColorBrush(int index); +uint GetSystemDpiForProcess(HANDLE process); +HANDLE GetSystemMenu(HANDLE wnd,int revert); +int GetSystemMetrics(int index); +int GetSystemMetricsForDpi(int index,uint dpi); +uint GetTabbedTextExtentW(HANDLE hdc,const string str,int count,int tab_positions,const int &tab_stop_positions[]); +HANDLE GetThreadDesktop(uint thread_id); +HANDLE GetThreadDpiAwarenessContext(void); +DPI_HOSTING_BEHAVIOR GetThreadDpiHostingBehavior(void); +int GetTitleBarInfo(HANDLE hwnd,TITLEBARINFO &pti); +HANDLE GetTopWindow(HANDLE wnd); +int GetTouchInputInfo(HANDLE touch_input,uint inputs,TOUCHINPUT &inputs,int size); +uint GetUnpredictedMessagePos(void); +int GetUpdatedClipboardFormats(uint &formats[],uint formats_number,uint &formats_out); +int GetUpdateRect(HANDLE wnd,RECT &rect,int erase); +int GetUpdateRgn(HANDLE wnd,HANDLE rgn,int erase); +int GetUserObjectInformationW(HANDLE obj,int index,PVOID info,uint length,uint &length_needed); +int GetUserObjectSecurity(HANDLE obj,uint &pSIRequested,SECURITY_DESCRIPTOR &pSID,uint length,uint &length_needed); +HANDLE GetWindow(HANDLE wnd,uint cmd); +uint GetWindowContextHelpId(HANDLE); +HANDLE GetWindowDC(HANDLE wnd); +int GetWindowDisplayAffinity(HANDLE wnd,uint &affinity); +HANDLE GetWindowDpiAwarenessContext(HANDLE hwnd); +DPI_HOSTING_BEHAVIOR GetWindowDpiHostingBehavior(HANDLE hwnd); +int GetWindowFeedbackSetting(HANDLE hwnd,FEEDBACK_TYPE feedback,uint flags,uint size,int &config); +int GetWindowInfo(HANDLE hwnd,WINDOWINFO &pwi); +long GetWindowLongPtrW(HANDLE wnd,int index); +int GetWindowLongW(HANDLE wnd,int index); +uint GetWindowModuleFileNameW(HANDLE hwnd,ushort &file_name[],uint file_name_max); +int GetWindowPlacement(HANDLE wnd,WINDOWPLACEMENT &lpwndpl); +int GetWindowRect(HANDLE wnd,RECT &rect); +int GetWindowRgn(HANDLE wnd,HANDLE rgn); +int GetWindowRgnBox(HANDLE wnd,RECT &lprc); +int GetWindowTextLengthW(HANDLE wnd); +int GetWindowTextW(HANDLE wnd,ushort &str[],int max_count); +uint GetWindowThreadProcessId(HANDLE wnd,uint &process_id); +ushort GetWindowWord(HANDLE wnd,int index); +int GrayStringW(HANDLE hDC,HANDLE brush,PVOID output_func,uchar &data[],int count,int X,int Y,int width,int height); +int GrayStringW(HANDLE hDC,HANDLE brush,PVOID output_func,PVOID data,int count,int X,int Y,int width,int height); +int HideCaret(HANDLE wnd); +int HiliteMenuItem(HANDLE wnd,HANDLE menu,uint uIDHiliteItem,uint hilite); +int InflateRect(RECT &lprc,int dx,int dy); +int InheritWindowMonitor(HANDLE hwnd,HANDLE inherit); +int InitializeTouchInjection(uint count,uint mode); +int InjectTouchInput(uint count,POINTER_TOUCH_INFO &contacts); +int InSendMessage(void); +uint InSendMessageEx(PVOID reserved); +int InsertMenuItemW(HANDLE hmenu,uint item,int by_position,const MENUITEMINFO &lpmi); +int InsertMenuW(HANDLE menu,uint position,uint flags,ulong uIDNewItem,const string new_item); +int InternalGetWindowText(HANDLE wnd,string str,int max_count); +int IntersectRect(RECT &dst,RECT &src1,RECT &src2); +int InvalidateRect(HANDLE wnd,RECT &rect,int erase); +int InvalidateRgn(HANDLE wnd,HANDLE rgn,int erase); +int InvertRect(HANDLE hDC,RECT &lprc); +int IsCharAlphaNumericW(short ch); +int IsCharAlphaW(short ch); +int IsCharLowerW(short ch); +int IsCharUpperW(short ch); +int IsChild(HANDLE wnd_parent,HANDLE wnd); +int IsClipboardFormatAvailable(uint format); +int IsDialogMessageW(HANDLE dlg,MSG &msg); +uint IsDlgButtonChecked(HANDLE dlg,int nIDButton); +int IsGUIThread(int convert); +int IsHungAppWindow(HANDLE hwnd); +int IsIconic(HANDLE wnd); +int IsImmersiveProcess(HANDLE process); +int IsMenu(HANDLE menu); +int IsMouseInPointerEnabled(void); +int IsProcessDPIAware(void); +int IsRectEmpty(RECT &lprc); +int IsTouchWindow(HANDLE hwnd,uint &flags); +int IsValidDpiAwarenessContext(HANDLE value); +int IsWindow(HANDLE wnd); +int IsWindowEnabled(HANDLE wnd); +int IsWindowUnicode(HANDLE wnd); +int IsWindowVisible(HANDLE wnd); +int IsWinEventHookInstalled(uint event); +int IsWow64Message(void); +int IsZoomed(HANDLE wnd); +void keybd_event(uchar vk,uchar scan,uint flags,ulong extra_info); +int KillTimer(HANDLE wnd,ulong uIDEvent); +HANDLE LoadAcceleratorsW(HANDLE instance,const string table_name); +HANDLE LoadBitmapW(HANDLE instance,const string bitmap_name); +HANDLE LoadCursorFromFileW(const string file_name); +HANDLE LoadCursorW(HANDLE instance,const string cursor_name); +HANDLE LoadIconW(HANDLE instance,const string icon_name); +HANDLE LoadImageW(HANDLE inst,const string name,uint type,int cx,int cy,uint load); +HANDLE LoadKeyboardLayoutW(const string pwszKLID,uint Flags); +HANDLE LoadMenuIndirectW(const PVOID menu_template); +HANDLE LoadMenuW(HANDLE instance,const string menu_name); +int LoadStringW(HANDLE instance,uint uID,string buffer,int buffer_max); +int LockSetForegroundWindow(uint lock_code); +int LockWindowUpdate(HANDLE wnd_lock); +int LockWorkStation(void); +int LogicalToPhysicalPoint(HANDLE wnd,POINT &point); +int LogicalToPhysicalPointForPerMonitorDPI(HANDLE wnd,POINT &point); +int LookupIconIdFromDirectory(uchar &presbits[],int icon); +int LookupIconIdFromDirectoryEx(uchar &presbits,int icon,int desired,int desired,uint Flags); +int MapDialogRect(HANDLE dlg,RECT &rect); +uint MapVirtualKeyExW(uint code,uint map_type,HANDLE dwhkl); +uint MapVirtualKeyW(uint code,uint map_type); +int MapWindowPoints(HANDLE wnd_from,HANDLE wnd_to,POINT &points[],uint points_count); +int MenuItemFromPoint(HANDLE wnd,HANDLE menu,POINT &screen); +int MessageBeep(uint type); +int MessageBoxExW(HANDLE wnd,const string text,const string caption,uint type,ushort language_id); +int MessageBoxIndirectW(MSGBOXPARAMSW &lpmbp); +int MessageBoxW(HANDLE wnd,const string text,const string caption,uint type); +int ModifyMenuW(HANDLE mnu,uint position,uint flags,ulong uIDNewItem,const string new_item); +HANDLE MonitorFromPoint(POINT &pt,uint flags); +HANDLE MonitorFromRect(const RECT &lprc,uint flags); +HANDLE MonitorFromWindow(HANDLE hwnd,uint flags); +void mouse_event(uint flags,uint dx,uint dy,uint data,ulong extra_info); +int MoveWindow(HANDLE wnd,int X,int Y,int width,int height,int repaint); +uint MsgWaitForMultipleObjects(uint count,const HANDLE &handles[],int wait_all,uint milliseconds,uint wake_mask); +uint MsgWaitForMultipleObjectsEx(uint count,const HANDLE &handles[],uint milliseconds,uint wake_mask,uint flags); +void NotifyWinEvent(uint event,HANDLE hwnd,int object,int child); +uint OemKeyScan(ushort oem_char); +int OemToCharBuffW(const char &src[],ushort &dst[],uint dst_length); +int OemToCharW(const char &src[],ushort &dst[]); +int OffsetRect(RECT &lprc,int dx,int dy); +int OpenClipboard(HANDLE wnd_new_owner); +HANDLE OpenDesktopW(const string desktop,uint flags,int inherit,uint desired_access); +int OpenIcon(HANDLE wnd); +HANDLE OpenInputDesktop(uint flags,int inherit,uint desired_access); +HANDLE OpenWindowStationW(const string win_sta,int inherit,uint desired_access); +PVOID PackTouchHitTestingProximityEvaluation(const TOUCH_HIT_TESTING_INPUT &hit_testing_input[],const TOUCH_HIT_TESTING_PROXIMITY_EVALUATION &proximity_eval[]); +int PaintDesktop(HANDLE hdc); +int PeekMessageW(MSG &msg,HANDLE wnd,uint msg_filter_min,uint msg_filter_max,uint remove_msg); +int PhysicalToLogicalPoint(HANDLE wnd,POINT &point); +int PhysicalToLogicalPointForPerMonitorDPI(HANDLE wnd,POINT &point); +int PostMessageW(HANDLE wnd,uint Msg,PVOID param,PVOID param); +void PostQuitMessage(int exit_code); +int PostThreadMessageW(uint thread,uint Msg,PVOID param,PVOID param); +int PrintWindow(HANDLE hwnd,HANDLE blt,uint flags); +uint PrivateExtractIconsW(const string file_name,int icon_index,int icon,int icon,HANDLE &phicon,uint &piconid,uint icons,uint flags); +int PtInRect(const RECT &lprc,long pt); +long QueryDisplayConfig(uint flags,uint &path_array_elements,DISPLAYCONFIG_PATH_INFO &array,uint &mode_info_array_elements,DISPLAYCONFIG_MODE_INFO &info_array[],DISPLAYCONFIG_TOPOLOGY_ID &topology_id); +HANDLE RealChildWindowFromPoint(HANDLE parent,long parent_client_coords); +uint RealGetWindowClassW(HANDLE hwnd,ushort &class_name[],uint class_name_max); +int RedrawWindow(HANDLE wnd,RECT &rect,HANDLE update,uint flags); +ushort RegisterClassExW(const WNDCLASSEXW &lpwcx); +ushort RegisterClassW(const WNDCLASSW &wnd_class); +uint RegisterClipboardFormatW(const string format); +PVOID RegisterDeviceNotificationW(HANDLE recipient,PVOID NotificationFilter,uint Flags); +int RegisterHotKey(HANDLE wnd,int id,uint modifiers,uint vk); +int RegisterPointerDeviceNotifications(HANDLE window,int range); +int RegisterPointerInputTarget(HANDLE hwnd,uint type); +int RegisterPointerInputTargetEx(HANDLE hwnd,uint type,int observe); +PVOID RegisterPowerSettingNotification(HANDLE recipient,const GUID &PowerSettingGuid,uint Flags); +int RegisterRawInputDevices(const RAWINPUTDEVICE &raw_input_devices[],uint num_devices,uint size); +int RegisterShellHookWindow(HANDLE hwnd); +PVOID RegisterSuspendResumeNotification(HANDLE recipient,uint Flags); +int RegisterTouchHitTestingWindow(HANDLE hwnd,uint value); +int RegisterTouchWindow(HANDLE hwnd,uint flags); +uint RegisterWindowMessageW(const string str); +int ReleaseCapture(void); +int ReleaseDC(HANDLE wnd,HANDLE hDC); +int RemoveClipboardFormatListener(HANDLE hwnd); +int RemoveMenu(HANDLE menu,uint position,uint flags); +HANDLE RemovePropW(HANDLE wnd,const string str); +int ReplyMessage(PVOID result); +int ScreenToClient(HANDLE wnd,POINT &point); +int ScrollDC(HANDLE hDC,int dx,int dy,RECT &scroll,RECT &clip,HANDLE update,RECT &update); +int ScrollWindow(HANDLE wnd,int XAmount,int YAmount,RECT &rect,RECT &clip_rect); +int ScrollWindowEx(HANDLE wnd,int dx,int dy,RECT &scroll,RECT &clip,HANDLE update,RECT &update,uint flags); +PVOID SendDlgItemMessageW(HANDLE dlg,int nIDDlgItem,uint Msg,PVOID param,PVOID param); +uint SendInput(uint inputs,INPUT &inputs[],int size); +int SendMessageCallbackW(HANDLE wnd,uint Msg,PVOID param,PVOID param,PVOID result_call_back,ulong data); +PVOID SendMessageTimeoutW(HANDLE wnd,uint Msg,PVOID param,PVOID param,uint flags,uint timeout,PVOID result); +PVOID SendMessageW(HANDLE wnd,uint Msg,PVOID param,PVOID param); +int SendNotifyMessageW(HANDLE wnd,uint Msg,PVOID param,PVOID param); +HANDLE SetActiveWindow(HANDLE wnd); +HANDLE SetCapture(HANDLE wnd); +int SetCaretBlinkTime(uint uMSeconds); +int SetCaretPos(int X,int Y); +ulong SetClassLongPtrW(HANDLE wnd,int index,long new_long); +uint SetClassLongW(HANDLE wnd,int index,int new_long); +ushort SetClassWord(HANDLE wnd,int index,ushort new_word); +HANDLE SetClipboardData(uint format,HANDLE mem); +HANDLE SetClipboardViewer(HANDLE wnd_new_viewer); +ulong SetCoalescableTimer(HANDLE wnd,ulong nIDEvent,uint elapse,PVOID timer_func,uint tolerance_delay); +HANDLE SetCursor(HANDLE cursor); +int SetCursorPos(int X,int Y); +void SetDebugErrorLevel(uint level); +int SetDialogControlDpiChangeBehavior(HANDLE wnd,DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS mask,DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS values); +int SetDialogDpiChangeBehavior(HANDLE dlg,DIALOG_DPI_CHANGE_BEHAVIORS mask,DIALOG_DPI_CHANGE_BEHAVIORS values); +int SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE orientation); +int SetDisplayConfig(uint path_array_elements,DISPLAYCONFIG_PATH_INFO &array,uint mode_info_array_elements,DISPLAYCONFIG_MODE_INFO &info_array[],uint flags); +int SetDlgItemInt(HANDLE dlg,int nIDDlgItem,uint value,int signed); +int SetDlgItemTextW(HANDLE dlg,int nIDDlgItem,const string str); +int SetDoubleClickTime(uint); +HANDLE SetFocus(HANDLE wnd); +int SetForegroundWindow(HANDLE wnd); +int SetGestureConfig(HANDLE hwnd,uint reserved,uint cIDs,GESTURECONFIG &gesture_config[],uint size); +int SetKeyboardState(uchar &key_state[]); +void SetLastErrorEx(uint err_code,uint type); +int SetLayeredWindowAttributes(HANDLE hwnd,uint key,uchar alpha,uint flags); +int SetMenu(HANDLE wnd,HANDLE menu); +int SetMenuContextHelpId(HANDLE,uint); +int SetMenuDefaultItem(HANDLE menu,uint item,uint by_pos); +int SetMenuInfo(HANDLE,const MENUINFO &); +int SetMenuItemBitmaps(HANDLE menu,uint position,uint flags,HANDLE bitmap_unchecked,HANDLE bitmap_checked); +int SetMenuItemInfoW(HANDLE hmenu,uint item,int by_positon,const MENUITEMINFOW &lpmii); +PVOID SetMessageExtraInfo(PVOID param); +int SetMessageQueue(int messages_max); +HANDLE SetParent(HANDLE wnd_child,HANDLE wnd_new_parent); +int SetPhysicalCursorPos(int X,int Y); +int SetProcessDefaultLayout(uint default_layout); +int SetProcessDPIAware(void); +int SetProcessDpiAwarenessContext(HANDLE value); +int SetProcessRestrictionExemption(int enable_exemption); +int SetProcessWindowStation(HANDLE win_sta); +int SetPropW(HANDLE wnd,const string str,HANDLE data); +int SetRect(RECT &lprc,int left,int top,int right,int bottom); +int SetRectEmpty(RECT &lprc); +int SetScrollInfo(HANDLE hwnd,int bar,const SCROLLINFO &lpsi,int redraw); +int SetScrollPos(HANDLE wnd,int bar,int pos,int redraw); +int SetScrollRange(HANDLE wnd,int bar,int min_pos,int max_pos,int redraw); +int SetSysColors(int elements_count,int &elements[],uint &rgb_values[]); +int SetSystemCursor(HANDLE hcur,uint id); +int SetThreadDesktop(HANDLE desktop); +HANDLE SetThreadDpiAwarenessContext(HANDLE context); +DPI_HOSTING_BEHAVIOR SetThreadDpiHostingBehavior(DPI_HOSTING_BEHAVIOR value); +ulong SetTimer(HANDLE wnd,ulong nIDEvent,uint elapse,PVOID timer_func); +int SetUserObjectInformationW(HANDLE obj,int index,PVOID info,uint length); +int SetUserObjectSecurity(HANDLE obj,uint pSIRequested,SECURITY_DESCRIPTOR &pSID); +int SetWindowContextHelpId(HANDLE,uint); +int SetWindowDisplayAffinity(HANDLE wnd,uint affinity); +int SetWindowFeedbackSetting(HANDLE hwnd,FEEDBACK_TYPE feedback,uint flags,uint size,PVOID configuration); +long SetWindowLongPtrW(HANDLE wnd,int index,long new_long); +int SetWindowLongW(HANDLE wnd,int index,int new_long); +int SetWindowPlacement(HANDLE wnd,WINDOWPLACEMENT &lpwndpl); +int SetWindowPos(HANDLE wnd,HANDLE wnd_insert_after,int X,int Y,int cx,int cy,uint flags); +int SetWindowRgn(HANDLE wnd,HANDLE rgn,int redraw); +HANDLE SetWindowsHookExW(int hook,PVOID lpfn,HANDLE hmod,uint thread_id); +HANDLE SetWindowsHookW(int filter_type,PVOID filter_proc); +int SetWindowTextW(HANDLE wnd,const string str); +ushort SetWindowWord(HANDLE wnd,int index,ushort &new_word); +HANDLE SetWinEventHook(uint min,uint max,HANDLE win_event_proc,PVOID win_event_proc,uint process,uint thread,uint flags); +int ShowCaret(HANDLE wnd); +int ShowCursor(int show); +int ShowOwnedPopups(HANDLE wnd,int show); +int ShowScrollBar(HANDLE wnd,int bar,int show); +int ShowWindow(HANDLE wnd,int cmd_show); +int ShowWindowAsync(HANDLE wnd,int cmd_show); +int ShutdownBlockReasonCreate(HANDLE wnd,const string reason); +int ShutdownBlockReasonDestroy(HANDLE wnd); +int ShutdownBlockReasonQuery(HANDLE wnd,string buff,uint &buff[]); +int SkipPointerFrameMessages(uint id); +int SoundSentry(void); +int SubtractRect(RECT &dst,RECT &src1,RECT &src2); +int SwapMouseButton(int swap); +int SwitchDesktop(HANDLE desktop); +void SwitchToThisWindow(HANDLE hwnd,int unknown); +int SystemParametersInfoForDpi(uint action,uint param,PVOID param,uint win_ini,uint dpi); +int SystemParametersInfoW(uint action,uint param,PVOID param,uint win_ini); +int TabbedTextOutW(HANDLE hdc,int x,int y,const string str,int count,int tab_positions,const int &tab_stop_positions[],int tab_origin); +ushort TileWindows(HANDLE parent,uint how,const RECT &rect,uint kids,const HANDLE &kids[]); +int ToAscii(uint virt_key,uint scan_code,const uchar &key_state[],ushort &symbol,uint flags); +int ToAsciiEx(uint virt_key,uint scan_code,const uchar &key_state[],ushort &symbol,uint flags,HANDLE dwhkl); +int ToUnicode(uint virt_key,uint scan_code,const uchar &key_state[],ushort &buff[],int buff_size,uint flags); +int ToUnicodeEx(uint virt_key,uint scan_code,const uchar &key_state[],ushort &buff[],int buff_size,uint flags,HANDLE dwhkl); +int TrackMouseEvent(TRACKMOUSEEVENT &event_track); +int TrackPopupMenu(HANDLE menu,uint flags,int x,int y,int reserved,HANDLE wnd,RECT &rect); +int TrackPopupMenuEx(HANDLE menu,uint flags,int x,int y,HANDLE hwnd,TPMPARAMS &lptpm); +int TranslateAcceleratorW(HANDLE wnd,HANDLE acc_table,MSG &msg); +int TranslateMDISysAccel(HANDLE wnd_client,MSG &msg); +int TranslateMessage(MSG &msg); +int UnhookWindowsHook(int code,PVOID filter_proc); +int UnhookWindowsHookEx(HANDLE hhk); +int UnhookWinEvent(HANDLE win_event_hook); +int UnionRect(RECT &dst,RECT &src1,RECT &src2); +int UnloadKeyboardLayout(HANDLE hkl); +int UnregisterClassW(const PVOID class_name,HANDLE instance); +int UnregisterClassW(const string class_name,HANDLE instance); +int UnregisterDeviceNotification(PVOID Handle); +int UnregisterHotKey(HANDLE wnd,int id); +int UnregisterPointerInputTarget(HANDLE hwnd,uint type); +int UnregisterPointerInputTargetEx(HANDLE hwnd,uint type); +int UnregisterPowerSettingNotification(PVOID Handle); +int UnregisterSuspendResumeNotification(PVOID Handle); +int UnregisterTouchWindow(HANDLE hwnd); +int UpdateLayeredWindow(HANDLE wnd,HANDLE dst,POINT &dst,SIZE &psize,HANDLE src,POINT &src,uint key,BLENDFUNCTION &pblend,uint flags); +int UpdateLayeredWindowIndirect(HANDLE wnd,const UPDATELAYEREDWINDOWINFO &pULWInfo[]); +int UpdateWindow(HANDLE wnd); +int UserHandleGrantAccess(HANDLE user_handle,HANDLE job,int grant); +int ValidateRect(HANDLE wnd,RECT &rect); +int ValidateRgn(HANDLE wnd,HANDLE rgn); +short VkKeyScanExW(ushort ch,HANDLE dwhkl); +short VkKeyScanW(ushort ch); +uint WaitForInputIdle(HANDLE process,uint milliseconds); +int WaitMessage(void); +HANDLE WindowFromDC(HANDLE hDC); +HANDLE WindowFromPhysicalPoint(long point); +HANDLE WindowFromPoint(long point); +int WinHelpW(HANDLE wnd_main,const string help,uint command,ulong data); +int wvsprintfW(ushort &[],const string,PVOID &arglist[]); +#import +//+------------------------------------------------------------------+ diff --git a/Window.mqh b/Window.mqh new file mode 100644 index 0000000..afd386b --- /dev/null +++ b/Window.mqh @@ -0,0 +1,108 @@ + + +//+------------------------------------------------------------------+ +//| ChartObjectsTxtControls.mqh | +//| Copyright 2000-2024, MetaQuotes Ltd. | +//+------------------------------------------------------------------+ +#include "ChartObject.mqh" + +// Global variable to store the edit control state +bool isEditing = false; +string textControlName = "MyText"; // Name of your text control + +//+------------------------------------------------------------------+ +//| Custom function for checking mouse over the text control | +//+------------------------------------------------------------------+ +bool IsMouseOverTextControl(int x, int y) { + // Get the position and size of the text control + long chart_id = ChartID(); + double price = Bid; // Example price, can be customized + datetime time = TimeCurrent(); // Example time, can be customized + + // Get coordinates of the text control + double textX, textY, textWidth, textHeight; + if (!ObjectGetTextControlCoordinates(chart_id, textControlName, textX, textY, textWidth, textHeight)) { + return false; // If we cannot get the coordinates, return false + } + + // Check if mouse coordinates are within the text control area + return (x >= textX && x <= textX + textWidth && y >= textY && y <= textY + textHeight); +} + +//+------------------------------------------------------------------+ +//| Function to remove focus from the text control | +//+------------------------------------------------------------------+ +void RemoveFocusFromTextControl() { + isEditing = false; // Reset editing state + // Logic to update the chart if necessary + // You may want to refresh the chart or do other operations here +} + +//+------------------------------------------------------------------+ +//| OnMouseMove event handler | +//+------------------------------------------------------------------+ +void OnMouseMove(int x, int y) { + if (!isEditing) return; // Exit if not in editing mode + + // Check if mouse is over the text control + if (!IsMouseOverTextControl(x, y)) { + // Exit edit mode + RemoveFocusFromTextControl(); + } +} + +//+------------------------------------------------------------------+ +//| OnClick event handler | +//+------------------------------------------------------------------+ +void OnClick() { + // Logic to check if the text control was clicked + if (ObjectFind(ChartID(), textControlName) != -1) { + // If clicked on the text control, set editing state + isEditing = true; + } +} + +//+------------------------------------------------------------------+ +//| Function to create the text control | +//+------------------------------------------------------------------+ +bool CreateTextControl() { + long chart_id = ChartID(); + if (!ObjectCreate(chart_id, textControlName, OBJ_TEXT, 0, TimeCurrent(), Bid)) { + return false; + } + ObjectSetInteger(chart_id, textControlName, OBJPROP_FONTSIZE, 12); + ObjectSetString(chart_id, textControlName, OBJPROP_FONT, "Arial"); + ObjectSetInteger(chart_id, textControlName, OBJPROP_COLOR, clrWhite); + ObjectSetInteger(chart_id, textControlName, OBJPROP_XSIZE, 100); // Width + ObjectSetInteger(chart_id, textControlName, OBJPROP_YSIZE, 20); // Height + return true; +} + +//+------------------------------------------------------------------+ +//| Custom function to get text control coordinates | +//+------------------------------------------------------------------+ +bool ObjectGetTextControlCoordinates(long chart_id, const string name, double &x, double &y, double &width, double &height) { + // Retrieve properties of the text object + x = ObjectGetDouble(chart_id, name, OBJPROP_X); // X position + y = ObjectGetDouble(chart_id, name, OBJPROP_Y); // Y position + width = ObjectGetInteger(chart_id, name, OBJPROP_XSIZE); // Width + height = ObjectGetInteger(chart_id, name, OBJPROP_YSIZE); // Height + return true; +} + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() { + CreateTextControl(); // Create the text control when the expert initializes + return INIT_SUCCEEDED; +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) { + ObjectDelete(ChartID(), textControlName); // Clean up text control on deinitialization +} + +//+------------------------------------------------------------------+ diff --git a/ctradestatistics.mqh b/ctradestatistics.mqh new file mode 100644 index 0000000000000000000000000000000000000000..6efc18cfe469b908da6c0df9304f867421a70610 GIT binary patch literal 68322 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 G*8c&jaT7EE literal 0 HcmV?d00001 diff --git a/jason.mqh b/jason.mqh new file mode 100644 index 0000000000000000000000000000000000000000..e56281b5127cbf0872ea194d1d4c647494573fa4 GIT binary patch literal 43822 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 +// wizard description start +//+------------------------------------------------------------------+ +//| Description of the class | +//| Title=Signal on crossing of the price and the MA | +//| entering on the back movement | +//| Type=Signal | +//| Name=Sample | +//| Class=CSampleSignal | +//| Page= | +//| Parameter=PeriodMA,int,12 | +//| Parameter=ShiftMA,int,0 | +//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA | +//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE | +//| Parameter=Limit,double,0.0 | +//| Parameter=StopLoss,double,50.0 | +//| Parameter=TakeProfit,double,50.0 | +//| Parameter=Expiration,int,10 | +//+------------------------------------------------------------------+ +// wizard description end +//+------------------------------------------------------------------+ +//| CSampleSignal. | +//| Purpose: Class of trading signal generator when price | +//| crosses moving average, | +//| entering on the subsequent back movement. | +//| It is derived from the CExpertSignal class. | +//+------------------------------------------------------------------+ +class CSampleSignal : public CExpertSignal + { +protected: + CiMA m_MA; // object to access the values of the moving average + CiOpen m_open; // object to access the bar open prices + CiClose m_close; // object to access the bar close prices + //--- Setup parameters + int m_period_ma; // averaging period of the MA + int m_shift_ma; // shift of the MA along the time axis + ENUM_MA_METHOD m_method_ma; // averaging method of the MA + ENUM_APPLIED_PRICE m_applied_ma; // averaging object of the MA + double m_limit; // level to place a pending order relative to the MA + double m_stop_loss; // level to place a stop loss order relative to the open price + double m_take_profit; // level to place a take profit order relative to the open price + int m_expiration; // lifetime of a pending order in bars + +public: + CSampleSignal(); + //--- Methods to set the parameters + void PeriodMA(int value) { m_period_ma=value; } + void ShiftMA(int value) { m_shift_ma=value; } + void MethodMA(ENUM_MA_METHOD value) { m_method_ma=value; } + void AppliedMA(ENUM_APPLIED_PRICE value) { m_applied_ma=value; } + void Limit(double value) { m_limit=value; } + void StopLoss(double value) { m_stop_loss=value; } + void TakeProfit(double value) { m_take_profit=value; } + void Expiration(int value) { m_expiration=value; } + //---Method to validate the parameters + virtual bool ValidationSettings(); + //--- Method to validate the parameters + virtual bool InitIndicators(CIndicators* indicators); + //--- Methods to generate signals to enter the market + virtual bool CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration); + virtual bool CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration); + //--- Methods to generate signals of pending order modification + virtual bool CheckTrailingOrderLong(COrderInfo* order,double& price); + virtual bool CheckTrailingOrderShort(COrderInfo* order,double& price); + +protected: + //--- Object initialization method + bool InitMA(CIndicators* indicators); + bool InitOpen(CIndicators* indicators); + bool InitClose(CIndicators* indicators); + //--- Methods to access object data + double MA(int index) { return(m_MA.Main(index)); } + double Open(int index) { return(m_open.GetData(index)); } + double Close(int index) { return(m_close.GetData(index)); } + }; +//+------------------------------------------------------------------+ +//| CSampleSignal Constructor. | +//| INPUT: No. | +//| OUTPUT: No. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +void CSampleSignal::CSampleSignal() + { +//--- Setting the default values + m_period_ma =12; + m_shift_ma =0; + m_method_ma =MODE_EMA; + m_applied_ma =PRICE_CLOSE; + m_limit =0.0; + m_stop_loss =50.0; + m_take_profit=50.0; + m_expiration =10; + } +//+------------------------------------------------------------------+ +//| Validation of parameters. | +//| INPUT: No. | +//| OUTPUT: true if the settings are correct, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::ValidationSettings() + { +//--- Validation of parameters + if(m_period_ma<=0) + { + printf(__FUNCTION__+": the MA period must be greater than zero"); + return(false); + } +//--- Successful completion + return(true); + } +//+------------------------------------------------------------------+ +//| Initialization of indicators and timeseries. | +//| INPUT: indicators - pointer to the object - collection of | +//| indicators and timeseries. | +//| OUTPUT: true in case of success, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::InitIndicators(CIndicators* indicators) + { +//--- Validation of the pointer + if(indicators==NULL) return(false); +//--- Initialization of the moving average + if(!InitMA(indicators)) return(false); +//--- Initialization of the timeseries of open prices + if(!InitOpen(indicators)) return(false); +//--- Initialization of the timeseries of close prices + if(!InitClose(indicators)) return(false); +//--- Successful completion + return(true); + } +//+------------------------------------------------------------------+ +//| Initialization of the moving average | +//| INPUT: indicators - pointer to the object - collection of | +//| indicators and timeseries. | +//| OUTPUT: true in case of success, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::InitMA(CIndicators* indicators) + { +//--- Initialization of the MA object + if(!m_MA.Create(m_symbol.Name(),m_period,m_period_ma,m_shift_ma,m_method_ma,m_applied_ma)) + { + printf(__FUNCTION__+": object initialization error"); + return(false); + } + m_MA.BufferResize(3+m_shift_ma); +//--- Adding an object to the collection + if(!indicators.Add(GetPointer(m_MA))) + { + printf(__FUNCTION__+": object adding error"); + return(false); + } +//--- Successful completion + return(true); + } +//+------------------------------------------------------------------+ +//| Initialization of the timeseries of open prices. | +//| INPUT: indicators - pointer to the object - collection of | +//| indicators and timeseries. | +//| OUTPUT: true in case of success, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::InitOpen(CIndicators* indicators) + { +//--- Initialization of the timeseries object + if(!m_open.Create(m_symbol.Name(),m_period)) + { + printf(__FUNCTION__+": object initialization error"); + return(false); + } +//--- Adding an object to the collection + if(!indicators.Add(GetPointer(m_open))) + { + printf(__FUNCTION__+": object adding error"); + return(false); + } +//--- Successful completion + return(true); + } +//+------------------------------------------------------------------+ +//| Initialization of the timeseries of close prices. | +//| INPUT: indicators - pointer to the object - collection of | +//| indicators and timeseries. | +//| OUTPUT: true in case of success, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::InitClose(CIndicators* indicators) + { +//--- Initialization of the timeseries object + if(!m_close.Create(m_symbol.Name(),m_period)) + { + printf(__FUNCTION__+": object initialization error"); + return(false); + } +//--- Adding an object to the collection + if(!indicators.Add(GetPointer(m_close))) + { + printf(__FUNCTION__+": object adding error"); + return(false); + } +//--- Successful completion + return(true); + } +//+------------------------------------------------------------------+ +//| Check whether a Buy condition is fulfilled | +//| INPUT: price - variable for open price | +//| sl - variable for stop loss price, | +//| tp - variable for take profit price | +//| expiration - variable for expiration time. | +//| OUTPUT: true if the condition is fulfilled, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) + { +//--- Preparing the data + double spread=m_symbol.Ask()-m_symbol.Bid(); + double ma =MA(1); + double unit =PriceLevelUnit(); +//--- Checking the condition + if(Open(1)ma && ma>MA(2)) + { + price=m_symbol.NormalizePrice(ma-m_limit*unit+spread); + sl =m_symbol.NormalizePrice(price-m_stop_loss*unit); + tp =m_symbol.NormalizePrice(price+m_take_profit*unit); + expiration+=m_expiration*PeriodSeconds(m_period); + //--- Condition is fulfilled + return(true); + } +//--- Condition is not fulfilled + return(false); + } +//+------------------------------------------------------------------+ +//| Check whether a Sell condition is fulfilled. | +//| INPUT: price - variable for open price, | +//| sl - variable for stop loss, | +//| tp - variable for take profit | +//| expiration - variable for expiration time. | +//| OUTPUT: true if the condition is fulfilled, otherwise false. | +//| REMARK: No. | +//+------------------------------------------------------------------+ +bool CSampleSignal::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) + { +//--- Preparing the data + double ma =MA(1); + double unit=PriceLevelUnit(); +//--- Checking the condition + if(Open(1)>ma && Close(1)Open[bar]) return(High[bar]); + else + { + if(Close[bar]Open[bar])return((High[bar]+Close[bar])/2.0); + else + { + if(Close[bar]Open[bar]) res=(res+High[bar])/2; + if(Close[bar]==Open[bar]) res=(res+Close[bar])/2; + return(((res-Low[bar])+(res-High[bar]))/2); + } + //---- + default: return(Close[bar]); + } +//----+ +//return(0); + } +//+X================================================================X+ +//| iPriceSeries() function | +//+X================================================================X+ +double iPriceSeries +( + string symbol,// Символьное имя инструмента. NULL означает текущий символ. + ENUM_TIMEFRAMES timeframe,// Период. Может быть одним из периодов графика. 0 означает период текущего графика. + uint applied_price,// Ценовая константа + uint bar,// Индекс сдвига относительно текущего бара на указанное количество периодов назад или вперёд). + bool set // Направление индексирования массивов. + ) +//iPriceSeries(symbol, timeframe, applied_price, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + uint Bar; + double diPriceSeries,price[1]; +//---- + if(!set) + Bar=Bars(symbol,timeframe)-1-bar; + else Bar=bar; +//---- + switch(applied_price) + { + case 1: CopyClose(symbol, timeframe, Bar, 1, price); diPriceSeries = price[0]; break; + case 2: CopyOpen (symbol, timeframe, Bar, 1, price); diPriceSeries = price[0]; break; + case 3: CopyHigh (symbol, timeframe, Bar, 1, price); diPriceSeries = price[0]; break; + case 4: CopyLow (symbol, timeframe, Bar, 1, price); diPriceSeries = price[0]; break; + //---- + case 5: CopyHigh(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]; + CopyLow(symbol,timeframe,Bar,1,price); diPriceSeries+=price[0]; + diPriceSeries/=2.0; + break; + //---- + case 6: CopyClose(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]; + CopyHigh (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + CopyLow (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + diPriceSeries/=3.0; + break; + //---- + case 7: CopyClose(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]*2; + CopyHigh (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + CopyLow (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + diPriceSeries/=4.0; + break; + + //---- + case 8: CopyClose(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]; + CopyOpen(symbol,timeframe,Bar,1,price); diPriceSeries+=price[0]; + diPriceSeries/=2.0; + break; + //---- + case 9: CopyClose(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]; + CopyOpen (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + CopyHigh (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + CopyLow (symbol, timeframe, Bar, 1, price); diPriceSeries += price[0]; + diPriceSeries/=4.0; + break; + //---- + case 10: + { + double Open_[1],Low_[1],High_[1],Close_[1]; + //---- + CopyClose(symbol,timeframe,Bar,1,Close_); + CopyOpen(symbol,timeframe,Bar,1,Open_); + CopyHigh(symbol,timeframe,Bar,1,High_); + CopyLow(symbol,timeframe,Bar,1,Low_); + //---- + if(Close_[0]>Open_[0])diPriceSeries=High_[0]; + else + { + if(Close_[0]Open_[0])diPriceSeries=(High_[0]+Close_[0])/2.0; + else + { + if(Close_[0]Open_[0]) res=(res+High_[0])/2; + if(Close_[0]==Open_[0]) res=(res+Close_[0])/2; + diPriceSeries=((res-Low_[0])+(res-High_[0]))/2; + break; + } + //---- + default: CopyClose(symbol,timeframe,Bar,1,price); diPriceSeries=price[0]; break; + } +//----+ + return(diPriceSeries); + } +//+X================================================================X+ +//| bPriceSeries() function | +//+X================================================================X+ +bool bPriceSeries +( + string symbol,// Символьное имя инструмента. NULL означает текущий символ. + ENUM_TIMEFRAMES timeframe,// Период. Может быть одним из периодов графика. 0 означает период текущего графика. + int rates_total,// количество истории в барах на текущем тике (если параметр set равен true, + // то значение параметра не нужно в расчёте функции и может быть равным 0) + uint applied_price,// Ценовая константа + uint bar, // Индекс сдвига относительно текущего бара на указанное количество периодов назад или вперёд). + bool set, // Направление индексирования массивов. + double &Price_ // возврат по ссылке полученного значения + ) +//bPriceSeries(symbol, timeframe, int rates_total, applied_price, bar, set, Price_) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + uint Bar; + double series[]; + ArraySetAsSeries(series,true); +//---- + if(!set) + Bar=rates_total-1-bar; + else Bar=bar; +//---- + switch(applied_price) + { + case 1: if(CopyClose(symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ = series[0]; break; + case 2: if(CopyOpen (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ = series[0]; break; + case 3: if(CopyHigh (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ = series[0]; break; + case 4: if(CopyLow (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ = series[0]; break; + //---- + case 5: if(CopyHigh(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]; + if(CopyLow(symbol,timeframe,Bar,1,series)<0) return(false); Price_+=series[0]; + Price_/=2.0; + break; + //---- + case 6: if(CopyClose(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]; + if(CopyHigh (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + if(CopyLow (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + Price_/=3.0; + break; + //---- + case 7: if(CopyClose(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]*2; + if(CopyHigh (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + if(CopyLow (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + Price_/=4.0; + break; + + //---- + case 8: if(CopyClose(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]; + if(CopyOpen(symbol,timeframe,Bar,1,series)<0) return(false); Price_+=series[0]; + Price_/=2.0; + break; + //---- + case 9: if(CopyClose(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]; + if(CopyOpen (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + if(CopyHigh (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + if(CopyLow (symbol, timeframe, Bar, 1, series) < 0) return(false); Price_ += series[0]; + Price_/=4.0; + break; + //---- + case 10: + { + double Open_[1],Low_[1],High_[1],Close_[1]; + //---- + if(CopyClose(symbol, timeframe, Bar, 1, Close_) < 0) return(false); + if(CopyOpen (symbol, timeframe, Bar, 1, Open_ ) < 0) return(false); + if(CopyHigh (symbol, timeframe, Bar, 1, High_ ) < 0) return(false); + if(CopyLow (symbol, timeframe, Bar, 1, Low_ ) < 0) return(false); + //---- + if(Close_[0]>Open_[0])Price_=High_[0]; + else + { + if(Close_[0]Open_[0])Price_=(High_[0]+Close_[0])/2.0; + else + { + if(Close_[0]Open_[0]) res=(res+High_[0])/2; + if(Close_[0]==Open_[0]) res=(res+Close_[0])/2; + Price_=((res-Low_[0])+(res-High_[0]))/2; + break; + } + //---- + default: if(CopyClose(symbol,timeframe,Bar,1,series)<0) return(false); Price_=series[0]; break; + } +//----+ + return(true); + } +//+X================================================================X+ +//| bPriceSeriesOnArray() function | +//+X================================================================X+ +bool bPriceSeriesOnArray +( + string symbol,// Символьное имя инструмента. NULL означает текущий символ. + ENUM_TIMEFRAMES timeframe,// Период. Может быть одним из периодов графика. 0 означает период текущего графика. + uint applied_price,// Ценовая константа + int start_pos,// Номер первого копируемого элемента + int count,// Количество копируемых элементов + double &series[]// массив, куда будут скопированы данные + ) +//bPriceSeriesOnArray(symbol, timeframe, applied_price, start_pos, count, Array) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + ArraySetAsSeries(series,true); + + switch(applied_price) + { + case 1: if(CopyClose(symbol, timeframe, start_pos, count, series) < 0) return(false); break; + case 2: if(CopyOpen (symbol, timeframe, start_pos, count, series) < 0) return(false); break; + case 3: if(CopyHigh (symbol, timeframe, start_pos, count, series) < 0) return(false); break; + case 4: if(CopyLow (symbol, timeframe, start_pos, count, series) < 0) return(false); break; + //---- + case 5: + { + double Low_[]; + ArraySetAsSeries(Low_,true); + if(CopyHigh(symbol, timeframe, start_pos, count, series) < 0) return(false); + if(CopyLow (symbol, timeframe, start_pos, count, Low_ ) < 0) return(false); + + for(int kkk=start_pos; kkkOpen_[kkk]) series[kkk]=High_[kkk]; + else + { + if(series[kkk]Open_[kkk]) series[kkk]=(High_[kkk]+series[kkk])/2.0; + else + { + if(series[kkk]Open_[kkk]) res=(res+High_[kkk])/2; + if(series[kkk]==Open_[kkk]) res=(res+series[kkk])/2; + series[kkk]=((res-Low_[kkk])+(res-High_[kkk]))/2; + } + break; + } + //---- + default: if(CopyClose(symbol,timeframe,start_pos,count,series)<0) return(false); + } +//----+ + return(true); + } +//+X================================================================X+ +//| iPriceSeriesAlert() function | +//+X================================================================X+ +/* + * Функция iPriceSeriesAlert() предназначена для индикации недопустимого + * значения параметра applied_price передаваемого в функцию iPriceSeries(). + */ +void iPriceSeriesAlert(uchar applied_price) + { +//----+ + if(applied_price<1) + Alert("Параметр applied_price должен быть не менее 1. Вы ввели недопустимое ", + applied_price," будет использовано 1"); +//----+ + if(applied_price>12) + Alert("Параметр applied_price должен быть не более 12. Вы ввели недопустимое ", + applied_price," будет использовано 1"); +//----+ + } +//+X================================================================X+ +//| Классические алгоритмы усреднения | +//+X================================================================X+ +double CMoving_Average::MASeries +( + uint begin,// номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Length,// Период усреднения + ENUM_MA_METHOD MA_Method,// Метод усреднения (MODE_SMA, MODE_EMA, MODE_SMMA, MODE_LWMA) + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов. + ) +// MASeries(begin, prev_calculated, Length, MA_Method, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + switch(MA_Method) + { + case MODE_SMA: return(SMASeries (begin, prev_calculated, rates_total, Length, series, bar, set)); + case MODE_EMA: return(EMASeries (begin, prev_calculated, rates_total, Length, series, bar, set)); + case MODE_SMMA: return(SMMASeries(begin, prev_calculated, rates_total, Length, series, bar, set)); + case MODE_LWMA: return(LWMASeries(begin, prev_calculated, rates_total, Length, series, bar, set)); + default: + { + if(bar==begin) + { + string word; + StringConcatenate(word,__FUNCTION__,"():", + " Параметр MA_Method должен быть от MODE_SMA до MODE_LWMA.", + " Вы ввели недопустимое ",MA_Method," будет использовано MODE_SMA!"); + Print(word); + } + return(SMASeries(begin,prev_calculated,rates_total,Length,series,bar,set)); + } + } +//----+ + } +//+X================================================================X+ +//| Простое усреднение | +//+X================================================================X+ +double CMoving_Average::SMASeries +( + uint begin,// Номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Length,// Период усреднения + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов + ) +// SMASeries(begin, prev_calculated, rates_total, Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ Проверка начала достоверного отсчёта баров + if(BarCheck1(begin,bar,set)) return(EMPTY_VALUE); + +//----+ Объявление локальных переменных + int iii,kkk; + double sma; + +//----+ проверка внешего параметра Length на корректность + LengthCheck(Length); + +//----+ Изменение размеров массива переменных + if(bar==begin && !SeriesArrayResize(__FUNCTION__,Length,m_SeriesArray,m_Size_)) + return(EMPTY_VALUE); + +//----+ перестановка и инициализация ячеек массива m_SeriesArray + Recount_ArrayZeroPos(m_count,Length,prev_calculated,rates_total,series,bar,m_SeriesArray,set); + +//----+ Инициализация нуля + if(BarCheck2(begin,bar,set,Length)) + { + m_sum=0.0; + + for(iii=1; iii>> + if(m_Loop1>30) + { + if(!m_start) + { + m_start= true; + shift1 = 1; + back=29; + //---- + m_ser2 = m_array[1]; + m_ser1 = m_ser2; + } + else back=0; + //-S-S-S-S-+ + for(int rrr=back; rrr>=0; rrr--) + { + if(rrr==0) + ser0=series; + else ser0=m_array[31-rrr]; + //---- + dser1 = ser0 - m_ser1; + dser2 = ser0 - m_ser2; + //---- + if(MathAbs(dser1)>MathAbs(dser2)) + m_var2=MathAbs(dser1); + else m_var2=MathAbs(dser2); + //---- + Res=m_var2; + newvel=Res+0.0000000001; + + if(m_count1<=1) + m_count1=127; + else m_count1--; + //---- + if(m_count2<=1) + m_count2=10; + else m_count2--; + //---- + if(m_count3<128) m_count3++; + //---- + m_Sum1+=newvel-m_hoop2[m_count2]; + //---- + m_hoop2[m_count2]=newvel; + m_bhoop2[m_count2]=true; + //---- + if(m_count3>10) + SmVel=m_Sum1/10.0; + else SmVel=m_Sum1/m_count3; + //---- + if(m_count3>127) + { + hoop1=m_hoop1[m_count1]; + m_hoop1[m_count1]=SmVel; + m_bhoop1[m_count1]=true; + numb = 64; + posB = numb; + //---- + while(numb>1) + { + if(m_data[posB]127) + { + m_midd2--; + posB=m_midd2; + } + else + { + m_midd1++; + posB=m_midd1; + } + //---- + if(m_midd1>96) + m_pos2=96; + else m_pos2=m_midd1; + //---- + if(m_midd2<32) + m_pos1=32; + else m_pos1=m_midd2; + } + //---- + numb = 64; + posA = numb; + //---- + while(numb>1) + { + if(m_data[posA]>=SmVel) + { + if(m_data[posA-1]<=SmVel) numb=1; + else + { + numb /= 2.0; + posA -= numb; + } + } + else + { + numb /= 2.0; + posA += numb; + } + //---- + if(posA==127) + if(SmVel>m_data[127]) posA=128; + } + //---- + if(m_count3>127) + { + if(posB>=posA) + { + if(m_pos2+1>posA) + if(m_pos1-1posA) + if(m_pos1-1=posA) + { + if(m_pos2+1posB) + m_Sum2+=m_data[m_pos2+1]; + } + else if(m_pos2+2>posA) m_Sum2+=SmVel; + //---- + else if(m_pos2+1posB) + m_Sum2+=m_data[m_pos2+1]; + //---- + if(posB>posA) + { + if(m_pos1-1posB) + m_Sum2-=m_data[posB]; + //---- + else if(m_pos2posA) + m_Sum2-=m_data[m_pos2]; + } + else + { + if(m_pos2+1>posB && m_pos1-1posB) + if(m_pos1-0=posA; numb--) + { + m_data[numb+1]=m_data[numb]; + m_bdata[numb+1]=true; + } + //---- + m_data[posA]=SmVel; + m_bdata[posA]=true; + } + //---- + if(m_count3<=127) + { + m_Sum2=0; + for(numb=m_pos1; numb<=m_pos2; numb++) + m_Sum2+=m_data[numb]; + } + //---- + resalt=m_Sum2/(m_pos2-m_pos1+1.0); + //---- + if(m_Loop2>30) + m_Loop2=31; + else m_Loop2++; + //---- + if(m_Loop2<=30) + { + if(dser1>0.0) + m_ser1=ser0; + else m_ser1=ser0-dser1*m_Kct; + //---- + if(dser2<0.0) + m_ser2=ser0; + else m_ser2=ser0-dser2*m_Kct; + //---- + m_JMA=series; + //---- + if(m_Loop2!=30) continue; + else + { + m_storage1=series; + if(MathCeil(m_Krx)>=1) + dSupr=MathCeil(m_Krx); + else dSupr=1.0; + //---- + if(dSupr>0) Suprem2=MathFloor(dSupr); + else + { + if(dSupr<0) + Suprem2=MathCeil(dSupr); + else Suprem2=0.0; + } + //---- + if(MathFloor(m_Krx)>=1) + m_var2=MathFloor(m_Krx); + else m_var2=1.0; + //---- + if(m_var2>0) Suprem1=MathFloor(m_var2); + else + { + if(m_var2<0) + Suprem1=MathCeil(m_var2); + else Suprem1=0.0; + } + //---- + if(Suprem2==Suprem1) factor=1.0; + else + { + dSupr=Suprem2-Suprem1; + factor=(m_Krx-Suprem1)/dSupr; + } + //---- + if(Suprem1<=29) + shift1=(int)Suprem1; + else shift1=29; + //---- + if(Suprem2<=29) + shift2=(int)Suprem2; + else shift2=29; + + dser3 = series - m_array[m_Loop1 - shift1]; + dser4 = series - m_array[m_Loop1 - shift2]; + //---- + m_djma=dser3 *(1.0-factor)/Suprem1+dser4*factor/Suprem2; + } + } + else + { + if(resalt) ResPow=MathPow(Res/resalt,m_degree); + else ResPow=0.0; + //---- + if(m_Kfd>=ResPow) + m_var1= ResPow; + else m_var1=m_Kfd; + //---- + if(m_var1<1.0)m_var2=1.0; + else + { + if(m_Kfd>=ResPow) + m_sense=ResPow; + else m_sense=m_Kfd; + + m_var2=m_sense; + } + //---- + extent=m_var2; + Pow1=MathPow(m_Kct,MathSqrt(extent)); + //---- + if(dser1>0.0) + m_ser1=ser0; + else m_ser1=ser0-dser1*Pow1; + //---- + if(dser2<0.0) + m_ser2=ser0; + else m_ser2=ser0-dser2*Pow1; + } + } + //---- + if(m_Loop2>30) + { + Pow2=MathPow(m_Krj,extent); + //---- + m_storage1 *= Pow2; + m_storage1 += (1.0 - Pow2) * series; + m_storage2 *= m_Krj; + m_storage2 += (series - m_storage1) * (1.0 - m_Krj); + //---- + Extr=m_Phase*m_storage2+m_storage1; + //---- + Pow2x2= Pow2 * Pow2; + ratio = Pow2x2-2.0 * Pow2+1.0; + m_djma *= Pow2x2; + m_djma += (Extr - m_JMA) * ratio; + //---- + m_JMA+=m_djma; + } + } +//-x-x-x-x-x-x-x-+ + + if(m_Loop1<=30) return(EMPTY_VALUE); + jjma=m_JMA; + +//----+ Восстановление значений переменных + if(BarCheck5(rates_total,bar,set)) + { + //---- Восстановление изменённых ячеек массивов из пямяти + for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1[numb] = m_hoop1_[numb]; + for(numb = 0; numb < 11; numb++) if(m_bhoop2[numb]) m_hoop2[numb] = m_hoop2_[numb]; + for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data [numb] = m_data_ [numb]; + + //---- Обнуление номеров изменённых ячеек массивов + ArrayInitialize(m_bhoop1,false); + ArrayInitialize(m_bhoop2,false); + ArrayInitialize(m_bdata,false); + + //---- запись значений переменных из пямяти + m_JMA=m_JMA_; + m_djma = m_djma_; + m_ser1 = m_ser1_; + m_ser2 = m_ser2_; + m_Sum2 = m_Sum2_; + m_pos1 = m_pos1_; + m_pos2 = m_pos2_; + m_Sum1 = m_Sum1_; + m_Loop1 = m_Loop1_; + m_Loop2 = m_Loop2_; + m_count1 = m_count1_; + m_count2 = m_count2_; + m_count3 = m_count3_; + m_storage1 = m_storage1_; + m_storage2 = m_storage2_; + m_midd1 = m_midd1_; + m_midd2 = m_midd2_; + } + +//----+ Сохранение значений переменных + if(BarCheck4(rates_total,bar,set)) + { + //---- запись изменённых ячеек массивов в пямять + for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1_[numb] = m_hoop1[numb]; + for(numb = 0; numb < 11; numb++) if(m_bhoop2[numb]) m_hoop2_[numb] = m_hoop2[numb]; + for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data_ [numb] = m_data [numb]; + + //---- Обнуление номеров изменённых ячеек массивов + ArrayInitialize(m_bhoop1,false); + ArrayInitialize(m_bhoop2,false); + ArrayInitialize(m_bdata,false); + + //---- запись значений переменных в пямять + m_JMA_=m_JMA; + m_djma_ = m_djma; + m_Sum2_ = m_Sum2; + m_ser1_ = m_ser1; + m_ser2_ = m_ser2; + m_pos1_ = m_pos1; + m_pos2_ = m_pos2; + m_Sum1_ = m_Sum1; + m_Loop1_ = m_Loop1; + m_Loop2_ = m_Loop2; + m_count1_ = m_count1; + m_count2_ = m_count2; + m_count3_ = m_count3; + m_storage1_ = m_storage1; + m_storage2_ = m_storage2; + m_midd1_ = m_midd1; + m_midd2_ = m_midd2; + } + +//----+ Завершение вычислений функции JMASeries() + return(jjma); + } +//+X================================================================X+ +//| Инициализация переменных алгоритма JMA | +//+X================================================================X+ +void CJJMA::JJMAInit +( + uint begin, + int Din, + double Phase, + double Length, + double series, + uint bar + ) +// JMAInit(begin, Din, Phase, Length, series, bar) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//----+ <<< Расчёт коэффициентов >>> + if(bar==begin || Din!=0) + { + if(bar==begin) + { + m_midd1 = 63; + m_midd2 = 64; + m_start = false; + + //---- + for(int numb = 0; numb <= m_midd1; numb++) m_data[numb] = -1000000.0; + for(int numb = m_midd2; numb <= 127; numb++) m_data[numb] = +1000000.0; + + //----+ Все ячейки массивов должны быть переписаны + ArrayInitialize(m_bhoop1,true); + ArrayInitialize(m_bhoop2,true); + ArrayInitialize(m_bdata,true); + + //----+ Удаление мусора из массивов при повторных инициализациях + ArrayInitialize(m_hoop1_, 0.0); + ArrayInitialize(m_hoop2_, 0.0); + ArrayInitialize(m_hoop1, 0.0); + ArrayInitialize(m_hoop2, 0.0); + ArrayInitialize(m_array, 0.0); + //---- + m_djma = 0.0; + m_Sum1 = 0.0; + m_Sum2 = 0.0; + m_ser1 = 0.0; + m_ser2 = 0.0; + m_pos1 = 0.0; + m_pos2 = 0.0; + m_Loop1 = 0.0; + m_Loop2 = 0.0; + m_count1 = 0.0; + m_count2 = 0.0; + m_count3 = 0.0; + m_storage1 = 0.0; + m_storage2 = 0.0; + m_JMA=series; + } + + if(Phase>=-100 && Phase<=100) + m_Phase=Phase/100.0+1.5; + //---- + if(Phase > +100) m_Phase = 2.5; + if(Phase < -100) m_Phase = 0.5; + //---- + double velA,velB,velC,velD; + //---- + if(Length>=1.0000000002) + velA=(Length-1.0)/2.0; + else velA=0.0000000001; + //---- + velA *= 0.9; + m_Krj = velA / (velA + 2.0); + velC = MathSqrt(velA); + velD = MathLog(velC); + m_var1= velD; + m_var2= m_var1; + //---- + velB=MathLog(2.0); + m_sense=(m_var2/velB)+2.0; + if(m_sense<0.0) m_sense=0.0; + m_Kfd=m_sense; + //---- + if(m_Kfd>=2.5) + m_degree=m_Kfd-2.0; + else m_degree=0.5; + //---- + m_Krx = velC * m_Kfd; + m_Kct = m_Krx / (m_Krx + 1.0); + } +//----+ + } +//+X================================================================X+ +//| Проверка глубины усреднения Lengt на корректность | +//+X================================================================X+ +void CJJMA::JJMALengthCheck(string LengthName,int ExternLength) + +// Jm_JMALengthCheck(LengthName, ExternLength) + { +//----+ +//---- сброс сообщений при недопустимых значениях входных параметров + if(ExternLength<1) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",LengthName, + " должен быть не менее 1. Вы ввели недопустимое ", + ExternLength," будет использовано 1"); + Print(word); + return; + } +//----+ + } +//+X================================================================X+ +//| Проверка параметра усреднения Phase на корректность | +//+X================================================================X+ +void CJJMA::JJMAPhaseCheck(string PhaseName,int ExternPhase) + +// Jm_JMAPhaseCheck(PhaseName, ExternPhase) + { +//----+ +//---- сброс сообщений при недопустимых значениях входных параметров + if(ExternPhase<-100) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не менее -100. Вы ввели недопустимое ", + ExternPhase," будет использовано -100"); + Print(word); + return; + } +//---- + if(ExternPhase>+100) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не более +100. Вы ввели недопустимое ", + ExternPhase," будет использовано +100"); + Print(word); + return; + } +//----+ + } +//+X================================================================X+ +//| T3 усреднение | +//+X================================================================X+ +double CT3::T3Series +( + uint begin,// номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Din,// разрешение изменять параметр Length на каждом баре. + // 0 - запрет изменения параметров, любое другое значение - разрешение. + double Curvature,// Коэффициент (для удобства его величина измерения увеличина в сто раз!) + double Length,// глубина сглаживания + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов. + ) +// T3Series(begin, prev_calculated, rates_total, Din, Curvature, Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//---- Проверка начала достоверного отсчёта баров + if(BarCheck1(begin,bar,set)) return(EMPTY_VALUE); + +//----+ Объявление локальных переменных + double e0,T3_; + +//----+ проверка внешего параметра Length на корректность + LengthCheck(Length); + +//----+ Расчёт коэффициентов + T3Init(begin,Din,Curvature,Length,series,bar); + + e0=series; +//----+ <<< вычисление T3 >>> + m_e1 = m_w1 * e0 + m_w2 * m_e1; + m_e2 = m_w1 * m_e1 + m_w2 * m_e2; + m_e3 = m_w1 * m_e2 + m_w2 * m_e3; + m_e4 = m_w1 * m_e3 + m_w2 * m_e4; + m_e5 = m_w1 * m_e4 + m_w2 * m_e5; + m_e6 = m_w1 * m_e5 + m_w2 * m_e6; +//---- + T3_=m_c1*m_e6+m_c2*m_e5+m_c3*m_e4+m_c4*m_e3; + +//----+ Восстановление значений переменных + if(BarCheck5(rates_total,bar,set)) + { + m_e1 = m_E1; + m_e2 = m_E2; + m_e3 = m_E3; + m_e4 = m_E4; + m_e5 = m_E5; + m_e6 = m_E6; + } + +//----+ Сохранение значений переменных + if(BarCheck4(rates_total,bar,set)) + { + + m_E1 = m_e1; + m_E2 = m_e2; + m_E3 = m_e3; + m_E4 = m_e4; + m_E5 = m_e5; + m_E6 = m_e6; + } + +//----+ завершение вычислений значения функции T3Series() + return(T3_); + } +//+X================================================================X+ +//| Инициализация переменных алгоритма T3 | +//+X================================================================X+ +void CT3::T3Init +( + uint begin, + int Din, + double Curvature, + double Length, + double series, + uint bar + ) +// T3InitInit(begin, Din, Curvature, Length, series, bar) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//----+ <<< Расчёт коэффициентов >>> + if(bar==begin || Din!=0) + { + double b=Curvature/100.0; + m_b2 = b * b; + m_b3 = m_b2 * b; + m_c1 = -m_b3; + m_c2 = (3 * (m_b2 + m_b3)); + m_c3 = -3 * (2 * m_b2 + b + m_b3); + m_c4 = (1 + 3 * b + m_b3 + 3 * m_b2); + double n=1+0.5 *(Length-1); + m_w1 = 2 / (n + 1); + m_w2 = 1 - m_w1; + + if(bar==begin) + { + m_e1 = series; + m_e2 = series; + m_e3 = series; + m_e4 = series; + m_e5 = series; + m_e6 = series; + } + } +//----+ + } +//+X================================================================X+ +//| Ультралинейное усреднение | +//+X================================================================X+ +double CJurX::JurXSeries +( + uint begin,// номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Din,// разрешение изменять параметр Length на каждом баре + // 0 - запрет изменения параметров, любое другое значение - разрешение + double Length,// глубина сглаживания + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов. + ) +// JurXSeries(begin, prev_calculated, rates_total, Din, Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//---- Проверка начала достоверного отсчёта баров + if(BarCheck1(begin,bar,set)) return(EMPTY_VALUE); + +//----+ Объявление локальных переменных + double V1,V2,JurX_; + +//----+ проверка внешего параметра Length на корректность + LengthCheck(Length); + +//----+ Инициализация коэффициентов + JurXInit(begin,Din,Length,series,bar); + +//---- <<< вычисление JurX >>> + m_f1 = m_Hg * m_f1 + m_Kg * series; + m_f2 = m_Kg * m_f1 + m_Hg * m_f2; + V1 = m_AC * m_f1 - m_AB * m_f2; + m_f3 = m_Hg * m_f3 + m_Kg * V1; + m_f4 = m_Kg * m_f3 + m_Hg * m_f4; + V2 = m_AC * m_f3 - m_AB * m_f4; + m_f5 = m_Hg * m_f5 + m_Kg * V2; + m_f6 = m_Kg * m_f5 + m_Hg * m_f6; + JurX_ = m_AC * m_f5 - m_AB * m_f6; + +//----+ Восстановление значений переменных + if(BarCheck5(rates_total,bar,set)) + { + m_f1 = m_F1; + m_f2 = m_F2; + m_f3 = m_F3; + m_f4 = m_F4; + m_f5 = m_F5; + m_f6 = m_F6; + } + +//----+ Сохранение значений переменных + if(BarCheck4(rates_total,bar,set)) + { + m_F1 = m_f1; + m_F2 = m_f2; + m_F3 = m_f3; + m_F4 = m_f4; + m_F5 = m_f5; + m_F6 = m_f6; + } + +//----+ завершение вычислений значения функции JurX.Series + return(JurX_); + + } +//+X================================================================X+ +//| Инициализация переменных алгоритма JurX | +//+X================================================================X+ +void CJurX::JurXInit +( + uint begin, + int Din, + double Length, + double series, + uint bar + ) +// JurXInit(begin, Din, Length, series, bar) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + if(bar==begin || Din!=0) + { + if(Length>=6) + m_w=Length-1; + else m_w=5; + + m_Kg = 3 / (Length + 2.0); + m_Hg = 1.0 - m_Kg; + //---- + if(bar==begin) + { + m_f1 = series; + m_f2 = series; + m_f3 = series; + m_f4 = series; + m_f5 = series; + m_f6 = series; + + m_AB = 0.5; + m_AC = 1.5; + } + } +//----+ + } +//+X================================================================X+ +//| Параболлическое усреднение | +//+X================================================================X+ +double CParMA::ParMASeries +( + uint begin,// Номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Length,// Период усреднения + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов + ) +// SMASeries(Number, symbol, timeframe, begin, limit, Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//---- Проверка начала достоверного отсчёта баров + if(BarCheck1(begin,bar,set)) return(EMPTY_VALUE); + +//----+ Объявление локальных переменных + int iii,kkk; +//---- + double S,B0,B1,B2,parma; + double A,B,C,D,E,F; + double K,L,M,P,Q,R; + double sum_y,sum_xy,sum_x2y,var_tmp; + +//----+ Изменение размеров массива переменных + if(bar==begin && !SeriesArrayResize(__FUNCTION__,Length,m_SeriesArray,m_Size_)) + return(EMPTY_VALUE); + +//----+ проверка внешего параметра Length на корректность + LengthCheck(Length); + +//----+ перестановка и инициализация ячеек массива m_SeriesArray + Recount_ArrayZeroPos(m_count,Length,prev_calculated,rates_total,series,bar,m_SeriesArray,set); + +//----+ Инициализация нуля + if(BarCheck2(begin,bar,set,Length)) ParMAInit(Length); + else if(BarCheck3(begin,bar,set,Length)) return(EMPTY_VALUE); + +//----+ Вычисление ParMA + sum_y = 0.0; + sum_xy = 0.0; + sum_x2y = 0.0; +//---- + for(iii=1; iii<=Length; iii++) + { + kkk=Recount_ArrayNumber(m_count,Length,Length-iii); + var_tmp = m_SeriesArray[kkk]; + sum_y += var_tmp; + sum_xy += iii * var_tmp; + sum_x2y += iii * iii * var_tmp; + } + +// разница между двумя ближайшими барами для sum_x2y: Sum(i=0; i 0) m_UpSum += dseries; + if(dseries < 0) m_DnSum -= dseries; + } + + m_AbsCMO=0.000000001; + } + else if(BarCheck3(begin,bar,set,CMO_Length+3)) + { + m_series1=series; + return(EMPTY_VALUE); + } + + dseries=m_dSeriesArray[m_count]; + if(dseries > 0) m_UpSum += dseries; + if(dseries < 0) m_DnSum -= dseries; + if(m_UpSum+m_DnSum>0) + m_AbsCMO=MathAbs((m_UpSum-m_DnSum)/(m_UpSum+m_DnSum)); + abcmo=m_AbsCMO; +//---- + rrr=Recount_ArrayNumber(m_count,size,CMO_Length-1); + dseries=m_dSeriesArray[rrr]; + if(dseries > 0) m_UpSum -= dseries; + if(dseries < 0) m_DnSum += dseries; + +//----+ Восстановление значений переменных + if(BarCheck5(rates_total,bar,set)) + { + m_AbsCMO= m_AbsCMO_; + m_UpSum = m_UpSum_; + m_DnSum = m_DnSum_; + m_series1=m_series1_; + } + else m_series1=series; + +//----+ Сохранение значений переменных + if(BarCheck4(rates_total,bar,set)) + { + m_AbsCMO_=m_AbsCMO; + m_UpSum_ = m_UpSum; + m_DnSum_ = m_DnSum; + m_series1_=m_series1; + } +//----+ + return(abcmo); + } +//+X================================================================X+ +//| VIDYASeries() function | +//+X================================================================X+ +double CCMO::VIDYASeries +( + uint begin,// номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int CMO_Length,// CMO период + double EMA_Length,// EMA период + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов. + ) +// VIDYASeries(begin, prev_calculated, rates_total, CMO_Length, EMA_Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//----+ Объявление локальных переменных + double vidya,CMO_=CMOSeries(begin,prev_calculated,rates_total,CMO_Length,series,bar,set); + +//----+ Инициализация нуля + if(BarCheck2(begin,bar,set,CMO_Length+3)) + { + m_Vidya=series; + //---- Инициализация фактора сглаживания ЕМА + m_SmoothFactor=2.0/(EMA_Length+1.0); + } + else if(BarCheck3(begin,bar,set,CMO_Length+3)) return(EMPTY_VALUE); + +//---- + CMO_*=m_SmoothFactor; + m_Vidya=CMO_*series+(1-CMO_)*m_Vidya; + vidya=m_Vidya; + +//----+ Восстановление значений переменных + if(BarCheck5(rates_total,bar,set)) + { + m_Vidya=m_Vidya_; + } + +//----+ Сохранение значений переменных + if(BarCheck4(rates_total,bar,set)) + { + m_Vidya_=m_Vidya; + } +//----+ + return(vidya); + } +//+X================================================================X+ +//| Усреднение Кауфмана | +//+X================================================================X+ +double CAMA::AMASeries +( + uint begin,// номер начала достоверного отсчёта баров + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + int Length,// период AMA + int Fast_Length, // период быстрой скользящей + int Slow_Length, // период медленной скользящей + double Rate,// степень, в которую возводится сглаживающая константа + double series,// Значение ценового ряда, расчитанное для бара с номером bar + uint bar,// Номер бара + bool set // Направление индексирования массивов. + ) +// AMASeries(symbol, timeframe, begin, limit, Length, series, bar, set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ +//---- Проверка начала достоверного отсчёта баров + if(BarCheck1(begin,bar,set)) return(EMPTY_VALUE); + +//----+ Объявление локальных переменных + double signal,ER,ERSC,SSC,dprice,ama; + int iii,kkk,rrr,size=Length+1; + +//----+ Изменение размеров массивов переменных + if(bar==begin) + if(!SeriesArrayResize(__FUNCTION__,size,m_SeriesArray,m_Size_1) + || !SeriesArrayResize(__FUNCTION__,size,m_dSeriesArray,m_Size_2)) + return(EMPTY_VALUE); + +//----+ проверка внешего параметра Length на корректность + LengthCheck(Length); + +//----+ перестановка и инициализация ячеек массива m_SeriesArray + Recount_ArrayZeroPos(m_count,size,prev_calculated,rates_total,series,bar,m_SeriesArray,set); + +//---- Проверка начала достаточности баров + if(BarCheck1(begin+1,bar,set)) return(EMPTY_VALUE); + + kkk=Recount_ArrayNumber(m_count,size,1); + dprice=series-m_SeriesArray[kkk]; + m_dSeriesArray[m_count]=dprice; + +//----+ Инициализация нуля + if(BarCheck2(begin,bar,set,Length+3)) + { + //---- инициализация констант + rrr=Recount_ArrayNumber(m_count,size,1); + m_Ama=m_SeriesArray[rrr]; + m_slowSC = (2.0 / (Slow_Length + 1)); + m_fastSC = (2.0 / (Fast_Length + 1)); + m_dSC=m_fastSC-m_slowSC; + m_noise=0.000000001; + + for(iii=1; iii+100) + { + string word; + StringConcatenate(word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не более +100. Вы ввели недопустимое ",ExternPhase," будет использовано +100"); + Print(word); + break;; + } + break; + + case MODE_JurX: break; + case MODE_ParMA: break; + + case MODE_T3: break; + if(ExternPhase<1) + { + string word; + StringConcatenate(word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не менее 1. Вы ввели недопустимое ",ExternPhase," будет использовано 1"); + Print(word); + break; + } + + case MODE_VIDYA: + + if(ExternPhase<1) + { + string word; + StringConcatenate(word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не менее 1. Вы ввели недопустимое ",ExternPhase," будет использовано 1"); + Print(word); + break; + } + + case MODE_AMA: + + if(ExternPhase<1) + { + string word; + StringConcatenate(word,__FUNCTION__," (): Параметр ",PhaseName, + " должен быть не менее 1. Вы ввели недопустимое ",ExternPhase," будет использовано 1"); + Print(word); + break; + } + } + +//----+ + } +//+X================================================================X+ +//| Проверка глубины усреднения Lengt на корректность | +//+X================================================================X+ +void CXMA::XMALengthCheck(string LengthName,int ExternLength) + +// XMALengthCheck(LengthName, ExternLength) + { +//----+ +//---- сброс сообщений при недопустимых значениях входных параметров + if(ExternLength<1) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",LengthName, + " должен быть не менее 1. Вы ввели недопустимое ", + ExternLength," будет использовано 1"); + Print(word); + return; + } +//----+ + } +//+X================================================================X+ +//| Проверка периода усреднения на корректность | +//+X================================================================X+ +void CMovSeriesTools::MALengthCheck(string LengthName,int ExternLength) +// MALengthCheck(LengthName, ExternLength) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + if(ExternLength<1) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",LengthName, + " должен быть не менее 1. Вы ввели недопустимое ", + ExternLength," будет использовано 1"); + Print(word); + return; + } +//----+ + } +//+X================================================================X+ +//| Проверка периода усреднения на корректность | +//+X================================================================X+ +void CMovSeriesTools::MALengthCheck(string LengthName,double ExternLength) + +// MALengthCheck(LengthName, ExternLength) + { +//----+ + if(ExternLength<1) + { + string word; + StringConcatenate + (word,__FUNCTION__," (): Параметр ",LengthName, + " должен быть не менее 1. Вы ввели недопустимое ", + ExternLength," будет использовано 1"); + Print(word); + return; + } +//----+ + } +//+X================================================================X+ +//| Проверка бара на его присутствие в диапозоне расчёта | +//+X================================================================X+ +bool CMovSeriesTools::BarCheck1(int begin,int bar,bool Set) + +// BarCheck1(begin, bar, Set) + { +//----+ + if((!Set && barbegin)) return(true); +//----+ + return(false); + } +//+X================================================================X+ +//| Проверка бара на старт расчёта | +//+X================================================================X+ +bool CMovSeriesTools::BarCheck2(int begin,int bar,bool Set,int Length) + +// BarCheck2(begin, bar, Set, Length) + { +//----+ + if((!Set && bar==begin+Length-1) || (Set && bar==begin-Length+1)) + return(true); +//----+ + return(false); + } +//+X================================================================X+ +//| Проверка бара на отсутствие баров для усреднения | +//+X================================================================X+ +bool CMovSeriesTools::BarCheck3(int begin,int bar,bool Set,int Length) + +// BarCheck3(begin, bar, Set, Length) + { +//----+ + if((!Set && barbegin-Length+1)) + return(true); +//----+ + return(false); + } +//+X================================================================X+ +//| Проверка бара на момент сохранения данных | +//+X================================================================X+ +bool CMovSeriesTools::BarCheck4(int rates_total,int bar,bool Set) + +// BarCheck4(rates_total, bar, Set) + { +//----+ +//----+ Сохранение значений переменных + if((!Set && bar==rates_total-2) || (Set && bar==1)) return(true); +//----+ + return(false); + } +//+X================================================================X+ +//| Проверка бара на момент восстановления данных | +//+X================================================================X+ +bool CMovSeriesTools::BarCheck5(int rates_total,int bar,bool Set) + +// BarCheck5(rates_total, begin, bar, set) + { +//----+ +//----+ Восстановление значений переменных + if((!Set && bar==rates_total-1) || (Set && bar==0)) return(true); +//----+ + return(false); + } +//+X================================================================X+ +//| Изменение некорректного периода усреднения | +//+X================================================================X+ +void CMovSeriesTools::LengthCheck(int &ExternLength) + +// LengthCheck(LengthName, ExternLength) + { +//----+ + if(ExternLength<1) ExternLength=1; +//----+ + } +//+X================================================================X+ +//| Изменение некорректного периода усреднения | +//+X================================================================X+ +void CMovSeriesTools::LengthCheck(double &ExternLength) + +// LengthCheck(ExternLength) + { +//----+ + if(ExternLength<1) ExternLength=1; +//----+ + } +//+X================================================================X+ +//| пересчёт позиции самого нового элемента в массиве | +//+X================================================================X+ +void CMovSeriesTools::Recount_ArrayZeroPos +( + int &count,// Возврат по ссылке номера текущего значения ценового ряда + int Length, + uint prev_calculated,// Количество истории в барах на предыдущем тике + uint rates_total,// Количество истории в барах на текущем тике + double series,// Значение ценового ряда, расчитанное для бара с номером bar + int bar, + double &Array[], + bool set // Направление индексирования массивов + ) +// Recount_ArrayZeroPos(count, Length, prev_calculated, rates_total, series, bar, Array[], set) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + if(set) + { + if(bar!=rates_total-prev_calculated) + { + count--; + if(count<0) count=Length-1; + } + } + else + { + if(bar!=prev_calculated-1) + { + count--; + if(count<0) count=Length-1; + } + } + + Array[count]=series; +//----+ + } +//+X================================================================X+ +//| Преобразование номера таймсерии в позицию в массиве | +//+X================================================================X+ +int CMovSeriesTools::Recount_ArrayNumber +( + int count,// Номер текущего значения ценового ряда + int Length, + int Number // Позиция запрашиваемого значения относительно текущего бара bar + ) +// Recount_ArrayNumber(count, Length, Number) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + int ArrNumber=Number+count; + + if(ArrNumber>Length-1) ArrNumber-=Length; +//----+ + return(ArrNumber); + } +//+X================================================================X+ +//| Изменение размера массива Array[] | +//+X================================================================X+ +bool CMovSeriesTools::SeriesArrayResize +( + string FunctionsName,// Название функции, внутри которой меняется размер + int Length,// новый размер массива + double &Array[],// Изменяемый массив + int &Size_ // Получившийся размер массива + ) +// SeriesArrayResize(FunctionsName, Length, Array, Size_) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + +//----+ Изменение размеров массива переменных + if(Length>Size_) + { + int Size=Length+1; + + if(ArrayResize(Array,Size)==-1) + { + ArrayResizeErrorPrint(FunctionsName,Size_); + return(false); + } + + Size_=Size; + } +//----+ + return(true); + } +//+X================================================================X+ +//| Сброс в логфайл ошибки изменения размера массива | +//+X================================================================X+ +bool CMovSeriesTools::ArrayResizeErrorPrint +( + string FunctionsName, + int &Size_ + ) +// ArrayResizeErrorPrint(FunctionsName, Size_) +//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ + { +//----+ + string lable,word; + StringConcatenate(lable,FunctionsName,"():"); + StringConcatenate(word,lable," Ошибка!!! Не удалось изменить", + " размеры массива переменных функции ",FunctionsName,"()!"); + Print(word); +//---- + int error=GetLastError(); + ResetLastError(); +//---- + if(error>4000) + { + StringConcatenate(word,lable,"(): Код ошибки ",error); + Print(word); + } + + Size_=-2; + return(false); +//----+ + return(true); + } +//+X----------------------+ <<< The End >>> +-----------------------X+ diff --git a/socketlib.mqh b/socketlib.mqh new file mode 100644 index 0000000000000000000000000000000000000000..fad2263aa7a27d3bc0c114135656988ac60e9ba4 GIT binary patch literal 72104 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 literal 0 HcmV?d00001 diff --git a/test_color.mqh b/test_color.mqh new file mode 100644 index 0000000..1857d32 --- /dev/null +++ b/test_color.mqh @@ -0,0 +1,13 @@ +class test_color +{ + +public: + color col_inds; + + + void testcol() + { + col_inds = C'8,235,243'; + } +}; + diff --git a/tradestatisticspanel.mqh b/tradestatisticspanel.mqh new file mode 100644 index 0000000000000000000000000000000000000000..e48fe26e6d10bc0f1911a2a8ed2bc8132135d717 GIT binary patch literal 26110 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 literal 0 HcmV?d00001