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; 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 0000000..b3533d3 Binary files /dev/null and b/Functions.mqh differ diff --git a/IniFile.mqh b/IniFile.mqh new file mode 100644 index 0000000..4c45faf Binary files /dev/null and b/IniFile.mqh differ 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; i>>"); + 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 0000000..6efc18c Binary files /dev/null and b/ctradestatistics.mqh differ diff --git a/jason.mqh b/jason.mqh new file mode 100644 index 0000000..e56281b Binary files /dev/null and b/jason.mqh differ diff --git a/samplesignal.mqh b/samplesignal.mqh new file mode 100644 index 0000000..144c132 --- /dev/null +++ b/samplesignal.mqh @@ -0,0 +1,314 @@ +//+------------------------------------------------------------------+ +//| SampleSignal.mqh | +//| Copyright 2010, MetaQuotes Software Corp. | +//| http://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2010, MetaQuotes Software Corp." +#property link "http://www.mql5.com" +//+------------------------------------------------------------------+ +//| include files | +//+------------------------------------------------------------------+ +#include +// 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 0000000..fad2263 Binary files /dev/null and b/socketlib.mqh differ 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 0000000..e48fe26 Binary files /dev/null and b/tradestatisticspanel.mqh differ