From f47656945821610f8086cba59bbe53b30a648810 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 24 Apr 2014 00:49:27 +0200 Subject: [PATCH 001/676] DBG: added pattern finder DBG: added 'find' command --- x64_dbg_dbg/instruction.cpp | 43 +++++++++++++++++++ x64_dbg_dbg/instruction.h | 2 + x64_dbg_dbg/memory.cpp | 83 +++++++++++++++++++++++++++++++++++++ x64_dbg_dbg/memory.h | 14 ++++++- x64_dbg_dbg/x64_dbg.cpp | 2 + 5 files changed, 143 insertions(+), 1 deletion(-) diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index c7ad2f8d..3704c818 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -918,3 +918,46 @@ CMDRESULT cbInstrGetstr(int argc, char* argv[]) efree(string, "cbInstrGetstr:string"); return STATUS_CONTINUE; } + +CMDRESULT cbInstrFind(int argc, char* argv[]) +{ + if(argc<3) + { + dputs("not enough arguments!"); + return STATUS_ERROR; + } + uint addr=0; + if(!valfromstring(argv[1], &addr, false)) + return STATUS_ERROR; + char pattern[deflen]=""; + //remove # from the start and end of the pattern (ODBGScript support) + if(argv[2][0]=='#') + strcpy(pattern, argv[2]+1); + else + strcpy(pattern, argv[2]); + int len=strlen(pattern); + if(pattern[len-1]=='#') + pattern[len-1]='\0'; + uint size=0; + uint base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &size); + if(!base) + { + dprintf("invalid memory address "fhex"!\n", addr); + return STATUS_ERROR; + } + unsigned char* data=(unsigned char*)emalloc(size, "cbInstrFind:data"); + if(!memread(fdProcessInfo->hProcess, (const void*)base, data, size, 0)) + { + efree(data, "cbInstrFind:data"); + dputs("failed to read memory!"); + return STATUS_ERROR; + } + uint start=addr-base; + uint foundoffset=memfindpattern(data+start, size-start, pattern); + uint result=0; + if(foundoffset!=-1) + result=addr+foundoffset; + varset("$result", result, false); + DbgCmdExec("$result"); + return STATUS_CONTINUE; +} diff --git a/x64_dbg_dbg/instruction.h b/x64_dbg_dbg/instruction.h index e84e6551..888be819 100644 --- a/x64_dbg_dbg/instruction.h +++ b/x64_dbg_dbg/instruction.h @@ -50,4 +50,6 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[]); CMDRESULT cbInstrSetstr(int argc, char* argv[]); CMDRESULT cbInstrGetstr(int argc, char* argv[]); +CMDRESULT cbInstrFind(int argc, char* argv[]); + #endif // _INSTRUCTIONS_H diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp index 62181568..3b9474b0 100644 --- a/x64_dbg_dbg/memory.cpp +++ b/x64_dbg_dbg/memory.cpp @@ -98,3 +98,86 @@ void memfree(HANDLE hProcess, uint addr) { VirtualFreeEx(hProcess, (void*)addr, 0, MEM_RELEASE); } + +static bool patterntransform(const char* text, std::vector* pattern) +{ + if(!text or !pattern) + return false; + pattern->clear(); + int len=strlen(text); + if(!len) + return false; + char* newtext=(char*)emalloc(len+2, "transformpattern:newtext"); + strcpy(newtext, text); + if(len%2) //not a multiple of 2 + { + newtext[len]='?'; + newtext[len+1]='\0'; + len++; + } + PATTERNBYTE newByte; + for(int i=0,j=0; ipush_back(newByte); + } + } + efree(newtext, "transformpattern:newtext"); + return true; +} + +static bool patternmatchbyte(unsigned char byte, PATTERNBYTE* pbyte) +{ + unsigned char n1=(byte>>4)&0xF; + unsigned char n2=byte&0xF; + int matched=0; + if(pbyte->n[0].all) + matched++; + else if(pbyte->n[0].n==n1) + matched++; + if(pbyte->n[1].all) + matched++; + else if(pbyte->n[1].n==n2) + matched++; + return (matched==2); +} + +uint memfindpattern(unsigned char* data, uint size, const char* pattern) +{ + std::vector searchpattern; + if(!patterntransform(pattern, &searchpattern)) + return -1; + int searchpatternsize=searchpattern.size(); + for(uint i=0,pos=0; i Date: Thu, 24 Apr 2014 17:24:24 -0400 Subject: [PATCH 002/676] GUI: Add detachable tabs --- x64_dbg_gui/Project/DebuggerX64.pro | 8 +- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 4 +- x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 152 +++++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/tabbar.h | 43 ++++++ x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 105 ++++++++++++++ x64_dbg_gui/Project/Src/Gui/tabwidget.h | 63 +++++++++ 6 files changed, 371 insertions(+), 4 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.h create mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.h diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 94e48562..125b7e6a 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -59,7 +59,9 @@ SOURCES += \ Src/BasicView/ReferenceView.cpp \ Src/BasicView/ThreadView.cpp \ Src/Gui/SettingsDialog.cpp \ - Src/Gui/ExceptionRangeDialog.cpp + Src/Gui/ExceptionRangeDialog.cpp \ + Src/Gui/tabbar.cpp \ + Src/Gui/tabwidget.cpp HEADERS += \ @@ -99,7 +101,9 @@ HEADERS += \ Src/BasicView/ReferenceView.h \ Src/BasicView/ThreadView.h \ Src/Gui/SettingsDialog.h \ - Src/Gui/ExceptionRangeDialog.h + Src/Gui/ExceptionRangeDialog.h \ + Src/Gui/tabbar.h \ + Src/Gui/tabwidget.h INCLUDEPATH += \ Src \ diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index d55684f3..80427632 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -1,5 +1,6 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include "tabbar.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -72,8 +73,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi mThreadView->setWindowIcon(QIcon(":/icons/images/arrow-threads.png")); //Create the tab widget - mTabWidget = new QTabWidget(); - mTabWidget->setMovable(true); + mTabWidget = new MHTabBar(NULL); //Setup tabs mTabWidget->addTab(mCpuWidget, mCpuWidget->windowIcon(), mCpuWidget->windowTitle()); diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp new file mode 100644 index 00000000..8a09feb3 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp @@ -0,0 +1,152 @@ +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) +{ + setAcceptDrops(true); + setElideMode(Qt::ElideRight); + setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); + setMovable(true); +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabBar::~MHTabBar(void) +{ +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) + m_dragStartPos = event->pos(); + + m_dragDropedPos.setX(0); + m_dragDropedPos.setY(0); + m_dragMovedPos.setX(0); + m_dragMovedPos.setY(0); + + m_dragInitiated = false; + + QTabBar::mousePressEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mouseMoveEvent(QMouseEvent* event) +{ + // Distinguish a drag + if ( !m_dragStartPos.isNull () && + ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) + { + m_dragInitiated = true; + } + + // The left button is pressed + // And the move could also be a drag + // And the mouse moved outside the tab bar + if ( ((event->buttons() & Qt::LeftButton)) && + m_dragInitiated && + (!geometry ().contains (event->pos ()))) + { + // Stop the move to be able to convert to a drag + { + QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QTabBar::mouseMoveEvent(&finishMoveEvent); + } + + // Initiate Drag + QDrag* drag = new QDrag(this); + QMimeData* mimeData = new QMimeData; + // a crude way to distinguish tab-reordering drops from other ones + mimeData->setData("action", "application/tab-detach"); + drag->setMimeData(mimeData); + + // Create transparent screen dump + QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled (640, 480, Qt::KeepAspectRatio); + QPixmap targetPixmap(pixmap.size()); + + QPainter painter(&targetPixmap); + painter.setOpacity(0.5); + painter.drawPixmap(0, 0, pixmap); + painter.end(); + + drag->setPixmap(targetPixmap); + + // Handle Detach and Move + Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); + + if (dragged == Qt::IgnoreAction) + { + event->accept(); + OnDetachTab(tabAt(m_dragStartPos), m_dragDropedPos); + } + else if (dragged == Qt::MoveAction) + { + if (!m_dragDropedPos.isNull()) + { + event->accept(); + OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDropedPos)); + } + } + + delete drag; + } + else + { + QTabBar::mouseMoveEvent(event); + } +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragEnterEvent(QDragEnterEvent* event) +{ + // Only accept if it's an tab-reordering request + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + event->acceptProposedAction(); + + QTabBar::dragEnterEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragMoveEvent(QDragMoveEvent* event) +{ + // Only accept if it's an tab-reordering request + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + { + m_dragMovedPos = event->pos(); + event->acceptProposedAction(); + } + + QTabBar::dragMoveEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dropEvent(QDropEvent* event) +{ + // If a dragged Event is dropped within this widget it is not a drag but a move. + m_dragDropedPos = event->pos(); + + QTabBar::dropEvent(event); +} diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h new file mode 100644 index 00000000..360f48ac --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.h @@ -0,0 +1,43 @@ +#ifndef __MHTABBAR_H__ +#define __MHTABBAR_H__ + +// Qt includes +#include + +// Qt forward class definitions +class MHTabBar; +class QMainWindow; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabBar implements the a Tab Bar with tear-off functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabBar: public QTabBar +{ +Q_OBJECT +public: + MHTabBar (QWidget* parent); + ~MHTabBar (void); + +protected: + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void dropEvent(QDropEvent* event); + +signals: + // Detach Tab + void OnDetachTab (int index, QPoint& dropPoint); + // Move Tab + void OnMoveTab (int fromIndex, int toIndex); + +private: + QPoint m_dragStartPos; + QPoint m_dragMovedPos; + QPoint m_dragDropedPos; + bool m_dragInitiated; + int m_dragCurrentIndex; +}; + +#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp new file mode 100644 index 00000000..e9d65f60 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -0,0 +1,105 @@ +// Qt includes +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) +{ + m_tabBar = new MHTabBar(this); + connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + + setTabBar(m_tabBar); + setMovable(true); +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabWidget::~MHTabWidget(void) +{ + disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + delete m_tabBar; +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::MoveTab(int fromIndex, int toIndex) +{ + removeTab(fromIndex); + insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); + setCurrentIndex(toIndex); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/) +{ + // Create the window + MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget()); + detachedWidget->setWindowModality(Qt::NonModal); + + // Find Widget and connect + connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + + detachedWidget->setWindowTitle(tabText (index)); + detachedWidget->setWindowIcon(tabIcon(index)); + + // Remove from tab bar + QWidget* tearOffWidget = widget(index); + tearOffWidget->setParent(detachedWidget); + + // Make first active + if (count() > 0) + setCurrentIndex(0); + + // Create and show + detachedWidget->setCentralWidget(tearOffWidget); + + // Needs to be done explicitly + tearOffWidget->show(); + detachedWidget->resize(640, 480); + detachedWidget->show(); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::AttachTab(QWidget *parent) +{ + // Retrieve widget + MHDetachedWindow* detachedWidget = dynamic_cast(parent); + QWidget* tearOffWidget = detachedWidget->centralWidget(); + + // Change parent + tearOffWidget->setParent(this); + + // Reattach the tab + int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); + + // Make Active + if (newIndex != -1) + setCurrentIndex(newIndex); + + // Cleanup Window + disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + delete detachedWidget; +} + +//---------------------------------------------------------------------------- + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::MHDetachedWindow(QWidget *parent) : QMainWindow(parent) +{ +} + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::~MHDetachedWindow(void) +{ +} + +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) +{ + emit OnClose(this); +} + diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h new file mode 100644 index 00000000..f40fd96e --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h @@ -0,0 +1,63 @@ +#ifndef __MHTABWIDGET_H__ +#define __MHTABWIDGET_H__ + +// Qt includes +#include +#include +#include + +// Qt forward class definitions +class MHTabBar; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabWidget implements the a Tab Widget with detach and attach +// functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabWidget: public QTabWidget +{ + Q_OBJECT + +public: + MHTabWidget(QWidget *parent); + virtual ~MHTabWidget(void); + +public slots: + // Move Tab + void MoveTab(int fromIndex, int toIndex); + + // Detach Tab + void DetachTab(int index, QPoint&); + + // Attach Tab + void AttachTab(QWidget *parent); + +protected: + +private: + MHTabBar* m_tabBar; +}; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHDetachedWindow implements the WindowContainer for the Detached Widget +// +// Conditions: +// Header : MHTabWidget.h +////////////////////////////////////////////////////////////////////////////// +class MHDetachedWindow : public QMainWindow +{ + Q_OBJECT +public: + MHDetachedWindow(QWidget *parent = 0); + ~MHDetachedWindow(void); + +protected: + void closeEvent(QCloseEvent *event); + +signals: + void OnClose (QWidget* widget); +}; + +#endif // __MHTABWIDGET_H__ + From 9b36423cdc534e285318b69b865395e8e51abfe1 Mon Sep 17 00:00:00 2001 From: Nukem Date: Thu, 24 Apr 2014 23:26:59 -0400 Subject: [PATCH 003/676] GUI: Make 'View' work with windowed tabs Detached tabs now open at cursor location --- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 15 +++--- x64_dbg_gui/Project/Src/Gui/MainWindow.h | 3 +- x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 45 ++++++++--------- x64_dbg_gui/Project/Src/Gui/tabbar.h | 2 +- x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 56 ++++++++++++++++++++-- x64_dbg_gui/Project/Src/Gui/tabwidget.h | 9 ++++ 6 files changed, 92 insertions(+), 38 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 80427632..01d38526 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -1,6 +1,5 @@ #include "MainWindow.h" #include "ui_MainWindow.h" -#include "tabbar.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -73,7 +72,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi mThreadView->setWindowIcon(QIcon(":/icons/images/arrow-threads.png")); //Create the tab widget - mTabWidget = new MHTabBar(NULL); + mTabWidget = new MHTabWidget(NULL); //Setup tabs mTabWidget->addTab(mCpuWidget, mCpuWidget->windowIcon(), mCpuWidget->windowTitle()); @@ -154,12 +153,12 @@ MainWindow::~MainWindow() void MainWindow::setTab(QWidget* widget) { - for(int i=0; icount(); i++) - if(mTabWidget->widget(i)==widget) - { - mTabWidget->setCurrentIndex(i); - break; - } + for(int i=0; icount(); i++) + if(mTabWidget->widget(i)==widget) + { + mTabWidget->setCurrentIndex(i); + break; + } } //Reads recent files list from settings diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 9a78ed6b..d40c9f5b 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -17,6 +17,7 @@ #include "ReferenceView.h" #include "ThreadView.h" #include "SettingsDialog.h" +#include "tabwidget.h" namespace Ui { class MainWindow; @@ -71,7 +72,7 @@ private: Ui::MainWindow *ui; CommandLineEdit* mCmdLineEdit; - QTabWidget* mTabWidget; + MHTabWidget* mTabWidget; CPUWidget* mCpuWidget; MemoryMapView* mMemMapView; LogView* mLogView; diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp index 8a09feb3..2ebbdb06 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp @@ -1,15 +1,11 @@ // Qt includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include "tabbar.h" @@ -39,8 +35,8 @@ void MHTabBar::mousePressEvent(QMouseEvent* event) if (event->button() == Qt::LeftButton) m_dragStartPos = event->pos(); - m_dragDropedPos.setX(0); - m_dragDropedPos.setY(0); + m_dragDroppedPos.setX(0); + m_dragDroppedPos.setY(0); m_dragMovedPos.setX(0); m_dragMovedPos.setY(0); @@ -53,7 +49,7 @@ void MHTabBar::mousePressEvent(QMouseEvent* event) void MHTabBar::mouseMoveEvent(QMouseEvent* event) { // Distinguish a drag - if ( !m_dragStartPos.isNull () && + if ( !m_dragStartPos.isNull() && ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) { m_dragInitiated = true; @@ -62,9 +58,7 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event) // The left button is pressed // And the move could also be a drag // And the mouse moved outside the tab bar - if ( ((event->buttons() & Qt::LeftButton)) && - m_dragInitiated && - (!geometry ().contains (event->pos ()))) + if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) { // Stop the move to be able to convert to a drag { @@ -72,15 +66,16 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event) QTabBar::mouseMoveEvent(&finishMoveEvent); } + // A crude way to distinguish tab-reordering drops from other ones + QMimeData* mimeData = new QMimeData; + mimeData->setData("action", "application/tab-detach"); + // Initiate Drag QDrag* drag = new QDrag(this); - QMimeData* mimeData = new QMimeData; - // a crude way to distinguish tab-reordering drops from other ones - mimeData->setData("action", "application/tab-detach"); drag->setMimeData(mimeData); // Create transparent screen dump - QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled (640, 480, Qt::KeepAspectRatio); + QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); QPixmap targetPixmap(pixmap.size()); QPainter painter(&targetPixmap); @@ -96,14 +91,14 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event) if (dragged == Qt::IgnoreAction) { event->accept(); - OnDetachTab(tabAt(m_dragStartPos), m_dragDropedPos); + OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); } else if (dragged == Qt::MoveAction) { - if (!m_dragDropedPos.isNull()) + if (!m_dragDroppedPos.isNull()) { event->accept(); - OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDropedPos)); + OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); } } @@ -146,7 +141,7 @@ void MHTabBar::dragMoveEvent(QDragMoveEvent* event) void MHTabBar::dropEvent(QDropEvent* event) { // If a dragged Event is dropped within this widget it is not a drag but a move. - m_dragDropedPos = event->pos(); + m_dragDroppedPos = event->pos(); QTabBar::dropEvent(event); } diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h index 360f48ac..cfc9627a 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.h +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.h @@ -35,7 +35,7 @@ signals: private: QPoint m_dragStartPos; QPoint m_dragMovedPos; - QPoint m_dragDropedPos; + QPoint m_dragDroppedPos; bool m_dragInitiated; int m_dragCurrentIndex; }; diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp index e9d65f60..faae5b72 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -13,6 +13,8 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) setTabBar(m_tabBar); setMovable(true); + + m_Windows.clear(); } ////////////////////////////////////////////////////////////// @@ -25,6 +27,44 @@ MHTabWidget::~MHTabWidget(void) delete m_tabBar; } +int MHTabWidget::count() const +{ + return QTabWidget::count() + m_Windows.size(); +} + +QWidget *MHTabWidget::widget(int index) const +{ + int baseCount = QTabWidget::count(); + + // Check if it's just a normal tab + if (index < baseCount) + return QTabWidget::widget(index); + + // Otherwise it's going to be a window + return m_Windows.at(index - baseCount); +} + +void MHTabWidget::setCurrentIndex(int index) +{ + // Check if it's just a normal tab + if (index < QTabWidget::count()) + { + QTabWidget::setCurrentIndex(index); + } + else + { + // Otherwise it's going to be a window (just bring it up) + MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); + window->activateWindow(); + } +} + +void MHTabWidget::setCurrentWidget(QWidget *widget) +{ + widget = 0; + // To be implemented. +} + ////////////////////////////////////////////////////////////////////////////// void MHTabWidget::MoveTab(int fromIndex, int toIndex) { @@ -34,7 +74,7 @@ void MHTabWidget::MoveTab(int fromIndex, int toIndex) } ////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/) +void MHTabWidget::DetachTab(int index, QPoint& dropPoint) { // Create the window MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget()); @@ -43,13 +83,16 @@ void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/) // Find Widget and connect connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - detachedWidget->setWindowTitle(tabText (index)); + detachedWidget->setWindowTitle(tabText(index)); detachedWidget->setWindowIcon(tabIcon(index)); // Remove from tab bar QWidget* tearOffWidget = widget(index); tearOffWidget->setParent(detachedWidget); + // Add it to the windows list + m_Windows.append(tearOffWidget); + // Make first active if (count() > 0) setCurrentIndex(0); @@ -59,7 +102,7 @@ void MHTabWidget::DetachTab(int index, QPoint& /*dropPoint*/) // Needs to be done explicitly tearOffWidget->show(); - detachedWidget->resize(640, 480); + detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480); detachedWidget->show(); } @@ -76,6 +119,13 @@ void MHTabWidget::AttachTab(QWidget *parent) // Reattach the tab int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); + // Remove it from the windows list + for(int i = 0; i < m_Windows.size(); i++) + { + if (m_Windows.at(i) == tearOffWidget) + m_Windows.removeAt(i); + } + // Make Active if (newIndex != -1) setCurrentIndex(newIndex); diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h index f40fd96e..5e134f04 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h @@ -23,6 +23,9 @@ public: virtual ~MHTabWidget(void); public slots: + int count() const; + QWidget *widget(int index) const; + // Move Tab void MoveTab(int fromIndex, int toIndex); @@ -32,10 +35,16 @@ public slots: // Attach Tab void AttachTab(QWidget *parent); +public Q_SLOTS: + void setCurrentIndex(int index); + void setCurrentWidget(QWidget *widget); + protected: private: MHTabBar* m_tabBar; + + QList m_Windows; }; ////////////////////////////////////////////////////////////////////////////// From 5f9f3f88f960ed6582a9b054f87cca3e332b29ba Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 20:41:03 +0200 Subject: [PATCH 004/676] BRIDGE: added DbgScriptGetBranchInfo DBG: added branch info DBG: fixed a bug with comments in scripts DBG: fixed a bug with prepended spaces in scripts DBG: added script command 'nop' GUI: separate class RichTextPainter GUI: script syntax highlighting (jumps+calls+rets+comments) GUI: backgroundColor property in AbstractTableView GUI: added keyPressEvent handler (enter follows jumps & arrows select next command) in ScriptView --- x64_dbg_bridge/bridgemain.cpp | 5 + x64_dbg_bridge/bridgemain.h | 22 ++ x64_dbg_dbg/_exports.cpp | 8 +- x64_dbg_dbg/simplescript.cpp | 100 ++++++--- x64_dbg_dbg/simplescript.h | 21 +- x64_dbg_gui/Project/DebuggerX64.pro | 7 +- .../Src/BasicView/AbstractTableView.cpp | 3 +- .../Project/Src/BasicView/AbstractTableView.h | 4 +- .../Project/Src/BasicView/Disassembly.cpp | 51 +---- .../Project/Src/BasicView/Disassembly.h | 4 +- .../Project/Src/BasicView/RichTextPainter.cpp | 44 ++++ .../Project/Src/BasicView/RichTextPainter.h | 31 +++ .../Project/Src/BasicView/ScriptView.cpp | 212 +++++++++++++++++- .../Project/Src/BasicView/ScriptView.h | 3 + .../Project/Src/Disassembler/BeaHighlight.cpp | 4 - .../Project/Src/Disassembler/BeaHighlight.h | 18 +- 16 files changed, 401 insertions(+), 136 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp create mode 100644 x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 92cc35f1..6f747860 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -534,6 +534,11 @@ BRIDGE_IMPEXP void DbgScriptSetIp(int line) _dbg_sendmessage(DBG_SCRIPT_SETIP, (void*)(duint)line, 0); } +BRIDGE_IMPEXP bool DbgScriptGetBranchInfo(int line, SCRIPTBRANCH* info) +{ + return (bool)(duint)_dbg_sendmessage(DBG_SCRIPT_GETBRANCHINFO, (void*)(duint)line, info); +} + BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user) { SYMBOLCBINFO cbInfo; diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 32bb83d5..5557a0d9 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -117,6 +117,7 @@ enum DBGMSG DBG_SCRIPT_ABORT, // param1=unused, param2=unused DBG_SCRIPT_GETLINETYPE, // param1=int line, param2=unused DBG_SCRIPT_SETIP, // param1=int line, param2=unused + DBG_SCRIPT_GETBRANCHINFO, // param1=int line, param2=SCRIPTBRANCH* info DBG_SYMBOL_ENUM, // param1=SYMBOLCBINFO* cbInfo, param2=unused DBG_ASSEMBLE_AT, // param1=duint addr, param2=const char* instruction DBG_MODBASE_FROM_NAME, // param1=const char* modname, param2=unused @@ -137,6 +138,19 @@ enum SCRIPTLINETYPE lineempty, }; +enum SCRIPTBRANCHTYPE +{ + scriptnobranch, + scriptjmp, + scriptjnejnz, + scriptjejz, + scriptjbjl, + scriptjajg, + scriptjbejle, + scriptjaejge, + scriptcall +}; + enum DISASM_INSTRTYPE { instr_normal, @@ -414,6 +428,13 @@ struct BASIC_INSTRUCTION_INFO bool branch; //jumps/calls }; +struct SCRIPTBRANCH +{ + SCRIPTBRANCHTYPE type; + int dest; + char branchlabel[256]; +}; + //Debugger functions BRIDGE_IMPEXP const char* DbgInit(); BRIDGE_IMPEXP bool DbgMemRead(duint va, unsigned char* dest, duint size); @@ -454,6 +475,7 @@ BRIDGE_IMPEXP bool DbgScriptCmdExec(const char* command); BRIDGE_IMPEXP void DbgScriptAbort(); BRIDGE_IMPEXP SCRIPTLINETYPE DbgScriptGetLineType(int line); BRIDGE_IMPEXP void DbgScriptSetIp(int line); +BRIDGE_IMPEXP bool DbgScriptGetBranchInfo(int line, SCRIPTBRANCH* info); BRIDGE_IMPEXP void DbgSymbolEnum(duint base, CBSYMBOLENUM cbSymbolEnum, void* user); BRIDGE_IMPEXP bool DbgAssembleAt(duint addr, const char* instruction); BRIDGE_IMPEXP duint DbgModBaseFromName(const char* name); diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index edee621f..c5522288 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -596,6 +596,12 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par } break; + case DBG_SCRIPT_GETBRANCHINFO: + { + return (duint)scriptgetbranchinfo((int)(duint)param1, (SCRIPTBRANCH*)param2); + } + break; + case DBG_SYMBOL_ENUM: { SYMBOLCBINFO* cbInfo=(SYMBOLCBINFO*)param1; @@ -716,7 +722,7 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par int hEntry=(int)(uint)param1; pluginmenucall(hEntry); } - break; + break; } return 0; } diff --git a/x64_dbg_dbg/simplescript.cpp b/x64_dbg_dbg/simplescript.cpp index ed794250..98409614 100644 --- a/x64_dbg_dbg/simplescript.cpp +++ b/x64_dbg_dbg/simplescript.cpp @@ -49,9 +49,19 @@ static int scriptlabelfind(const char* labelname) return 0; } +static int scriptinternalstep(int fromIp) //internal step routine +{ + int maxIp=linemap.size(); //maximum ip + if(fromIp>=maxIp) //script end + return fromIp; + while((linemap.at(fromIp).type==lineempty or linemap.at(fromIp).type==linecomment or linemap.at(fromIp).type==linelabel) and fromIp=254) { memset(&entry, 0, sizeof(entry)); - strcpy(entry.raw, temp); + int add=0; + while(temp[add]==' ') + add++; + strcpy(entry.raw, temp+add); *temp=0; j=0; linemap.push_back(entry); @@ -113,7 +132,7 @@ static bool scriptcreatelinemap(const char* filename) } efree(filedata, "createlinemap:filedata"); unsigned int linemapsize=linemap.size(); - while(!*linemap.at(linemapsize-1).raw) //remove empty lines + while(!*linemap.at(linemapsize-1).raw) //remove empty lines from the end { linemapsize--; linemap.pop_back(); @@ -121,6 +140,24 @@ static bool scriptcreatelinemap(const char* filename) for(unsigned int i=0; i().swap(linemap); - return false; + int labelline=scriptlabelfind(linemap.at(i).u.branch.branchlabel); + if(!labelline) //invalid branch label + { + char message[256]=""; + sprintf(message, "Invalid branch label \"%s\" detected on line %d!", linemap.at(i).u.branch.branchlabel, i+1); + GuiScriptError(0, message); + std::vector().swap(linemap); + return false; + } + else //set the branch destination line + linemap.at(i).u.branch.dest=scriptinternalstep(labelline); } } if(linemap.at(linemapsize-1).type==linecomment or linemap.at(linemapsize-1).type==linelabel) //label/comment on the end @@ -202,21 +244,9 @@ static bool scriptcreatelinemap(const char* filename) strcpy(entry.u.command, "ret"); linemap.push_back(entry); } - dprintf("%ums to parse the script\n", GetTickCount()-ticks); return true; } -static int scriptinternalstep(int fromIp) //internal step routine -{ - int maxIp=linemap.size(); //maximum ip - if(fromIp>=maxIp) //script end - return fromIp; - while((linemap.at(fromIp).type==lineempty or linemap.at(fromIp).type==linecomment or linemap.at(fromIp).type==linelabel) and fromIp(int)linemap.size()) //invalid line + return false; + if(linemap.at(line-1).type!=linebranch) //no branch + return false; + memcpy(info, &linemap.at(line-1).u.branch, sizeof(SCRIPTBRANCH)); + return true; +} + CMDRESULT cbScriptLoad(int argc, char* argv[]) { if(argc<2) diff --git a/x64_dbg_dbg/simplescript.h b/x64_dbg_dbg/simplescript.h index 6420c823..4b847d54 100644 --- a/x64_dbg_dbg/simplescript.h +++ b/x64_dbg_dbg/simplescript.h @@ -3,20 +3,6 @@ #include "command.h" -//enums -enum SCRIPTBRANCHTYPE -{ - scriptnobranch, - scriptjmp, - scriptjnejnz, - scriptjejz, - scriptjbjl, - scriptjajg, - scriptjbejle, - scriptjaejge, - scriptcall -}; - //structures struct SCRIPTBP { @@ -24,12 +10,6 @@ struct SCRIPTBP bool silent; //do not show in GUI }; -struct SCRIPTBRANCH -{ - SCRIPTBRANCHTYPE type; - char branchlabel[256]; -}; - struct LINEMAPENTRY { SCRIPTLINETYPE type; @@ -55,6 +35,7 @@ void scriptabort(); SCRIPTLINETYPE scriptgetlinetype(int line); void scriptsetip(int line); void scriptreset(); +bool scriptgetbranchinfo(int line, SCRIPTBRANCH* info); //script commands CMDRESULT cbScriptLoad(int argc, char* argv[]); diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 125b7e6a..12d16589 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -61,7 +61,8 @@ SOURCES += \ Src/Gui/SettingsDialog.cpp \ Src/Gui/ExceptionRangeDialog.cpp \ Src/Gui/tabbar.cpp \ - Src/Gui/tabwidget.cpp + Src/Gui/tabwidget.cpp \ + Src/BasicView/RichTextPainter.cpp HEADERS += \ @@ -103,7 +104,9 @@ HEADERS += \ Src/Gui/SettingsDialog.h \ Src/Gui/ExceptionRangeDialog.h \ Src/Gui/tabbar.h \ - Src/Gui/tabwidget.h + Src/Gui/tabwidget.h \ + Src/BasicView/RichTextPainter.h + INCLUDEPATH += \ Src \ diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index 1b017a26..cb97f505 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -19,6 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare font.setStyleHint(QFont::Monospace); this->setFont(font); + backgroundColor=QColor(255, 251, 240); int wRowsHeight = QFontMetrics(this->font()).height(); wRowsHeight = (wRowsHeight * 105) / 100; @@ -75,7 +76,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) } // Paints background - wPainter.fillRect(wPainter.viewport(), QBrush(QColor(255, 251, 240))); + wPainter.fillRect(wPainter.viewport(), QBrush(backgroundColor)); // Paints header if(mHeader.isVisible == true) diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h index 7834fbf3..ddfb7187 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h @@ -10,7 +10,6 @@ #include #include - class AbstractTableView : public QAbstractScrollArea { Q_OBJECT @@ -144,6 +143,9 @@ private: bool mShouldReload; ScrollBar64_t mScrollBarAttributes; + +protected: + QColor backgroundColor; }; #endif // ABSTRACTTABLEVIEW_H diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index dc80f691..5738e257 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -37,55 +37,6 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(reloadData())); } -/************************************************************************************ - Private Functions -************************************************************************************/ - -void Disassembly::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText) -{ - int len=richText->size(); - int charwidth=QFontMetrics(this->font()).width(QChar(' ')); - for(int i=0; iat(i); - int curRichTextLength=curRichText.text.length(); - int backgroundWidth=charwidth*curRichTextLength; - if(backgroundWidth+xinc>w) - backgroundWidth=w-xinc; - if(backgroundWidth<=0) //stop drawing when going outside the specified width - break; - switch(curRichText.flags) - { - case FlagNone: //defaults - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - break; - case FlagColor: //color only - painter->save(); - painter->setPen(QPen(curRichText.textColor)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - case FlagBackground: //background only - painter->save(); - if(backgroundWidth>0) - painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - case FlagAll: //color+background - painter->save(); - if(backgroundWidth>0) - painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); - painter->setPen(QPen(curRichText.textColor)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - } - xinc+=charwidth*curRichTextLength; - } -} - - /************************************************************************************ Reimplemented Functions ************************************************************************************/ @@ -286,7 +237,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse QList richText; BeaHighlight::PrintRtfInstruction(&richText, &mInstBuffer.at(rowOffset).disasm); - Disassembly::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText); + RichTextPainter::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText, QFontMetrics(this->font()).width(QChar(' '))); break; } diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index 42f33e88..0f135e5f 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -8,6 +8,7 @@ #include "AbstractTableView.h" #include "QBeaEngine.h" #include "BeaHighlight.h" +#include "RichTextPainter.h" class Disassembly : public AbstractTableView { @@ -15,9 +16,6 @@ class Disassembly : public AbstractTableView public: explicit Disassembly(QWidget *parent = 0); - // Private Functions - void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText); - // Reimplemented Functions QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h); diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp new file mode 100644 index 00000000..a7b71151 --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp @@ -0,0 +1,44 @@ +#include "RichTextPainter.h" + +void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth) +{ + int len=richText->size(); + for(int i=0; iat(i); + int curRichTextLength=curRichText.text.length(); + int backgroundWidth=charwidth*curRichTextLength; + if(backgroundWidth+xinc>w) + backgroundWidth=w-xinc; + if(backgroundWidth<=0) //stop drawing when going outside the specified width + break; + switch(curRichText.flags) + { + case FlagNone: //defaults + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + break; + case FlagColor: //color only + painter->save(); + painter->setPen(QPen(curRichText.textColor)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + case FlagBackground: //background only + painter->save(); + if(backgroundWidth>0) + painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + case FlagAll: //color+background + painter->save(); + if(backgroundWidth>0) + painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); + painter->setPen(QPen(curRichText.textColor)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + } + xinc+=charwidth*curRichTextLength; + } +} diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h new file mode 100644 index 00000000..a3b64137 --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h @@ -0,0 +1,31 @@ +#ifndef RICHTEXTPAINTER_H +#define RICHTEXTPAINTER_H + +#include +#include + +//structures +enum CustomRichTextFlags +{ + FlagNone, + FlagColor, + FlagBackground, + FlagAll +}; + +typedef struct _CustomRichText_t +{ + QString text; + QColor textColor; + QColor textBackground; + CustomRichTextFlags flags; +} CustomRichText_t; + +class RichTextPainter +{ +public: + //functions + static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth); +}; + +#endif // RICHTEXTPAINTER_H diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index 673eb954..449004ea 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -67,17 +67,150 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case 1: //command { + //initialize painter->save(); - if(linetype==linecomment || linetype==linelabel) - painter->setPen(QPen(QColor("#808080"))); //grey text - if(linetype!=linelabel) - returnString=QString(" ") + getCellContent(rowBase+rowOffset, col); - else //label + int charwidth=QFontMetrics(this->font()).width(QChar(' ')); + int xadd=charwidth; //for testing + QList richText; + CustomRichText_t newRichText; + QString command=getCellContent(rowBase+rowOffset, col); + + //handle comments + int comment_idx=command.indexOf("//"); //find the index of the space + QString comment=""; + if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment { - returnString=getCellContent(rowBase+rowOffset, col); - painter->drawLine(QPoint(x+2, y+h-2), QPoint(x+w-4, y+h-2)); + comment=command.right(command.length()-comment_idx); + if(command.at(comment_idx-1)==QChar(' ')) + command.truncate(comment_idx-1); + else + command.truncate(comment_idx); } - painter->drawText(QRect(x+1, y , w , h), Qt::AlignVCenter | Qt::AlignLeft, returnString); + + //setup the richText list + switch(linetype) + { + case linecommand: + { + if(isScriptCommand(command, "ret")) + { + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor(0,255,255); + newRichText.text="ret"; + richText.push_back(newRichText); + QString remainder=command.right(command.length()-3); + if(remainder.length()) + { + newRichText.flags=FlagNone; + newRichText.text=remainder; + richText.push_back(newRichText); + } + } + else + { + newRichText.flags=FlagNone; + newRichText.text=command; + richText.push_back(newRichText); + } + } + break; + + case linebranch: + { + SCRIPTBRANCH branchinfo; + DbgScriptGetBranchInfo(line, &branchinfo); + //jumps + int i=command.indexOf(" "); //find the index of the space + switch(branchinfo.type) + { + case scriptjmp: //unconditional jumps + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor(255,255,0); + break; + + case scriptjnejnz: //conditional jumps + case scriptjejz: + case scriptjbjl: + case scriptjajg: + case scriptjbejle: + case scriptjaejge: + newRichText.flags=FlagAll; + newRichText.textBackground=QColor(255,255,0); + newRichText.textColor=QColor(255,0,0); + break; + + case scriptcall: //calls + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor(0,255,255); + break; + + default: + newRichText.flags=FlagNone; + break; + } + newRichText.text=command.left(i); + richText.push_back(newRichText); + //space + newRichText.flags=FlagNone; + newRichText.text=" "; + richText.push_back(newRichText); + //label + QString label=branchinfo.branchlabel; + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor(255,255,0); + newRichText.text=label; + richText.push_back(newRichText); + //remainder + QString remainder=command.right(command.length()-command.indexOf(label)-label.length()); + if(remainder.length()) + { + newRichText.flags=FlagNone; + newRichText.text=remainder; + richText.push_back(newRichText); + } + } + break; + + case linelabel: + { + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); + newRichText.text=command; + richText.push_back(newRichText); + painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2)); + } + break; + + case linecomment: + { + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); + newRichText.text=command; + richText.push_back(newRichText); + } + break; + + case lineempty: + { + } + break; + } + + //append the comment (when present) + if(comment.length()) + { + CustomRichText_t newRichText; + newRichText.flags=FlagNone; + newRichText.text=" "; + richText.push_back(newRichText); //space + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); + newRichText.text=comment; + richText.push_back(newRichText); //comment + } + + //paint the rich text + RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth); painter->restore(); returnString=""; } @@ -119,6 +252,41 @@ void ScriptView::mouseDoubleClickEvent(QMouseEvent* event) newIp(); } +void ScriptView::keyPressEvent(QKeyEvent* event) +{ + int key = event->key(); + if(key == Qt::Key_Up || key == Qt::Key_Down) + { + int_t botRVA = getTableOffset(); + int_t topRVA = botRVA + getNbrOfLineToPrint() - 1; + if(key == Qt::Key_Up) + selectPrevious(); + else + selectNext(); + if(getInitialSelection() < botRVA) + { + setTableOffset(getInitialSelection()); + } + else if(getInitialSelection() >= topRVA) + { + setTableOffset(getInitialSelection() - getNbrOfLineToPrint() + 2); + } + repaint(); + } + else if(key == Qt::Key_Return || key == Qt::Key_Enter) + { + int line=getInitialSelection()+1; + SCRIPTBRANCH branchinfo; + memset(&branchinfo, 0, sizeof(SCRIPTBRANCH)); + if(DbgScriptGetBranchInfo(line, &branchinfo)) + setSelection(branchinfo.dest); + } + else + { + AbstractTableView::keyPressEvent(event); + } +} + void ScriptView::setupContextMenu() { mLoadMenu = new QMenu("Load Script", this); @@ -178,6 +346,19 @@ void ScriptView::setupContextMenu() connect(mScriptNewIp, SIGNAL(triggered()), this, SLOT(newIp())); } +bool ScriptView::isScriptCommand(QString text, QString cmd) +{ + int len=text.length(); + int cmdlen=cmd.length(); + if(cmdlen>len) + return false; + else if(cmdlen==len) + return (text.compare(cmd, Qt::CaseInsensitive)==0); + else if(text.at(cmdlen)==' ') + return (text.left(cmdlen).compare(cmd, Qt::CaseInsensitive)==0); + return false; +} + //slots void ScriptView::add(int count, const char** lines) { @@ -215,6 +396,21 @@ void ScriptView::setIp(int line) reloadData(); //repaint } +void ScriptView::setSelection(int line) +{ + int offset=line-1; + if(!isValidIndex(offset, 0)) + return; + int rangefrom=getTableOffset(); + int rangeto=rangefrom+getViewableRowsCount()-1; + if(offset(rangeto-1)) //ip lays after the current view + setTableOffset(offset-getViewableRowsCount()+2); + setSingleSelection(offset); + reloadData(); //repaint +} + void ScriptView::error(int line, QString message) { QString title; diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h index defd6f66..a045bba6 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h @@ -20,6 +20,7 @@ public: QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h); void contextMenuEvent(QContextMenuEvent* event); void mouseDoubleClickEvent(QMouseEvent* event); + void keyPressEvent(QKeyEvent* event); public slots: void add(int count, const char** lines); @@ -43,6 +44,8 @@ public slots: private: //private functions void setupContextMenu(); + void setSelection(int line); + bool isScriptCommand(QString text, QString cmd); //private variables int mIpLine; diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp index 2b644096..7381393b 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp @@ -1,9 +1,5 @@ #include "BeaHighlight.h" -BeaHighlight::BeaHighlight() -{ -} - SEGMENTREG BeaHighlight::ConvertBeaSeg(int beaSeg) { switch(beaSeg) diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h index c09164c3..10ec7d12 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h @@ -2,27 +2,11 @@ #define BEAHIGHLIGHT_H #include "QBeaEngine.h" - -enum CustomRichTextFlags -{ - FlagNone, - FlagColor, - FlagBackground, - FlagAll -}; - -typedef struct _CustomRichText_t -{ - QString text; - QColor textColor; - QColor textBackground; - CustomRichTextFlags flags; -} CustomRichText_t; +#include "RichTextPainter.h" class BeaHighlight { public: - BeaHighlight(); static void PrintRtfInstruction(QList* richText, const DISASM* MyDisasm); private: static SEGMENTREG ConvertBeaSeg(int beaSeg); From 8eb711459e590644ff9851eea4a68cbf9a38b788 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 20:47:25 +0200 Subject: [PATCH 005/676] GUI: solved some merge conflicts --- x64_dbg_gui/Project/DebuggerX64.pro | 12 +- x64_dbg_gui/Project/Src/Gui/TabBar.h | 43 ++++++ x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 158 +++++++++++----------- x64_dbg_gui/Project/Src/Gui/tabbar.h | 43 ------ x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 146 ++++++++++---------- x64_dbg_gui/Project/Src/Gui/tabwidget.h | 40 +++--- 6 files changed, 221 insertions(+), 221 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Gui/TabBar.h delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.h diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 12d16589..f94b121c 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -60,9 +60,9 @@ SOURCES += \ Src/BasicView/ThreadView.cpp \ Src/Gui/SettingsDialog.cpp \ Src/Gui/ExceptionRangeDialog.cpp \ - Src/Gui/tabbar.cpp \ - Src/Gui/tabwidget.cpp \ - Src/BasicView/RichTextPainter.cpp + Src/BasicView/RichTextPainter.cpp \ + Src/Gui/TabBar.cpp \ + Src/Gui/TabWidget.cpp HEADERS += \ @@ -103,9 +103,9 @@ HEADERS += \ Src/BasicView/ThreadView.h \ Src/Gui/SettingsDialog.h \ Src/Gui/ExceptionRangeDialog.h \ - Src/Gui/tabbar.h \ - Src/Gui/tabwidget.h \ - Src/BasicView/RichTextPainter.h + Src/BasicView/RichTextPainter.h \ + Src/Gui/TabBar.h \ + Src/Gui/TabWidget.h INCLUDEPATH += \ diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h new file mode 100644 index 00000000..744c2e7e --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/TabBar.h @@ -0,0 +1,43 @@ +#ifndef __MHTABBAR_H__ +#define __MHTABBAR_H__ + +// Qt includes +#include + +// Qt forward class definitions +class MHTabBar; +class QMainWindow; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabBar implements the a Tab Bar with tear-off functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabBar: public QTabBar +{ + Q_OBJECT +public: + MHTabBar (QWidget* parent); + ~MHTabBar (void); + +protected: + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void dropEvent(QDropEvent* event); + +signals: + // Detach Tab + void OnDetachTab (int index, QPoint& dropPoint); + // Move Tab + void OnMoveTab (int fromIndex, int toIndex); + +private: + QPoint m_dragStartPos; + QPoint m_dragMovedPos; + QPoint m_dragDroppedPos; + bool m_dragInitiated; + int m_dragCurrentIndex; +}; + +#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp index 2ebbdb06..8ee99d4f 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp @@ -16,10 +16,10 @@ ////////////////////////////////////////////////////////////// MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) { - setAcceptDrops(true); - setElideMode(Qt::ElideRight); - setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); - setMovable(true); + setAcceptDrops(true); + setElideMode(Qt::ElideRight); + setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); + setMovable(true); } ////////////////////////////////////////////////////////////// @@ -32,116 +32,116 @@ MHTabBar::~MHTabBar(void) ////////////////////////////////////////////////////////////////////////////// void MHTabBar::mousePressEvent(QMouseEvent* event) { - if (event->button() == Qt::LeftButton) - m_dragStartPos = event->pos(); + if (event->button() == Qt::LeftButton) + m_dragStartPos = event->pos(); - m_dragDroppedPos.setX(0); - m_dragDroppedPos.setY(0); - m_dragMovedPos.setX(0); - m_dragMovedPos.setY(0); + m_dragDroppedPos.setX(0); + m_dragDroppedPos.setY(0); + m_dragMovedPos.setX(0); + m_dragMovedPos.setY(0); - m_dragInitiated = false; + m_dragInitiated = false; - QTabBar::mousePressEvent(event); + QTabBar::mousePressEvent(event); } ////////////////////////////////////////////////////////////////////////////// void MHTabBar::mouseMoveEvent(QMouseEvent* event) { - // Distinguish a drag - if ( !m_dragStartPos.isNull() && - ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) - { - m_dragInitiated = true; - } + // Distinguish a drag + if ( !m_dragStartPos.isNull() && + ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) + { + m_dragInitiated = true; + } - // The left button is pressed - // And the move could also be a drag - // And the mouse moved outside the tab bar - if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) - { - // Stop the move to be able to convert to a drag - { - QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - QTabBar::mouseMoveEvent(&finishMoveEvent); - } + // The left button is pressed + // And the move could also be a drag + // And the mouse moved outside the tab bar + if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) + { + // Stop the move to be able to convert to a drag + { + QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QTabBar::mouseMoveEvent(&finishMoveEvent); + } - // A crude way to distinguish tab-reordering drops from other ones - QMimeData* mimeData = new QMimeData; - mimeData->setData("action", "application/tab-detach"); + // A crude way to distinguish tab-reordering drops from other ones + QMimeData* mimeData = new QMimeData; + mimeData->setData("action", "application/tab-detach"); - // Initiate Drag - QDrag* drag = new QDrag(this); - drag->setMimeData(mimeData); + // Initiate Drag + QDrag* drag = new QDrag(this); + drag->setMimeData(mimeData); - // Create transparent screen dump - QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); - QPixmap targetPixmap(pixmap.size()); + // Create transparent screen dump + QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); + QPixmap targetPixmap(pixmap.size()); - QPainter painter(&targetPixmap); - painter.setOpacity(0.5); - painter.drawPixmap(0, 0, pixmap); - painter.end(); + QPainter painter(&targetPixmap); + painter.setOpacity(0.5); + painter.drawPixmap(0, 0, pixmap); + painter.end(); - drag->setPixmap(targetPixmap); + drag->setPixmap(targetPixmap); - // Handle Detach and Move - Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); + // Handle Detach and Move + Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); - if (dragged == Qt::IgnoreAction) - { - event->accept(); - OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); - } - else if (dragged == Qt::MoveAction) - { - if (!m_dragDroppedPos.isNull()) - { - event->accept(); - OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); - } - } + if (dragged == Qt::IgnoreAction) + { + event->accept(); + OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); + } + else if (dragged == Qt::MoveAction) + { + if (!m_dragDroppedPos.isNull()) + { + event->accept(); + OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); + } + } - delete drag; - } - else - { - QTabBar::mouseMoveEvent(event); - } + delete drag; + } + else + { + QTabBar::mouseMoveEvent(event); + } } ////////////////////////////////////////////////////////////////////////////// void MHTabBar::dragEnterEvent(QDragEnterEvent* event) { - // Only accept if it's an tab-reordering request - const QMimeData* m = event->mimeData(); + // Only accept if it's an tab-reordering request + const QMimeData* m = event->mimeData(); - if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) - event->acceptProposedAction(); + if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + event->acceptProposedAction(); - QTabBar::dragEnterEvent(event); + QTabBar::dragEnterEvent(event); } ////////////////////////////////////////////////////////////////////////////// void MHTabBar::dragMoveEvent(QDragMoveEvent* event) { - // Only accept if it's an tab-reordering request - const QMimeData* m = event->mimeData(); + // Only accept if it's an tab-reordering request + const QMimeData* m = event->mimeData(); - if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) - { - m_dragMovedPos = event->pos(); - event->acceptProposedAction(); - } + if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + { + m_dragMovedPos = event->pos(); + event->acceptProposedAction(); + } - QTabBar::dragMoveEvent(event); + QTabBar::dragMoveEvent(event); } ////////////////////////////////////////////////////////////////////////////// void MHTabBar::dropEvent(QDropEvent* event) { - // If a dragged Event is dropped within this widget it is not a drag but a move. - m_dragDroppedPos = event->pos(); + // If a dragged Event is dropped within this widget it is not a drag but a move. + m_dragDroppedPos = event->pos(); - QTabBar::dropEvent(event); + QTabBar::dropEvent(event); } diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.h b/x64_dbg_gui/Project/Src/Gui/tabbar.h deleted file mode 100644 index cfc9627a..00000000 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __MHTABBAR_H__ -#define __MHTABBAR_H__ - -// Qt includes -#include - -// Qt forward class definitions -class MHTabBar; -class QMainWindow; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHTabBar implements the a Tab Bar with tear-off functionality. -////////////////////////////////////////////////////////////////////////////// -class MHTabBar: public QTabBar -{ -Q_OBJECT -public: - MHTabBar (QWidget* parent); - ~MHTabBar (void); - -protected: - void mousePressEvent(QMouseEvent* event); - void mouseMoveEvent(QMouseEvent* event); - void dragEnterEvent(QDragEnterEvent* event); - void dragMoveEvent(QDragMoveEvent* event); - void dropEvent(QDropEvent* event); - -signals: - // Detach Tab - void OnDetachTab (int index, QPoint& dropPoint); - // Move Tab - void OnMoveTab (int fromIndex, int toIndex); - -private: - QPoint m_dragStartPos; - QPoint m_dragMovedPos; - QPoint m_dragDroppedPos; - bool m_dragInitiated; - int m_dragCurrentIndex; -}; - -#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp index faae5b72..4c0d65f2 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -7,14 +7,14 @@ ////////////////////////////////////////////////////////////// MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) { - m_tabBar = new MHTabBar(this); - connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + m_tabBar = new MHTabBar(this); + connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - setTabBar(m_tabBar); - setMovable(true); + setTabBar(m_tabBar); + setMovable(true); - m_Windows.clear(); + m_Windows.clear(); } ////////////////////////////////////////////////////////////// @@ -22,117 +22,117 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) ////////////////////////////////////////////////////////////// MHTabWidget::~MHTabWidget(void) { - disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - delete m_tabBar; + disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + delete m_tabBar; } int MHTabWidget::count() const { - return QTabWidget::count() + m_Windows.size(); + return QTabWidget::count() + m_Windows.size(); } QWidget *MHTabWidget::widget(int index) const { - int baseCount = QTabWidget::count(); + int baseCount = QTabWidget::count(); - // Check if it's just a normal tab - if (index < baseCount) - return QTabWidget::widget(index); + // Check if it's just a normal tab + if (index < baseCount) + return QTabWidget::widget(index); - // Otherwise it's going to be a window - return m_Windows.at(index - baseCount); + // Otherwise it's going to be a window + return m_Windows.at(index - baseCount); } void MHTabWidget::setCurrentIndex(int index) { - // Check if it's just a normal tab - if (index < QTabWidget::count()) - { - QTabWidget::setCurrentIndex(index); - } - else - { - // Otherwise it's going to be a window (just bring it up) - MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); - window->activateWindow(); - } + // Check if it's just a normal tab + if (index < QTabWidget::count()) + { + QTabWidget::setCurrentIndex(index); + } + else + { + // Otherwise it's going to be a window (just bring it up) + MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); + window->activateWindow(); + } } void MHTabWidget::setCurrentWidget(QWidget *widget) { - widget = 0; - // To be implemented. + widget = 0; + // To be implemented. } ////////////////////////////////////////////////////////////////////////////// void MHTabWidget::MoveTab(int fromIndex, int toIndex) { - removeTab(fromIndex); - insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); - setCurrentIndex(toIndex); + removeTab(fromIndex); + insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); + setCurrentIndex(toIndex); } ////////////////////////////////////////////////////////////////////////////// void MHTabWidget::DetachTab(int index, QPoint& dropPoint) { - // Create the window - MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget()); - detachedWidget->setWindowModality(Qt::NonModal); + // Create the window + MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget()); + detachedWidget->setWindowModality(Qt::NonModal); - // Find Widget and connect - connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + // Find Widget and connect + connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - detachedWidget->setWindowTitle(tabText(index)); - detachedWidget->setWindowIcon(tabIcon(index)); + detachedWidget->setWindowTitle(tabText(index)); + detachedWidget->setWindowIcon(tabIcon(index)); - // Remove from tab bar - QWidget* tearOffWidget = widget(index); - tearOffWidget->setParent(detachedWidget); + // Remove from tab bar + QWidget* tearOffWidget = widget(index); + tearOffWidget->setParent(detachedWidget); - // Add it to the windows list - m_Windows.append(tearOffWidget); + // Add it to the windows list + m_Windows.append(tearOffWidget); - // Make first active - if (count() > 0) - setCurrentIndex(0); + // Make first active + if (count() > 0) + setCurrentIndex(0); - // Create and show - detachedWidget->setCentralWidget(tearOffWidget); + // Create and show + detachedWidget->setCentralWidget(tearOffWidget); - // Needs to be done explicitly - tearOffWidget->show(); - detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480); - detachedWidget->show(); + // Needs to be done explicitly + tearOffWidget->show(); + detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480); + detachedWidget->show(); } ////////////////////////////////////////////////////////////////////////////// void MHTabWidget::AttachTab(QWidget *parent) { - // Retrieve widget - MHDetachedWindow* detachedWidget = dynamic_cast(parent); - QWidget* tearOffWidget = detachedWidget->centralWidget(); + // Retrieve widget + MHDetachedWindow* detachedWidget = dynamic_cast(parent); + QWidget* tearOffWidget = detachedWidget->centralWidget(); - // Change parent - tearOffWidget->setParent(this); + // Change parent + tearOffWidget->setParent(this); - // Reattach the tab - int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); + // Reattach the tab + int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); - // Remove it from the windows list - for(int i = 0; i < m_Windows.size(); i++) - { - if (m_Windows.at(i) == tearOffWidget) - m_Windows.removeAt(i); - } + // Remove it from the windows list + for(int i = 0; i < m_Windows.size(); i++) + { + if (m_Windows.at(i) == tearOffWidget) + m_Windows.removeAt(i); + } - // Make Active - if (newIndex != -1) - setCurrentIndex(newIndex); + // Make Active + if (newIndex != -1) + setCurrentIndex(newIndex); - // Cleanup Window - disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - delete detachedWidget; + // Cleanup Window + disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + delete detachedWidget; } //---------------------------------------------------------------------------- @@ -150,6 +150,6 @@ MHDetachedWindow::~MHDetachedWindow(void) ////////////////////////////////////////////////////////////////////////////// void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) { - emit OnClose(this); + emit OnClose(this); } diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h index 5e134f04..252c8c24 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h @@ -16,35 +16,35 @@ class MHTabBar; ////////////////////////////////////////////////////////////////////////////// class MHTabWidget: public QTabWidget { - Q_OBJECT + Q_OBJECT public: - MHTabWidget(QWidget *parent); - virtual ~MHTabWidget(void); + MHTabWidget(QWidget *parent); + virtual ~MHTabWidget(void); public slots: - int count() const; - QWidget *widget(int index) const; + int count() const; + QWidget *widget(int index) const; - // Move Tab - void MoveTab(int fromIndex, int toIndex); + // Move Tab + void MoveTab(int fromIndex, int toIndex); - // Detach Tab - void DetachTab(int index, QPoint&); + // Detach Tab + void DetachTab(int index, QPoint&); - // Attach Tab - void AttachTab(QWidget *parent); + // Attach Tab + void AttachTab(QWidget *parent); public Q_SLOTS: - void setCurrentIndex(int index); - void setCurrentWidget(QWidget *widget); + void setCurrentIndex(int index); + void setCurrentWidget(QWidget *widget); protected: private: - MHTabBar* m_tabBar; + MHTabBar* m_tabBar; - QList m_Windows; + QList m_Windows; }; ////////////////////////////////////////////////////////////////////////////// @@ -56,16 +56,16 @@ private: ////////////////////////////////////////////////////////////////////////////// class MHDetachedWindow : public QMainWindow { - Q_OBJECT + Q_OBJECT public: - MHDetachedWindow(QWidget *parent = 0); - ~MHDetachedWindow(void); + MHDetachedWindow(QWidget *parent = 0); + ~MHDetachedWindow(void); protected: - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent *event); signals: - void OnClose (QWidget* widget); + void OnClose (QWidget* widget); }; #endif // __MHTABWIDGET_H__ From 9f514b275135473ecda71635a7ce06b30ba092a1 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 21:15:40 +0200 Subject: [PATCH 006/676] GUI: hex color codes everywhere (custom colors coming soon!) --- .../Src/BasicView/AbstractTableView.cpp | 243 +++++++++--------- .../Project/Src/BasicView/Disassembly.cpp | 18 +- x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 2 +- .../Project/Src/BasicView/RegistersView.cpp | 2 +- .../Project/Src/BasicView/ScriptView.cpp | 14 +- .../Project/Src/BasicView/StdTable.cpp | 2 +- .../Project/Src/BasicView/ThreadView.cpp | 2 +- .../Project/Src/Disassembler/BeaHighlight.cpp | 22 +- x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 2 +- 9 files changed, 154 insertions(+), 153 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index cb97f505..ce0e03bc 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -19,7 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare font.setStyleHint(QFont::Monospace); this->setFont(font); - backgroundColor=QColor(255, 251, 240); + backgroundColor=QColor("#FFFBF0"); int wRowsHeight = QFontMetrics(this->font()).height(); wRowsHeight = (wRowsHeight * 105) / 100; @@ -110,13 +110,14 @@ void AbstractTableView::paintEvent(QPaintEvent* event) // Paints cell contents if(i < mNbrOfLineToPrint) { - QString wStr = paintContent(&wPainter, mTableOffset, i, j, x, y, getColumnWidth(j), getRowHeight()); - wPainter.drawText(QRect(x + 4, y, getColumnWidth(j) - 4, getRowHeight()), Qt::AlignVCenter | Qt::AlignLeft, wStr); + QString wStr = paintContent(&wPainter, mTableOffset, i, j, x, y, getColumnWidth(j), getRowHeight()); + if(wStr.length()) + wPainter.drawText(QRect(x + 4, y, getColumnWidth(j) - 4, getRowHeight()), Qt::AlignVCenter | Qt::AlignLeft, wStr); } // Paints cell right borders - wPainter.save() ; - wPainter.setPen(QColor(128, 128, 128)); + wPainter.save(); + wPainter.setPen(QColor("#808080")); wPainter.drawLine(x + getColumnWidth(j) - 1, y, x + getColumnWidth(j) - 1, y + getRowHeight() - 1); wPainter.restore(); @@ -144,118 +145,118 @@ void AbstractTableView::paintEvent(QPaintEvent* event) */ void AbstractTableView::mouseMoveEvent(QMouseEvent* event) { - // qDebug() << "mouseMoveEvent"; + // qDebug() << "mouseMoveEvent"; switch (mGuiState) { - case AbstractTableView::NoState: + case AbstractTableView::NoState: + { + //qDebug() << "State = NoState"; + + int wColIndex = getColumnIndexFromX(event->x()); + int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column + int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column + + if(event->buttons() == Qt::NoButton) { - //qDebug() << "State = NoState"; + bool wHandle = true; + bool wHasCursor; - int wColIndex = getColumnIndexFromX(event->x()); - int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column - int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column + wHasCursor = cursor().shape() == Qt::SplitHCursor ? true : false; - if(event->buttons() == Qt::NoButton) + if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2)))) { - bool wHandle = true; - bool wHasCursor; - - wHasCursor = cursor().shape() == Qt::SplitHCursor ? true : false; - - if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2)))) - { - wHandle = true; - } - else - { - wHandle = false; - } - - if((wHandle == true) && (wHasCursor == false)) - { - setCursor(Qt::SplitHCursor); - mColResizeData.splitHandle = true; - mGuiState = AbstractTableView::ReadyToResize; - } - if ((wHandle == false) && (wHasCursor == true)) - { - unsetCursor(); - mColResizeData.splitHandle = false; - mGuiState = AbstractTableView::NoState; - } + wHandle = true; } else { - QWidget::mouseMoveEvent(event); + wHandle = false; } - break; - } - case AbstractTableView::ReadyToResize: - { - //qDebug() << "State = ReadyToResize"; - int wColIndex = getColumnIndexFromX(event->x()); - int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column - int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column - - if(event->buttons() == Qt::NoButton) + if((wHandle == true) && (wHasCursor == false)) { - bool wHandle = true; - - if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2)))) - { - wHandle = true; - } - else - { - wHandle = false; - } - - if ((wHandle == false) && (mGuiState == AbstractTableView::ReadyToResize)) - { - unsetCursor(); - mColResizeData.splitHandle = false; - mGuiState = AbstractTableView::NoState; - } + setCursor(Qt::SplitHCursor); + mColResizeData.splitHandle = true; + mGuiState = AbstractTableView::ReadyToResize; } - break; - } - case AbstractTableView::ResizeColumnState: - { - //qDebug() << "State = ResizeColumnState"; - - int delta = event->x() - mColResizeData.lastPosX; - - int wNewSize = ((getColumnWidth(mColResizeData.index) + delta) >= 20) ? (getColumnWidth(mColResizeData.index) + delta) : (20); - - setColumnWidth(mColResizeData.index, wNewSize); - - mColResizeData.lastPosX = event->x(); - - repaint(); - - break; - } - case AbstractTableView::HeaderButtonPressed: - { - //qDebug() << "State = HeaderButtonPressed"; - - int wColIndex = getColumnIndexFromX(event->x()); - - if((wColIndex == mHeader.activeButtonIndex) && (event->y() <= getHeaderHeight()) && (event->y() >= 0)) + if ((wHandle == false) && (wHasCursor == true)) { - mColumnList[mHeader.activeButtonIndex].header.isMouseOver = true; + unsetCursor(); + mColResizeData.splitHandle = false; + mGuiState = AbstractTableView::NoState; + } + } + else + { + QWidget::mouseMoveEvent(event); + } + break; + } + case AbstractTableView::ReadyToResize: + { + //qDebug() << "State = ReadyToResize"; + + int wColIndex = getColumnIndexFromX(event->x()); + int wStartPos = getColumnPosition(wColIndex); // Position X of the start of column + int wEndPos = getColumnPosition(wColIndex) + getColumnWidth(wColIndex); // Position X of the end of column + + if(event->buttons() == Qt::NoButton) + { + bool wHandle = true; + + if(((wColIndex != 0) && (event->x() >= wStartPos) && (event->x() <= (wStartPos + 2))) || ((wColIndex != (getColumnCount() - 1)) && (event->x() <= wEndPos) && (event->x() >= (wEndPos - 2)))) + { + wHandle = true; } else { - mColumnList[mHeader.activeButtonIndex].header.isMouseOver = false; + wHandle = false; } - repaint(); + if ((wHandle == false) && (mGuiState == AbstractTableView::ReadyToResize)) + { + unsetCursor(); + mColResizeData.splitHandle = false; + mGuiState = AbstractTableView::NoState; + } } - default: - break; + break; + } + case AbstractTableView::ResizeColumnState: + { + //qDebug() << "State = ResizeColumnState"; + + int delta = event->x() - mColResizeData.lastPosX; + + int wNewSize = ((getColumnWidth(mColResizeData.index) + delta) >= 20) ? (getColumnWidth(mColResizeData.index) + delta) : (20); + + setColumnWidth(mColResizeData.index, wNewSize); + + mColResizeData.lastPosX = event->x(); + + repaint(); + + break; + } + case AbstractTableView::HeaderButtonPressed: + { + //qDebug() << "State = HeaderButtonPressed"; + + int wColIndex = getColumnIndexFromX(event->x()); + + if((wColIndex == mHeader.activeButtonIndex) && (event->y() <= getHeaderHeight()) && (event->y() >= 0)) + { + mColumnList[mHeader.activeButtonIndex].header.isMouseOver = true; + } + else + { + mColumnList[mHeader.activeButtonIndex].header.isMouseOver = false; + } + + repaint(); + } + default: + break; } } @@ -454,31 +455,31 @@ void AbstractTableView::vertSliderActionSlot(int action) // Determine the delta switch(action) { - case QAbstractSlider::SliderNoAction: - break; - case QAbstractSlider::SliderSingleStepAdd: - wDelta = 1; - break; - case QAbstractSlider::SliderSingleStepSub: - wDelta = -1; - break; - case QAbstractSlider::SliderPageStepAdd: - wDelta = 30; - break; - case QAbstractSlider::SliderPageStepSub: - wDelta = -30; - break; - case QAbstractSlider::SliderToMinimum: - case QAbstractSlider::SliderToMaximum: - case QAbstractSlider::SliderMove: + case QAbstractSlider::SliderNoAction: + break; + case QAbstractSlider::SliderSingleStepAdd: + wDelta = 1; + break; + case QAbstractSlider::SliderSingleStepSub: + wDelta = -1; + break; + case QAbstractSlider::SliderPageStepAdd: + wDelta = 30; + break; + case QAbstractSlider::SliderPageStepSub: + wDelta = -30; + break; + case QAbstractSlider::SliderToMinimum: + case QAbstractSlider::SliderToMaximum: + case QAbstractSlider::SliderMove: #ifdef _WIN64 - wDelta = scaleFromScrollBarRangeToUint64(wSliderPos) - mTableOffset; + wDelta = scaleFromScrollBarRangeToUint64(wSliderPos) - mTableOffset; #else - wDelta = wSliderPos - mTableOffset; + wDelta = wSliderPos - mTableOffset; #endif - break; - default: - break; + break; + default: + break; } // Call the hook (Usefull for disassembly) @@ -783,9 +784,9 @@ void AbstractTableView::setColTitle(int index, QString title) { if(mColumnList.size() > 0 && index >= 0 && index < mColumnList.size()) { - Column_t wColum = mColumnList.takeAt(index); - wColum.title = title; - mColumnList.insert(index - 1, wColum); + Column_t wColum = mColumnList.takeAt(index); + wColum.title = title; + mColumnList.insert(index - 1, wColum); } } diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 5738e257..a02259a9 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -92,16 +92,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse { if(bpxtype&bp_normal) //breakpoint { - painter->setPen(QPen(QColor("#ff0000"))); + painter->setPen(QPen(QColor("#FF0000"))); } else { - painter->setPen(QPen(QColor("#fffbf0"))); + painter->setPen(QPen(QColor("#FFFBF0"))); } } else { - painter->setPen(QPen(QColor("#fee970"))); + painter->setPen(QPen(QColor("#FEE970"))); } } else //other address @@ -111,12 +111,12 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(*label) //label { if(bpxtype==bp_none) //label only - painter->setPen(QPen(QColor("#ff0000"))); //red -> address + label text + painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text else //label+breakpoint { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red } else { @@ -137,7 +137,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); //fill red + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red } else { @@ -151,7 +151,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse } else { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#fee970"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970"))); if(wIsSelected) painter->setPen(QPen(QColor("#000000"))); //black address else @@ -543,9 +543,9 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, int_t addr) painter->save() ; if(DbgIsJumpGoingToExecute(instruction.rva+mBase)) //change pen color when jump is executed - painter->setPen(QColor(255, 0, 0)); + painter->setPen(QColor("#FF0000")); else - painter->setPen(QColor(128, 128, 128)); + painter->setPen(QColor("#808080")); if(wPict == GD_Vert) { diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp index 25b740cb..3aec7fe2 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp @@ -209,7 +209,7 @@ void HexDump::printSelected(QPainter* painter, int_t rowBase, int rowOffset, int wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth; wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth; - painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor(192,192,192))); + painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0"))); } } } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 06ac2337..15f6f4db 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -13,7 +13,7 @@ RegistersView::RegistersView(QWidget *parent) : QWidget(parent), ui(new Ui::Regi // Set background color QPalette wPalette; - wPalette.setColor(QPalette::Window, QColor(255, 251, 240)); + wPalette.setColor(QPalette::Window, QColor("#FFFBF0")); this->setAutoFillBackground(true); this->setPalette(wPalette); diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index 449004ea..65145d7f 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -49,7 +49,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset } else if(DbgScriptBpGet(line)) //breakpoint { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#ff0000"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); painter->setPen(QPen(QColor("#000000"))); //black address } else @@ -95,7 +95,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset if(isScriptCommand(command, "ret")) { newRichText.flags=FlagBackground; - newRichText.textBackground=QColor(0,255,255); + newRichText.textBackground=QColor("#00FFFF"); newRichText.text="ret"; richText.push_back(newRichText); QString remainder=command.right(command.length()-3); @@ -125,7 +125,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset { case scriptjmp: //unconditional jumps newRichText.flags=FlagBackground; - newRichText.textBackground=QColor(255,255,0); + newRichText.textBackground=QColor("#FFFF00"); break; case scriptjnejnz: //conditional jumps @@ -135,13 +135,13 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case scriptjbejle: case scriptjaejge: newRichText.flags=FlagAll; - newRichText.textBackground=QColor(255,255,0); - newRichText.textColor=QColor(255,0,0); + newRichText.textBackground=QColor("#FFFF00"); + newRichText.textColor=QColor("#FF0000"); break; case scriptcall: //calls newRichText.flags=FlagBackground; - newRichText.textBackground=QColor(0,255,255); + newRichText.textBackground=QColor("#00FFFF"); break; default: @@ -157,7 +157,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset //label QString label=branchinfo.branchlabel; newRichText.flags=FlagBackground; - newRichText.textBackground=QColor(255,255,0); + newRichText.textBackground=QColor("#FFFF00"); newRichText.text=label; richText.push_back(newRichText); //remainder diff --git a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp index 3e1d69ef..63917bb8 100644 --- a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp @@ -23,7 +23,7 @@ StdTable::StdTable(QWidget *parent) : AbstractTableView(parent) QString StdTable::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h) { if(isSelected(rowBase, rowOffset) == true) - painter->fillRect(QRect(x, y, w, h), QBrush(QColor(192,192,192))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#808080"))); //return "c " + QString::number(col) + " r " + QString::number(rowBase + rowOffset); return mData->at(col)->at(rowBase + rowOffset); diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp index 1bf8adcd..540607d8 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp @@ -201,7 +201,7 @@ QString ThreadView::paintContent(QPainter* painter, int_t rowBase, int rowOffset { painter->save(); painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); - painter->setPen(QPen(QColor("#ffffff"))); //white text + painter->setPen(QPen(QColor("#FFFFFF"))); //white text painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, ret); painter->restore(); ret=""; diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp index 7381393b..6acd9376 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp @@ -71,13 +71,13 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP int basereg=Argument->Memory.BaseRegister; if(basereg®4 || basereg®5) //esp || ebp { - argument.textBackground=QColor(0,255,255); + argument.textBackground=QColor("#00FFFF"); argument.flags=FlagBackground; //Highlight ESP || EBP memory move } else { - argument.textColor=QColor(0,0,128); + argument.textColor=QColor("#000080"); argument.flags=FlagColor; } @@ -144,7 +144,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(argmnemonic.indexOf(label_addr_text)!=-1) { argument.flags=FlagBackground; - argument.textBackground=QColor(255,255,0); + argument.textBackground=QColor("#FFFF00"); argmnemonic.replace(label_addr_text, newText); } } @@ -154,7 +154,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(argmnemonic.indexOf(label_addr_text)!=-1) { argument.flags=FlagBackground; - argument.textBackground=QColor(255,255,0); + argument.textBackground=QColor("#FFFF00"); argmnemonic.replace(label_addr_text, newText); } } @@ -173,7 +173,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(brtype && brtype!=RetType && !(argtype®ISTER_TYPE)) { argument.flags=FlagBackground; - argument.textBackground=QColor(255,255,0); + argument.textBackground=QColor("#FFFF00"); unsigned char* opc=(unsigned char*)&Instruction->Opcode; if(*opc==0xEB || *opc==0xE9 || Instruction->Opcode<0x80) @@ -207,33 +207,33 @@ void BeaHighlight::PrintBaseInstruction(QList* richText, const if(brtype==RetType || brtype==CallType) { mnemonic.flags=FlagBackground; - mnemonic.textBackground=QColor(0,255,255); + mnemonic.textBackground=QColor("#00FFFF"); //calls && rets } else if(brtype==JmpType) { mnemonic.flags=FlagBackground; - mnemonic.textBackground=QColor(255,255,0); + mnemonic.textBackground=QColor("#FFFF00"); //uncond jumps } else { mnemonic.flags=FlagAll; - mnemonic.textBackground=QColor(255,255,0); - mnemonic.textColor=QColor(255,0,0); + mnemonic.textBackground=QColor("#FFFF00"); + mnemonic.textColor=QColor("#FF0000"); //cond jumps } } else if(!_stricmp(mnemonicText, "push") || !_stricmp(mnemonicText, "pop")) { mnemonic.flags=FlagColor; - mnemonic.textColor=QColor(0,0,255); + mnemonic.textColor=QColor("#0000FF"); //push/pop } else if(!_stricmp(mnemonicText, "nop")) { mnemonic.flags=FlagColor; - mnemonic.textColor=QColor(128,128,128); + mnemonic.textColor=QColor("#808080"); //nop } else diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp index 63213ed3..4669e538 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp @@ -77,7 +77,7 @@ QString CPUStack::paintContent(QPainter* painter, int_t rowBase, int rowOffset, if(wVa==mCsp) //CSP { painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); - painter->setPen(QPen(QColor("#fffbf0"))); + painter->setPen(QPen(QColor("#FFFBF0"))); } else if(wIsSelected) painter->setPen(QPen(QColor("#000000"))); //black address From ebfca9adf7a71c2b62ddb074f90f31871655e88f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 21:19:01 +0200 Subject: [PATCH 007/676] GUI: color fix in StdTable --- x64_dbg_gui/Project/Src/BasicView/StdTable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp index 63917bb8..11f03b3c 100644 --- a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp @@ -23,7 +23,7 @@ StdTable::StdTable(QWidget *parent) : AbstractTableView(parent) QString StdTable::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h) { if(isSelected(rowBase, rowOffset) == true) - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#808080"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //return "c " + QString::number(col) + " r " + QString::number(rowBase + rowOffset); return mData->at(col)->at(rowBase + rowOffset); From 4c848c16c384d61b92fc389c8bba6ad2e7eb9915 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 21:35:11 +0200 Subject: [PATCH 008/676] GUI: fixed a bug when tabs are detached --- x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp index 8ee99d4f..209b9917 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp @@ -113,11 +113,13 @@ void MHTabBar::mouseMoveEvent(QMouseEvent* event) ////////////////////////////////////////////////////////////////////////////// void MHTabBar::dragEnterEvent(QDragEnterEvent* event) { - // Only accept if it's an tab-reordering request + // Only accept if it's an tab-reordering request (not a detach request) const QMimeData* m = event->mimeData(); - if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) + { event->acceptProposedAction(); + } QTabBar::dragEnterEvent(event); } @@ -125,10 +127,10 @@ void MHTabBar::dragEnterEvent(QDragEnterEvent* event) ////////////////////////////////////////////////////////////////////////////// void MHTabBar::dragMoveEvent(QDragMoveEvent* event) { - // Only accept if it's an tab-reordering request + // Only accept if it's an tab-reordering request (not a detach request) const QMimeData* m = event->mimeData(); - if (m->formats().contains("action") && (m->data("action") == "application/tab-detach")) + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) { m_dragMovedPos = event->pos(); event->acceptProposedAction(); From 0a115ec8f3c4d926c61380b4d6e70338e92347da Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 26 Apr 2014 23:01:01 +0200 Subject: [PATCH 009/676] GUI: color commenting --- .../Src/BasicView/AbstractTableView.cpp | 4 +- .../Project/Src/BasicView/Disassembly.cpp | 63 ++++++++++--------- x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 4 +- .../Project/Src/BasicView/ScriptView.cpp | 16 ++--- .../Project/Src/Disassembler/BeaHighlight.cpp | 22 +++---- 5 files changed, 58 insertions(+), 51 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index ce0e03bc..6790e488 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -19,7 +19,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare font.setStyleHint(QFont::Monospace); this->setFont(font); - backgroundColor=QColor("#FFFBF0"); + backgroundColor=QColor("#FFFBF0"); //AbstractTableViewBackgroundColor int wRowsHeight = QFontMetrics(this->font()).height(); wRowsHeight = (wRowsHeight * 105) / 100; @@ -117,7 +117,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) // Paints cell right borders wPainter.save(); - wPainter.setPen(QColor("#808080")); + wPainter.setPen(QColor("#808080")); //AbstractTableViewSeparatorColor wPainter.drawLine(x + getColumnWidth(j) - 1, y, x + getColumnWidth(j) - 1, y + getRowHeight() - 1); wPainter.restore(); diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index a02259a9..f9c8d023 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -32,6 +32,8 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) setShowHeader(false); //hide header + backgroundColor=QColor("#FFFBF0"); //DisassemblyBackgroundColor + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(reloadData())); @@ -57,13 +59,12 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) */ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h) { - QString wStr = ""; int_t wRVA = mInstBuffer.at(rowOffset).rva; bool wIsSelected = isSelected(&mInstBuffer, rowOffset); // isSelected(rowBase, rowOffset); // Highlight if selected if(wIsSelected) - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //DisassemblySelectionColor switch(col) { @@ -87,21 +88,21 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->save(); if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); //DisassemblyCipColor if(!isbookmark) { if(bpxtype&bp_normal) //breakpoint { - painter->setPen(QPen(QColor("#FF0000"))); + painter->setPen(QPen(QColor("#FF0000"))); //DisassemblyMainBpColor } else { - painter->setPen(QPen(QColor("#FFFBF0"))); + painter->setPen(QPen(QColor("#FFFBF0"))); //DisassemblyOtherBpColor } } else { - painter->setPen(QPen(QColor("#FEE970"))); + painter->setPen(QPen(QColor("#FEE970"))); //DisassemblyBookmarkColor } } else //other address @@ -111,16 +112,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(*label) //label { if(bpxtype==bp_none) //label only - painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text + painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text (DisassemblyMainLabelColor) else //label+breakpoint { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor) } else { - painter->setPen(QPen(QColor("#000000"))); //black address + painter->setPen(QPen(QColor("#000000"))); //black address (???) } } } @@ -129,33 +130,33 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(bpxtype==bp_none) //no label, no breakpoint { if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address + painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); + painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor } else //breakpoint only { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor) } else { if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address + painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); + painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor } } } } - else + else //bookmark { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970"))); //DisassemblyBookmarkColor if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address + painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); + painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor } } painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText); @@ -192,13 +193,14 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse int jumpsize = paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line //draw bytes + painter->save(); + painter->setPen(QColor("#000000")); //DisassemblyBytesColor + QString wBytes = ""; for(int i = 0; i < mInstBuffer.at(rowOffset).dump.size(); i++) - wStr += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper(); - - painter->drawText(QRect(x + jumpsize + funcsize, y, getColumnWidth(col) - jumpsize - funcsize, getRowHeight()), 0, wStr); - - wStr = ""; + wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper(); + painter->drawText(QRect(x + jumpsize + funcsize, y, getColumnWidth(col) - jumpsize - funcsize, getRowHeight()), 0, wBytes); + painter->restore(); break; } @@ -245,9 +247,12 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse { char comment[MAX_COMMENT_SIZE]=""; if(DbgGetCommentAt(mInstBuffer.at(rowOffset).rva+mBase, comment)) - wStr=QString(comment); - else - wStr=""; + { + painter->save(); + painter->setPen(QColor("#000000")); //DisassemblyCommentColor + painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); + painter->restore(); + } } break; @@ -255,7 +260,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse break; } - return wStr; + return ""; } @@ -543,9 +548,9 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, int_t addr) painter->save() ; if(DbgIsJumpGoingToExecute(instruction.rva+mBase)) //change pen color when jump is executed - painter->setPen(QColor("#FF0000")); + painter->setPen(QColor("#FF0000")); //DisassemblyJumpLineTrueColor else - painter->setPen(QColor("#808080")); + painter->setPen(QColor("#808080")); //DisassemblyJumpLineFalseColor if(wPict == GD_Vert) { diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp index 3aec7fe2..dfa6456c 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp @@ -17,6 +17,8 @@ HexDump::HexDump(QWidget *parent) : AbstractTableView(parent) clearDescriptors(); + backgroundColor=QColor("#FFFBF0"); //HexDumpBackgroundColor + connect(Bridge::getBridge(), SIGNAL(updateDump()), this, SLOT(reloadData())); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChanged(DBGSTATE))); } @@ -209,7 +211,7 @@ void HexDump::printSelected(QPainter* painter, int_t rowBase, int rowOffset, int wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth; wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth; - painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0"))); + painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(QColor("#C0C0C0"))); //HexDumpSelectionColor } } } diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index 65145d7f..4dd11ecb 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -29,7 +29,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset bool wIsSelected=isSelected(rowBase, rowOffset); // Highlight if selected if(wIsSelected) - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //ScriptViewSelectionColor QString returnString; int line=rowBase+rowOffset+1; SCRIPTLINETYPE linetype=DbgScriptGetLineType(line); @@ -41,23 +41,23 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset painter->save(); if(line==mIpLine) //IP { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); //ScriptViewIpColor if(DbgScriptBpGet(line)) //breakpoint - painter->setPen(QPen(QColor("#FF0000"))); //red address + painter->setPen(QPen(QColor("#FF0000"))); //red address (ScriptViewMainBpColor) else - painter->setPen(QPen(QColor("#FFFFFF"))); //white address + painter->setPen(QPen(QColor("#FFFFFF"))); //white address (ScriptViewIpTextColor) } else if(DbgScriptBpGet(line)) //breakpoint { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); - painter->setPen(QPen(QColor("#000000"))); //black address + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //ScriptViewMainBpColor + painter->setPen(QPen(QColor("#000000"))); //black address //ScripViewMainBpTextColor } else { if(linetype==linecommand || linetype==linebranch) - painter->setPen(QPen(QColor("#000000"))); //black address + painter->setPen(QPen(QColor("#000000"))); //black address (ScriptViewMainTextColor) else - painter->setPen(QPen(QColor("#808080"))); //grey address + painter->setPen(QPen(QColor("#808080"))); //grey address (ScriptViewOtherTextColor) } painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, returnString); painter->restore(); diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp index 6acd9376..a81d186b 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.cpp @@ -71,13 +71,13 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP int basereg=Argument->Memory.BaseRegister; if(basereg®4 || basereg®5) //esp || ebp { - argument.textBackground=QColor("#00FFFF"); + argument.textBackground=QColor("#00FFFF"); //DisassemblyStackPointerColor argument.flags=FlagBackground; //Highlight ESP || EBP memory move } else { - argument.textColor=QColor("#000080"); + argument.textColor=QColor("#000080"); //DisassemblyPointerColor argument.flags=FlagColor; } @@ -144,7 +144,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(argmnemonic.indexOf(label_addr_text)!=-1) { argument.flags=FlagBackground; - argument.textBackground=QColor("#FFFF00"); + argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor argmnemonic.replace(label_addr_text, newText); } } @@ -154,7 +154,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(argmnemonic.indexOf(label_addr_text)!=-1) { argument.flags=FlagBackground; - argument.textBackground=QColor("#FFFF00"); + argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor argmnemonic.replace(label_addr_text, newText); } } @@ -173,7 +173,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP if(brtype && brtype!=RetType && !(argtype®ISTER_TYPE)) { argument.flags=FlagBackground; - argument.textBackground=QColor("#FFFF00"); + argument.textBackground=QColor("#FFFF00"); //DisassemblyModulePointerColor unsigned char* opc=(unsigned char*)&Instruction->Opcode; if(*opc==0xEB || *opc==0xE9 || Instruction->Opcode<0x80) @@ -207,33 +207,33 @@ void BeaHighlight::PrintBaseInstruction(QList* richText, const if(brtype==RetType || brtype==CallType) { mnemonic.flags=FlagBackground; - mnemonic.textBackground=QColor("#00FFFF"); + mnemonic.textBackground=QColor("#00FFFF"); //DisassemblyRetCallColor //calls && rets } else if(brtype==JmpType) { mnemonic.flags=FlagBackground; - mnemonic.textBackground=QColor("#FFFF00"); + mnemonic.textBackground=QColor("#FFFF00"); //DisassemblyJumpColor //uncond jumps } else { mnemonic.flags=FlagAll; - mnemonic.textBackground=QColor("#FFFF00"); - mnemonic.textColor=QColor("#FF0000"); + mnemonic.textBackground=QColor("#FFFF00"); //DisassemblyJumpColor + mnemonic.textColor=QColor("#FF0000"); //DisassemblyCondJumpColor //cond jumps } } else if(!_stricmp(mnemonicText, "push") || !_stricmp(mnemonicText, "pop")) { mnemonic.flags=FlagColor; - mnemonic.textColor=QColor("#0000FF"); + mnemonic.textColor=QColor("#0000FF"); //DisassemblyPushPopColor //push/pop } else if(!_stricmp(mnemonicText, "nop")) { mnemonic.flags=FlagColor; - mnemonic.textColor=QColor("#808080"); + mnemonic.textColor=QColor("#808080"); //DisassemblyNopColor //nop } else From ddc365afd854857efae5ff65bb00b26a401f6b80 Mon Sep 17 00:00:00 2001 From: Nukem Date: Sat, 26 Apr 2014 19:16:04 -0400 Subject: [PATCH 010/676] GUI: Allow windows to be dragged into tabs --- x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 28 +++++++++++++++++++---- x64_dbg_gui/Project/Src/Gui/tabwidget.h | 10 +++++--- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp index 4c0d65f2..476d0e3c 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -77,7 +77,7 @@ void MHTabWidget::MoveTab(int fromIndex, int toIndex) void MHTabWidget::DetachTab(int index, QPoint& dropPoint) { // Create the window - MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget()); + MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); detachedWidget->setWindowModality(Qt::NonModal); // Find Widget and connect @@ -138,8 +138,9 @@ void MHTabWidget::AttachTab(QWidget *parent) //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// -MHDetachedWindow::MHDetachedWindow(QWidget *parent) : QMainWindow(parent) +MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent) { + m_TabWidget = tabwidget; } ////////////////////////////////////////////////////////////////////////////// @@ -147,9 +148,28 @@ MHDetachedWindow::~MHDetachedWindow(void) { } +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::moveEvent(QMoveEvent *event) +{ + QRect rect = m_TabWidget->geometry(); + QSize hint = m_TabWidget->tabBar()->sizeHint(); + + // Height of the actual top tab bar (with a buffer of 30) + rect.setBottom(rect.top() + hint.height() + 30); + + if (rect.contains(event->pos())) + { + m_TabWidget->AttachTab(this); + event->accept(); + } + else + { + QMainWindow::moveEvent(event); + } +} + ////////////////////////////////////////////////////////////////////////////// void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) { emit OnClose(this); -} - +} \ No newline at end of file diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h index 252c8c24..2b1b3510 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h @@ -5,6 +5,7 @@ #include #include #include +#include // Qt forward class definitions class MHTabBar; @@ -56,16 +57,19 @@ private: ////////////////////////////////////////////////////////////////////////////// class MHDetachedWindow : public QMainWindow { - Q_OBJECT + Q_OBJECT public: - MHDetachedWindow(QWidget *parent = 0); + MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0); ~MHDetachedWindow(void); protected: + MHTabWidget *m_TabWidget; + + virtual void moveEvent(QMoveEvent *event); void closeEvent(QCloseEvent *event); signals: - void OnClose (QWidget* widget); + void OnClose(QWidget* widget); }; #endif // __MHTABWIDGET_H__ From 4008a80322340b7a89e08915d420ff65e8d8bccc Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 27 Apr 2014 03:13:12 +0200 Subject: [PATCH 011/676] GUI: fixed crashes with Qt4 --- x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 13 ++++++++----- x64_dbg_gui/Project/Src/Gui/tabwidget.h | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp index 476d0e3c..711e378a 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -17,6 +17,11 @@ MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) m_Windows.clear(); } +QTabBar* MHTabWidget::tabBar() +{ + return m_tabBar; +} + ////////////////////////////////////////////////////////////// // Default Destructor ////////////////////////////////////////////////////////////// @@ -113,9 +118,6 @@ void MHTabWidget::AttachTab(QWidget *parent) MHDetachedWindow* detachedWidget = dynamic_cast(parent); QWidget* tearOffWidget = detachedWidget->centralWidget(); - // Change parent - tearOffWidget->setParent(this); - // Reattach the tab int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); @@ -132,7 +134,8 @@ void MHTabWidget::AttachTab(QWidget *parent) // Cleanup Window disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - delete detachedWidget; + detachedWidget->hide(); + detachedWidget->close(); } //---------------------------------------------------------------------------- @@ -172,4 +175,4 @@ void MHDetachedWindow::moveEvent(QMoveEvent *event) void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) { emit OnClose(this); -} \ No newline at end of file +} diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h index 2b1b3510..183a5936 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.h @@ -22,6 +22,7 @@ class MHTabWidget: public QTabWidget public: MHTabWidget(QWidget *parent); virtual ~MHTabWidget(void); + QTabBar* tabBar(); public slots: int count() const; From 78c15c17d0f89d9eae648f334a8ccbc88b6f4acf Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 27 Apr 2014 17:40:35 +0200 Subject: [PATCH 012/676] GUI: fixed a bug with the TabWidget --- x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp index 711e378a..3e58dfbd 100644 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp @@ -157,8 +157,12 @@ void MHDetachedWindow::moveEvent(QMoveEvent *event) QRect rect = m_TabWidget->geometry(); QSize hint = m_TabWidget->tabBar()->sizeHint(); - // Height of the actual top tab bar (with a buffer of 30) - rect.setBottom(rect.top() + hint.height() + 30); + // Height of the actual top tab bar + rect.setBottom(rect.top() + hint.height()); + QPoint pos1(rect.x(), rect.y()); + pos1=m_TabWidget->mapToGlobal(pos1); + rect.setX(pos1.x()); + rect.setY(pos1.y()); if (rect.contains(event->pos())) { From f2ccaa5c3a2cf8cfa8305e9a778602dfaf7a8288 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 28 Apr 2014 01:03:06 +0200 Subject: [PATCH 013/676] GUI: double click toggles a breakpoint (like F2) --- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp | 6 ++++++ x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 1 + 2 files changed, 7 insertions(+) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 5de82e26..3545b37c 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -20,6 +20,12 @@ void CPUDisassembly::mousePressEvent(QMouseEvent* event) Disassembly::mousePressEvent(event); } +void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event) +{ + toggleInt3BPAction(); + Disassembly::mouseDoubleClickEvent(event); +} + /************************************************************************************ Mouse Management diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 55e18828..09196ce8 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -22,6 +22,7 @@ public: // Mouse Management void contextMenuEvent(QContextMenuEvent* event); void mousePressEvent(QMouseEvent* event); + void mouseDoubleClickEvent(QMouseEvent* event); // Context Menu Management void setupRightClickContextMenu(); From c0315bac1e794a0a56e596d68c678ef79613b69a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 28 Apr 2014 02:07:37 +0200 Subject: [PATCH 014/676] GUI: added rva display feature in disassembly GUI: double click does different stuff in different columns --- .../Project/Src/BasicView/Disassembly.cpp | 34 ++++++++++++- .../Project/Src/BasicView/Disassembly.h | 5 ++ .../Project/Src/Gui/CPUDisassembly.cpp | 51 ++++++++++++++++--- 3 files changed, 82 insertions(+), 8 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index f9c8d023..a4fd4fa4 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -72,7 +72,36 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse { char label[MAX_LABEL_SIZE]=""; int_t cur_addr=mInstBuffer.at(rowOffset).rva+mBase; - QString addrText=QString("%1").arg(cur_addr, sizeof(int_t)*2, 16, QChar('0')).toUpper(); + QString addrText=""; + if(mRvaDisplayEnabled) //RVA display + { + int_t rva=cur_addr-mRvaDisplayBase; + if(rva == 0) + { +#ifdef _WIN64 + addrText="$ ==> "; +#else + addrText="$ ==> "; +#endif //_WIN64 + } + else if(rva > 0) + { +#ifdef _WIN64 + addrText="$+"+QString("%1").arg(rva, -15, 16, QChar(' ')).toUpper(); +#else + addrText="$+"+QString("%1").arg(rva, -7, 16, QChar(' ')).toUpper(); +#endif //_WIN64 + } + else if(rva < 0) + { +#ifdef _WIN64 + addrText="$-"+QString("%1").arg(-rva, -15, 16, QChar(' ')).toUpper(); +#else + addrText="$-"+QString("%1").arg(-rva, -7, 16, QChar(' ')).toUpper(); +#endif //_WIN64 + } + } + addrText += QString("%1").arg(cur_addr, sizeof(int_t)*2, 16, QChar('0')).toUpper(); if(DbgGetLabelAt(cur_addr, SEG_DEFAULT, label)) //has label { char module[MAX_MODULE_SIZE]=""; @@ -1018,6 +1047,9 @@ void Disassembly::disassembleAt(int_t parVA, int_t parCIP, bool history, int_t n mBase = wBase; mSize = wSize; + if(mRvaDisplayEnabled && mBase != mRvaDisplayPageBase) + mRvaDisplayEnabled = false; + setRowCount(wSize); setSingleSelection(wRVA); // Selects disassembled instruction diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index 0f135e5f..112871c7 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -126,6 +126,11 @@ private: QList mVaHistory; int mCurrentVa; + +protected: + bool mRvaDisplayEnabled; + uint_t mRvaDisplayBase; + int_t mRvaDisplayPageBase; }; #endif // DISASSEMBLY_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 3545b37c..5d8e3a25 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -22,8 +22,45 @@ void CPUDisassembly::mousePressEvent(QMouseEvent* event) void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event) { - toggleInt3BPAction(); - Disassembly::mouseDoubleClickEvent(event); + switch(getColumnIndexFromX(event->x())) + { + case 0: //address + { + int_t mSelectedVa = rvaToVa(getInitialSelection()); + if(mRvaDisplayEnabled && mSelectedVa == mRvaDisplayBase) + mRvaDisplayEnabled = false; + else + { + mRvaDisplayEnabled = true; + mRvaDisplayBase = mSelectedVa; + mRvaDisplayPageBase = getBase(); + } + reloadData(); + } + break; + + case 1: //opcodes + { + toggleInt3BPAction(); //toggle INT3 breakpoint + } + break; + + case 2: //disassembly + { + assembleAt(); + } + break; + + case 3: //comments + { + setComment(); + } + break; + + default: + Disassembly::mouseDoubleClickEvent(event); + break; + } } @@ -98,18 +135,18 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) { case 0: msetHwBPOnSlot0Action->setText("Replace Slot 0 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 1: msetHwBPOnSlot1Action->setText("Replace Slot 1 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 2: msetHwBPOnSlot2Action->setText("Replace Slot 2 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 3: msetHwBPOnSlot3Action->setText("Replace Slot 3 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; default: - break; + break; } } From 8bf415dbb4301363cffec41cfc37194a421fbf7f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 28 Apr 2014 03:18:51 +0200 Subject: [PATCH 015/676] GUI: added find references to address context menu GUI: fixed a small thing in the ExceptionRangeDialog GUI: Find Strings now looks inside the memory page currently disassembled instead of CIP DBG: moved some commands to the documented side PROJECT: updated help --- help/Data.htm | 20 + help/dump.htm | 27 + help/find.htm | 29 + help/reffind_findref_ref.htm | 39 ++ help/refstr_strref.htm | 25 + help/sdump.htm | 38 ++ help/x64_dbg.wcp | 514 ++++++++++-------- x64_dbg_dbg/x64_dbg.cpp | 25 +- .../Project/Src/Gui/CPUDisassembly.cpp | 32 ++ x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 5 + x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 9 - x64_dbg_gui/Project/Src/Gui/CPUWidget.h | 13 +- .../Project/Src/Gui/ExceptionRangeDialog.cpp | 4 + x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 14 +- x64_dbg_gui/Project/Src/Gui/MainWindow.h | 1 + 15 files changed, 535 insertions(+), 260 deletions(-) create mode 100644 help/Data.htm create mode 100644 help/dump.htm create mode 100644 help/find.htm create mode 100644 help/reffind_findref_ref.htm create mode 100644 help/refstr_strref.htm create mode 100644 help/sdump.htm diff --git a/help/Data.htm b/help/Data.htm new file mode 100644 index 00000000..a951aeb5 --- /dev/null +++ b/help/Data.htm @@ -0,0 +1,20 @@ + + + +Data + + + + + + + +

Data
This section contains commands +that are used to analyze and manipulate data.

+ \ No newline at end of file diff --git a/help/dump.htm b/help/dump.htm new file mode 100644 index 00000000..b6cee710 --- /dev/null +++ b/help/dump.htm @@ -0,0 +1,27 @@ + + + +dump + + + + + + + +

dump
Dump at a certain position.

+

arguments
[arg1]: The address to dump at.

+

+ +result +
+
+This command does not set any result variables.

+ \ No newline at end of file diff --git a/help/find.htm b/help/find.htm new file mode 100644 index 00000000..110e18b6 --- /dev/null +++ b/help/find.htm @@ -0,0 +1,29 @@ + + + +find + + + + + + + +

find
Dump at a certain position.

+

arguments
  arg1: The address to start searching +from. Notice that the searching will stop when the end of the memory page this +address resides in has been reached. This means you cannot search the complete +process memory without enumerating the memory pages first.

+

  arg2: The byte pattern to search for. This byte +pattern can contain wildcards (?) for example: "EB0?90??8D"

+

result
The $result variable is set to the virtual +address of the address that matches the byte pattern. $result will be 0 when the pattern could not be +matched.

+

 

\ No newline at end of file diff --git a/help/reffind_findref_ref.htm b/help/reffind_findref_ref.htm new file mode 100644 index 00000000..734b5778 --- /dev/null +++ b/help/reffind_findref_ref.htm @@ -0,0 +1,39 @@ + + + +reffind/findref/ref + + + + + + + +

reffind[,findref,ref]
Find references to a certain value.

+

arguments
+  +arg1: The value to look for. + +

+

+ +[arg2]: Address of/inside a memory page to look +in. When +not specified CIP will be used.  + +

+

+ + + result + +
+The $result variable is set to the number of references +found.

\ No newline at end of file diff --git a/help/refstr_strref.htm b/help/refstr_strref.htm new file mode 100644 index 00000000..c9bfc8f4 --- /dev/null +++ b/help/refstr_strref.htm @@ -0,0 +1,25 @@ + + + +refstr/strref + + + + + + + +

refstr[,strref]
Find referenced text strings.

+

arguments
[arg1]: Address of/inside a memory page to find +referenced text strings in. When not specified CIP +will be used.

+

result
The $result variable is set to the number of string references +found.

\ No newline at end of file diff --git a/help/sdump.htm b/help/sdump.htm new file mode 100644 index 00000000..0c808beb --- /dev/null +++ b/help/sdump.htm @@ -0,0 +1,38 @@ + + + +sdump + + + + + + + +

sdump
Dump the at a certain position.

+

arguments
+ + + +[arg1]: The address to dump at (must be inside the thread +stack range). + +

+

+ + + result + +
+This command does not set any result +variables.

+

 

+ \ No newline at end of file diff --git a/help/x64_dbg.wcp b/help/x64_dbg.wcp index 65dbb8bc..ada83038 100644 --- a/help/x64_dbg.wcp +++ b/help/x64_dbg.wcp @@ -96,7 +96,7 @@ Font= DefaultTopic=Introduction.htm [TOPICS] -TitleList=110 +TitleList=116 TitleList.Title.0=Introduction TitleList.Level.0=0 TitleList.Url.0=Introduction.htm @@ -145,7 +145,7 @@ TitleList.Status.4=0 TitleList.Keywords.4= TitleList.ContextNumber.4=1003 TitleList.ApplyTemp.4=0 -TitleList.Expanded.4=0 +TitleList.Expanded.4=1 TitleList.Kind.4=0 TitleList.Title.5=Debug Control TitleList.Level.5=1 @@ -475,7 +475,7 @@ TitleList.Status.37=0 TitleList.Keywords.37= TitleList.ContextNumber.37=1004 TitleList.ApplyTemp.37=0 -TitleList.Expanded.37=0 +TitleList.Expanded.37=1 TitleList.Kind.37=0 TitleList.Title.38=strlen/charcount/ccount TitleList.Level.38=2 @@ -517,684 +517,744 @@ TitleList.ContextNumber.41=1026 TitleList.ApplyTemp.41=0 TitleList.Expanded.41=0 TitleList.Kind.41=0 -TitleList.Title.42=HideDebugger/dbh/hide +TitleList.Title.42=dump TitleList.Level.42=2 -TitleList.Url.42=HideDebugger_dbh_hide.htm +TitleList.Url.42=dump.htm TitleList.Icon.42=0 TitleList.Status.42=0 TitleList.Keywords.42= -TitleList.ContextNumber.42=1025 +TitleList.ContextNumber.42=1110 TitleList.ApplyTemp.42=0 TitleList.Expanded.42=0 TitleList.Kind.42=0 -TitleList.Title.43=User Database -TitleList.Level.43=1 -TitleList.Url.43=User_Database.htm +TitleList.Title.43=sdump +TitleList.Level.43=2 +TitleList.Url.43=sdump.htm TitleList.Icon.43=0 TitleList.Status.43=0 TitleList.Keywords.43= -TitleList.ContextNumber.43=1042 +TitleList.ContextNumber.43=1109 TitleList.ApplyTemp.43=0 TitleList.Expanded.43=0 TitleList.Kind.43=0 -TitleList.Title.44=cmt/cmtset/commentset +TitleList.Title.44=HideDebugger/dbh/hide TitleList.Level.44=2 -TitleList.Url.44=cmt_cmtset_commentset.htm +TitleList.Url.44=HideDebugger_dbh_hide.htm TitleList.Icon.44=0 TitleList.Status.44=0 TitleList.Keywords.44= -TitleList.ContextNumber.44=1035 +TitleList.ContextNumber.44=1025 TitleList.ApplyTemp.44=0 TitleList.Expanded.44=0 TitleList.Kind.44=0 -TitleList.Title.45=cmtc/cmtdel/commentdel -TitleList.Level.45=2 -TitleList.Url.45=cmtc_cmtdel_commentdel.htm +TitleList.Title.45=User Database +TitleList.Level.45=1 +TitleList.Url.45=User_Database.htm TitleList.Icon.45=0 TitleList.Status.45=0 TitleList.Keywords.45= -TitleList.ContextNumber.45=1036 +TitleList.ContextNumber.45=1042 TitleList.ApplyTemp.45=0 TitleList.Expanded.45=0 TitleList.Kind.45=0 -TitleList.Title.46=lbl/lblset/labelset +TitleList.Title.46=cmt/cmtset/commentset TitleList.Level.46=2 -TitleList.Url.46=lbl_lblset_labelset.htm +TitleList.Url.46=cmt_cmtset_commentset.htm TitleList.Icon.46=0 TitleList.Status.46=0 TitleList.Keywords.46= -TitleList.ContextNumber.46=1037 +TitleList.ContextNumber.46=1035 TitleList.ApplyTemp.46=0 TitleList.Expanded.46=0 TitleList.Kind.46=0 -TitleList.Title.47=lblc/lbldel/labeldel +TitleList.Title.47=cmtc/cmtdel/commentdel TitleList.Level.47=2 -TitleList.Url.47=lblc_lbldel_labeldel.htm +TitleList.Url.47=cmtc_cmtdel_commentdel.htm TitleList.Icon.47=0 TitleList.Status.47=0 TitleList.Keywords.47= -TitleList.ContextNumber.47=1038 +TitleList.ContextNumber.47=1036 TitleList.ApplyTemp.47=0 TitleList.Expanded.47=0 TitleList.Kind.47=0 -TitleList.Title.48=bookmark/bookmarkset +TitleList.Title.48=lbl/lblset/labelset TitleList.Level.48=2 -TitleList.Url.48=bookmark_bookmarkset.htm +TitleList.Url.48=lbl_lblset_labelset.htm TitleList.Icon.48=0 TitleList.Status.48=0 TitleList.Keywords.48= -TitleList.ContextNumber.48=1077 +TitleList.ContextNumber.48=1037 TitleList.ApplyTemp.48=0 TitleList.Expanded.48=0 TitleList.Kind.48=0 -TitleList.Title.49=bookmarkc/bookmarkdel +TitleList.Title.49=lblc/lbldel/labeldel TitleList.Level.49=2 -TitleList.Url.49=bookmarkc_bookmarkdel.htm +TitleList.Url.49=lblc_lbldel_labeldel.htm TitleList.Icon.49=0 TitleList.Status.49=0 TitleList.Keywords.49= -TitleList.ContextNumber.49=1078 +TitleList.ContextNumber.49=1038 TitleList.ApplyTemp.49=0 TitleList.Expanded.49=0 TitleList.Kind.49=0 -TitleList.Title.50=savedb/dbsave +TitleList.Title.50=bookmark/bookmarkset TitleList.Level.50=2 -TitleList.Url.50=savedb_dbsave.htm +TitleList.Url.50=bookmark_bookmarkset.htm TitleList.Icon.50=0 TitleList.Status.50=0 TitleList.Keywords.50= -TitleList.ContextNumber.50=1034 +TitleList.ContextNumber.50=1077 TitleList.ApplyTemp.50=0 TitleList.Expanded.50=0 TitleList.Kind.50=0 -TitleList.Title.51=loaddb/dbload +TitleList.Title.51=bookmarkc/bookmarkdel TitleList.Level.51=2 -TitleList.Url.51=loaddb_dbload.htm +TitleList.Url.51=bookmarkc_bookmarkdel.htm TitleList.Icon.51=0 TitleList.Status.51=0 TitleList.Keywords.51= -TitleList.ContextNumber.51=1039 +TitleList.ContextNumber.51=1078 TitleList.ApplyTemp.51=0 TitleList.Expanded.51=0 TitleList.Kind.51=0 -TitleList.Title.52=functionadd/func +TitleList.Title.52=savedb/dbsave TitleList.Level.52=2 -TitleList.Url.52=functionadd_func.htm +TitleList.Url.52=savedb_dbsave.htm TitleList.Icon.52=0 TitleList.Status.52=0 TitleList.Keywords.52= -TitleList.ContextNumber.52=1062 +TitleList.ContextNumber.52=1034 TitleList.ApplyTemp.52=0 TitleList.Expanded.52=0 TitleList.Kind.52=0 -TitleList.Title.53=functiondel/funcc +TitleList.Title.53=loaddb/dbload TitleList.Level.53=2 -TitleList.Url.53=functiondel_funcc.htm +TitleList.Url.53=loaddb_dbload.htm TitleList.Icon.53=0 TitleList.Status.53=0 TitleList.Keywords.53= -TitleList.ContextNumber.53=1063 +TitleList.ContextNumber.53=1039 TitleList.ApplyTemp.53=0 TitleList.Expanded.53=0 TitleList.Kind.53=0 -TitleList.Title.54=Memory Operations -TitleList.Level.54=1 -TitleList.Url.54=Memory_Operations.htm +TitleList.Title.54=functionadd/func +TitleList.Level.54=2 +TitleList.Url.54=functionadd_func.htm TitleList.Icon.54=0 TitleList.Status.54=0 TitleList.Keywords.54= -TitleList.ContextNumber.54=1043 +TitleList.ContextNumber.54=1062 TitleList.ApplyTemp.54=0 TitleList.Expanded.54=0 TitleList.Kind.54=0 -TitleList.Title.55=alloc +TitleList.Title.55=functiondel/funcc TitleList.Level.55=2 -TitleList.Url.55=alloc.htm +TitleList.Url.55=functiondel_funcc.htm TitleList.Icon.55=0 TitleList.Status.55=0 TitleList.Keywords.55= -TitleList.ContextNumber.55=1032 +TitleList.ContextNumber.55=1063 TitleList.ApplyTemp.55=0 TitleList.Expanded.55=0 TitleList.Kind.55=0 -TitleList.Title.56=free -TitleList.Level.56=2 -TitleList.Url.56=free.htm +TitleList.Title.56=Memory Operations +TitleList.Level.56=1 +TitleList.Url.56=Memory_Operations.htm TitleList.Icon.56=0 TitleList.Status.56=0 TitleList.Keywords.56= -TitleList.ContextNumber.56=1031 +TitleList.ContextNumber.56=1043 TitleList.ApplyTemp.56=0 TitleList.Expanded.56=0 TitleList.Kind.56=0 -TitleList.Title.57=Fill/memset +TitleList.Title.57=alloc TitleList.Level.57=2 -TitleList.Url.57=Fill_memset.htm +TitleList.Url.57=alloc.htm TitleList.Icon.57=0 TitleList.Status.57=0 TitleList.Keywords.57= -TitleList.ContextNumber.57=1033 +TitleList.ContextNumber.57=1032 TitleList.ApplyTemp.57=0 TitleList.Expanded.57=0 TitleList.Kind.57=0 -TitleList.Title.58=Plugins -TitleList.Level.58=1 -TitleList.Url.58=Plugins_section.htm +TitleList.Title.58=free +TitleList.Level.58=2 +TitleList.Url.58=free.htm TitleList.Icon.58=0 TitleList.Status.58=0 TitleList.Keywords.58= -TitleList.ContextNumber.58=1046 +TitleList.ContextNumber.58=1031 TitleList.ApplyTemp.58=0 TitleList.Expanded.58=0 TitleList.Kind.58=0 -TitleList.Title.59=StartScylla/scylla/imprec +TitleList.Title.59=Fill/memset TitleList.Level.59=2 -TitleList.Url.59=StartScylla_scylla_imprec.htm +TitleList.Url.59=Fill_memset.htm TitleList.Icon.59=0 TitleList.Status.59=0 TitleList.Keywords.59= -TitleList.ContextNumber.59=1047 +TitleList.ContextNumber.59=1033 TitleList.ApplyTemp.59=0 TitleList.Expanded.59=0 TitleList.Kind.59=0 -TitleList.Title.60=General Purpose +TitleList.Title.60=Plugins TitleList.Level.60=1 -TitleList.Url.60=General_Purpose.htm +TitleList.Url.60=Plugins_section.htm TitleList.Icon.60=0 TitleList.Status.60=0 TitleList.Keywords.60= -TitleList.ContextNumber.60=1073 +TitleList.ContextNumber.60=1046 TitleList.ApplyTemp.60=0 TitleList.Expanded.60=0 TitleList.Kind.60=0 -TitleList.Title.61=cmp +TitleList.Title.61=StartScylla/scylla/imprec TitleList.Level.61=2 -TitleList.Url.61=cmp.htm +TitleList.Url.61=StartScylla_scylla_imprec.htm TitleList.Icon.61=0 TitleList.Status.61=0 TitleList.Keywords.61= -TitleList.ContextNumber.61=1071 +TitleList.ContextNumber.61=1047 TitleList.ApplyTemp.61=0 TitleList.Expanded.61=0 TitleList.Kind.61=0 -TitleList.Title.62=gpa -TitleList.Level.62=2 -TitleList.Url.62=gpa.htm +TitleList.Title.62=General Purpose +TitleList.Level.62=1 +TitleList.Url.62=General_Purpose.htm TitleList.Icon.62=0 TitleList.Status.62=0 TitleList.Keywords.62= -TitleList.ContextNumber.62=1095 +TitleList.ContextNumber.62=1073 TitleList.ApplyTemp.62=0 TitleList.Expanded.62=0 TitleList.Kind.62=0 -TitleList.Title.63=add +TitleList.Title.63=cmp TitleList.Level.63=2 -TitleList.Url.63=add.htm +TitleList.Url.63=cmp.htm TitleList.Icon.63=0 TitleList.Status.63=0 TitleList.Keywords.63= -TitleList.ContextNumber.63=1094 +TitleList.ContextNumber.63=1071 TitleList.ApplyTemp.63=0 TitleList.Expanded.63=0 TitleList.Kind.63=0 -TitleList.Title.64=and +TitleList.Title.64=gpa TitleList.Level.64=2 -TitleList.Url.64=and.htm +TitleList.Url.64=gpa.htm TitleList.Icon.64=0 TitleList.Status.64=0 TitleList.Keywords.64= -TitleList.ContextNumber.64=1093 +TitleList.ContextNumber.64=1095 TitleList.ApplyTemp.64=0 TitleList.Expanded.64=0 TitleList.Kind.64=0 -TitleList.Title.65=dec +TitleList.Title.65=add TitleList.Level.65=2 -TitleList.Url.65=dec.htm +TitleList.Url.65=add.htm TitleList.Icon.65=0 TitleList.Status.65=0 TitleList.Keywords.65= -TitleList.ContextNumber.65=1092 +TitleList.ContextNumber.65=1094 TitleList.ApplyTemp.65=0 TitleList.Expanded.65=0 TitleList.Kind.65=0 -TitleList.Title.66=div +TitleList.Title.66=and TitleList.Level.66=2 -TitleList.Url.66=div.htm +TitleList.Url.66=and.htm TitleList.Icon.66=0 TitleList.Status.66=0 TitleList.Keywords.66= -TitleList.ContextNumber.66=1091 +TitleList.ContextNumber.66=1093 TitleList.ApplyTemp.66=0 TitleList.Expanded.66=0 TitleList.Kind.66=0 -TitleList.Title.67=inc +TitleList.Title.67=dec TitleList.Level.67=2 -TitleList.Url.67=inc.htm +TitleList.Url.67=dec.htm TitleList.Icon.67=0 TitleList.Status.67=0 TitleList.Keywords.67= -TitleList.ContextNumber.67=1090 +TitleList.ContextNumber.67=1092 TitleList.ApplyTemp.67=0 TitleList.Expanded.67=0 TitleList.Kind.67=0 -TitleList.Title.68=mul +TitleList.Title.68=div TitleList.Level.68=2 -TitleList.Url.68=mul.htm +TitleList.Url.68=div.htm TitleList.Icon.68=0 TitleList.Status.68=0 TitleList.Keywords.68= -TitleList.ContextNumber.68=1089 +TitleList.ContextNumber.68=1091 TitleList.ApplyTemp.68=0 TitleList.Expanded.68=0 TitleList.Kind.68=0 -TitleList.Title.69=neg +TitleList.Title.69=inc TitleList.Level.69=2 -TitleList.Url.69=neg.htm +TitleList.Url.69=inc.htm TitleList.Icon.69=0 TitleList.Status.69=0 TitleList.Keywords.69= -TitleList.ContextNumber.69=1088 +TitleList.ContextNumber.69=1090 TitleList.ApplyTemp.69=0 TitleList.Expanded.69=0 TitleList.Kind.69=0 -TitleList.Title.70=not +TitleList.Title.70=mul TitleList.Level.70=2 -TitleList.Url.70=not.htm +TitleList.Url.70=mul.htm TitleList.Icon.70=0 TitleList.Status.70=0 TitleList.Keywords.70= -TitleList.ContextNumber.70=1087 +TitleList.ContextNumber.70=1089 TitleList.ApplyTemp.70=0 TitleList.Expanded.70=0 TitleList.Kind.70=0 -TitleList.Title.71=or +TitleList.Title.71=neg TitleList.Level.71=2 -TitleList.Url.71=or.htm +TitleList.Url.71=neg.htm TitleList.Icon.71=0 TitleList.Status.71=0 TitleList.Keywords.71= -TitleList.ContextNumber.71=1086 +TitleList.ContextNumber.71=1088 TitleList.ApplyTemp.71=0 TitleList.Expanded.71=0 TitleList.Kind.71=0 -TitleList.Title.72=rol +TitleList.Title.72=not TitleList.Level.72=2 -TitleList.Url.72=rol.htm +TitleList.Url.72=not.htm TitleList.Icon.72=0 TitleList.Status.72=0 TitleList.Keywords.72= -TitleList.ContextNumber.72=1085 +TitleList.ContextNumber.72=1087 TitleList.ApplyTemp.72=0 TitleList.Expanded.72=0 TitleList.Kind.72=0 -TitleList.Title.73=ror +TitleList.Title.73=or TitleList.Level.73=2 -TitleList.Url.73=ror.htm +TitleList.Url.73=or.htm TitleList.Icon.73=0 TitleList.Status.73=0 TitleList.Keywords.73= -TitleList.ContextNumber.73=1084 +TitleList.ContextNumber.73=1086 TitleList.ApplyTemp.73=0 TitleList.Expanded.73=0 TitleList.Kind.73=0 -TitleList.Title.74=shl +TitleList.Title.74=rol TitleList.Level.74=2 -TitleList.Url.74=shl.htm +TitleList.Url.74=rol.htm TitleList.Icon.74=0 TitleList.Status.74=0 TitleList.Keywords.74= -TitleList.ContextNumber.74=1083 +TitleList.ContextNumber.74=1085 TitleList.ApplyTemp.74=0 TitleList.Expanded.74=0 TitleList.Kind.74=0 -TitleList.Title.75=shr +TitleList.Title.75=ror TitleList.Level.75=2 -TitleList.Url.75=shr.htm +TitleList.Url.75=ror.htm TitleList.Icon.75=0 TitleList.Status.75=0 TitleList.Keywords.75= -TitleList.ContextNumber.75=1082 +TitleList.ContextNumber.75=1084 TitleList.ApplyTemp.75=0 TitleList.Expanded.75=0 TitleList.Kind.75=0 -TitleList.Title.76=sub +TitleList.Title.76=shl TitleList.Level.76=2 -TitleList.Url.76=sub.htm +TitleList.Url.76=shl.htm TitleList.Icon.76=0 TitleList.Status.76=0 TitleList.Keywords.76= -TitleList.ContextNumber.76=1081 +TitleList.ContextNumber.76=1083 TitleList.ApplyTemp.76=0 TitleList.Expanded.76=0 TitleList.Kind.76=0 -TitleList.Title.77=test +TitleList.Title.77=shr TitleList.Level.77=2 -TitleList.Url.77=test.htm +TitleList.Url.77=shr.htm TitleList.Icon.77=0 TitleList.Status.77=0 TitleList.Keywords.77= -TitleList.ContextNumber.77=1080 +TitleList.ContextNumber.77=1082 TitleList.ApplyTemp.77=0 TitleList.Expanded.77=0 TitleList.Kind.77=0 -TitleList.Title.78=xor +TitleList.Title.78=sub TitleList.Level.78=2 -TitleList.Url.78=xor.htm +TitleList.Url.78=sub.htm TitleList.Icon.78=0 TitleList.Status.78=0 TitleList.Keywords.78= -TitleList.ContextNumber.78=1096 +TitleList.ContextNumber.78=1081 TitleList.ApplyTemp.78=0 TitleList.Expanded.78=0 TitleList.Kind.78=0 -TitleList.Title.79=Script Commands -TitleList.Level.79=1 -TitleList.Url.79=Script_Commands.htm +TitleList.Title.79=test +TitleList.Level.79=2 +TitleList.Url.79=test.htm TitleList.Icon.79=0 TitleList.Status.79=0 TitleList.Keywords.79= -TitleList.ContextNumber.79=1070 +TitleList.ContextNumber.79=1080 TitleList.ApplyTemp.79=0 TitleList.Expanded.79=0 TitleList.Kind.79=0 -TitleList.Title.80=Jxx/IFxx +TitleList.Title.80=xor TitleList.Level.80=2 -TitleList.Url.80=Jxx_IFxx.htm +TitleList.Url.80=xor.htm TitleList.Icon.80=0 TitleList.Status.80=0 TitleList.Keywords.80= -TitleList.ContextNumber.80=1072 +TitleList.ContextNumber.80=1096 TitleList.ApplyTemp.80=0 TitleList.Expanded.80=0 TitleList.Kind.80=0 -TitleList.Title.81=call -TitleList.Level.81=2 -TitleList.Url.81=call.htm +TitleList.Title.81=Script Commands +TitleList.Level.81=1 +TitleList.Url.81=Script_Commands.htm TitleList.Icon.81=0 TitleList.Status.81=0 TitleList.Keywords.81= -TitleList.ContextNumber.81=1097 +TitleList.ContextNumber.81=1070 TitleList.ApplyTemp.81=0 TitleList.Expanded.81=0 TitleList.Kind.81=0 -TitleList.Title.82=ret +TitleList.Title.82=Jxx/IFxx TitleList.Level.82=2 -TitleList.Url.82=ret.htm +TitleList.Url.82=Jxx_IFxx.htm TitleList.Icon.82=0 TitleList.Status.82=0 TitleList.Keywords.82= -TitleList.ContextNumber.82=1098 +TitleList.ContextNumber.82=1072 TitleList.ApplyTemp.82=0 TitleList.Expanded.82=0 TitleList.Kind.82=0 -TitleList.Title.83=invalid +TitleList.Title.83=call TitleList.Level.83=2 -TitleList.Url.83=invalid.htm +TitleList.Url.83=call.htm TitleList.Icon.83=0 TitleList.Status.83=0 TitleList.Keywords.83= -TitleList.ContextNumber.83=1099 +TitleList.ContextNumber.83=1097 TitleList.ApplyTemp.83=0 TitleList.Expanded.83=0 TitleList.Kind.83=0 -TitleList.Title.84=pause +TitleList.Title.84=ret TitleList.Level.84=2 -TitleList.Url.84=pause_script.htm +TitleList.Url.84=ret.htm TitleList.Icon.84=0 TitleList.Status.84=0 TitleList.Keywords.84= -TitleList.ContextNumber.84=1100 +TitleList.ContextNumber.84=1098 TitleList.ApplyTemp.84=0 TitleList.Expanded.84=0 TitleList.Kind.84=0 -TitleList.Title.85=scriptload +TitleList.Title.85=invalid TitleList.Level.85=2 -TitleList.Url.85=scriptload.htm +TitleList.Url.85=invalid.htm TitleList.Icon.85=0 TitleList.Status.85=0 TitleList.Keywords.85= -TitleList.ContextNumber.85=1074 +TitleList.ContextNumber.85=1099 TitleList.ApplyTemp.85=0 TitleList.Expanded.85=0 TitleList.Kind.85=0 -TitleList.Title.86=msg +TitleList.Title.86=pause TitleList.Level.86=2 -TitleList.Url.86=msg.htm +TitleList.Url.86=pause_script.htm TitleList.Icon.86=0 TitleList.Status.86=0 TitleList.Keywords.86= -TitleList.ContextNumber.86=1076 +TitleList.ContextNumber.86=1100 TitleList.ApplyTemp.86=0 TitleList.Expanded.86=0 TitleList.Kind.86=0 -TitleList.Title.87=msgyn +TitleList.Title.87=scriptload TitleList.Level.87=2 -TitleList.Url.87=msgyn.htm +TitleList.Url.87=scriptload.htm TitleList.Icon.87=0 TitleList.Status.87=0 TitleList.Keywords.87= -TitleList.ContextNumber.87=1075 +TitleList.ContextNumber.87=1074 TitleList.ApplyTemp.87=0 TitleList.Expanded.87=0 TitleList.Kind.87=0 -TitleList.Title.88=Plugins -TitleList.Level.88=0 -TitleList.Url.88=Plugins.htm +TitleList.Title.88=msg +TitleList.Level.88=2 +TitleList.Url.88=msg.htm TitleList.Icon.88=0 TitleList.Status.88=0 TitleList.Keywords.88= -TitleList.ContextNumber.88=1050 +TitleList.ContextNumber.88=1076 TitleList.ApplyTemp.88=0 -TitleList.Expanded.88=1 +TitleList.Expanded.88=0 TitleList.Kind.88=0 -TitleList.Title.89=The basics -TitleList.Level.89=1 -TitleList.Url.89=The_basics.htm +TitleList.Title.89=msgyn +TitleList.Level.89=2 +TitleList.Url.89=msgyn.htm TitleList.Icon.89=0 TitleList.Status.89=0 TitleList.Keywords.89= -TitleList.ContextNumber.89=1103 +TitleList.ContextNumber.89=1075 TitleList.ApplyTemp.89=0 TitleList.Expanded.89=0 TitleList.Kind.89=0 -TitleList.Title.90=API +TitleList.Title.90=Data TitleList.Level.90=1 -TitleList.Url.90=Exports.htm +TitleList.Url.90=Data.htm TitleList.Icon.90=0 TitleList.Status.90=0 TitleList.Keywords.90= -TitleList.ContextNumber.90=1051 +TitleList.ContextNumber.90=1111 TitleList.ApplyTemp.90=0 TitleList.Expanded.90=1 TitleList.Kind.90=0 -TitleList.Title.91=_plugin_registercallback +TitleList.Title.91=reffind/findref/ref TitleList.Level.91=2 -TitleList.Url.91=_plugin_registercallback.htm +TitleList.Url.91=reffind_findref_ref.htm TitleList.Icon.91=0 TitleList.Status.91=0 TitleList.Keywords.91= -TitleList.ContextNumber.91=1052 +TitleList.ContextNumber.91=1112 TitleList.ApplyTemp.91=0 TitleList.Expanded.91=0 TitleList.Kind.91=0 -TitleList.Title.92=_plugin_unregistercallback +TitleList.Title.92=refstr/strref TitleList.Level.92=2 -TitleList.Url.92=_plugin_unregistercallback.htm +TitleList.Url.92=refstr_strref.htm TitleList.Icon.92=0 TitleList.Status.92=0 TitleList.Keywords.92= -TitleList.ContextNumber.92=1053 +TitleList.ContextNumber.92=1113 TitleList.ApplyTemp.92=0 TitleList.Expanded.92=0 TitleList.Kind.92=0 -TitleList.Title.93=_plugin_registercommand +TitleList.Title.93=find TitleList.Level.93=2 -TitleList.Url.93=_plugin_registercommand.htm +TitleList.Url.93=find.htm TitleList.Icon.93=0 TitleList.Status.93=0 TitleList.Keywords.93= -TitleList.ContextNumber.93=1054 +TitleList.ContextNumber.93=1114 TitleList.ApplyTemp.93=0 TitleList.Expanded.93=0 TitleList.Kind.93=0 -TitleList.Title.94=_plugin_unregistercommand -TitleList.Level.94=2 -TitleList.Url.94=_plugin_unregistercommand.htm +TitleList.Title.94=Plugins +TitleList.Level.94=0 +TitleList.Url.94=Plugins.htm TitleList.Icon.94=0 TitleList.Status.94=0 TitleList.Keywords.94= -TitleList.ContextNumber.94=1055 +TitleList.ContextNumber.94=1050 TitleList.ApplyTemp.94=0 TitleList.Expanded.94=0 TitleList.Kind.94=0 -TitleList.Title.95=_plugin_logprintf -TitleList.Level.95=2 -TitleList.Url.95=_plugin_logprintf.htm +TitleList.Title.95=The basics +TitleList.Level.95=1 +TitleList.Url.95=The_basics.htm TitleList.Icon.95=0 TitleList.Status.95=0 TitleList.Keywords.95= -TitleList.ContextNumber.95=1056 +TitleList.ContextNumber.95=1103 TitleList.ApplyTemp.95=0 TitleList.Expanded.95=0 TitleList.Kind.95=0 -TitleList.Title.96=_plugin_logputs -TitleList.Level.96=2 -TitleList.Url.96=_plugin_logputs.htm +TitleList.Title.96=API +TitleList.Level.96=1 +TitleList.Url.96=Exports.htm TitleList.Icon.96=0 TitleList.Status.96=0 TitleList.Keywords.96= -TitleList.ContextNumber.96=1057 +TitleList.ContextNumber.96=1051 TitleList.ApplyTemp.96=0 TitleList.Expanded.96=0 TitleList.Kind.96=0 -TitleList.Title.97=_plugin_debugpause +TitleList.Title.97=_plugin_registercallback TitleList.Level.97=2 -TitleList.Url.97=_plugin_debugpause.htm +TitleList.Url.97=_plugin_registercallback.htm TitleList.Icon.97=0 TitleList.Status.97=0 TitleList.Keywords.97= -TitleList.ContextNumber.97=1058 +TitleList.ContextNumber.97=1052 TitleList.ApplyTemp.97=0 TitleList.Expanded.97=0 TitleList.Kind.97=0 -TitleList.Title.98=_plugin_debugskipexceptions +TitleList.Title.98=_plugin_unregistercallback TitleList.Level.98=2 -TitleList.Url.98=_plugin_debugskipexceptions.htm +TitleList.Url.98=_plugin_unregistercallback.htm TitleList.Icon.98=0 TitleList.Status.98=0 TitleList.Keywords.98= -TitleList.ContextNumber.98=1104 +TitleList.ContextNumber.98=1053 TitleList.ApplyTemp.98=0 TitleList.Expanded.98=0 TitleList.Kind.98=0 -TitleList.Title.99=_plugin_menuadd +TitleList.Title.99=_plugin_registercommand TitleList.Level.99=2 -TitleList.Url.99=_plugin_menuadd.htm +TitleList.Url.99=_plugin_registercommand.htm TitleList.Icon.99=0 TitleList.Status.99=0 TitleList.Keywords.99= -TitleList.ContextNumber.99=1108 +TitleList.ContextNumber.99=1054 TitleList.ApplyTemp.99=0 TitleList.Expanded.99=0 TitleList.Kind.99=0 -TitleList.Title.100=_plugin_menuaddentry +TitleList.Title.100=_plugin_unregistercommand TitleList.Level.100=2 -TitleList.Url.100=_plugin_menuaddentry.htm +TitleList.Url.100=_plugin_unregistercommand.htm TitleList.Icon.100=0 TitleList.Status.100=0 TitleList.Keywords.100= -TitleList.ContextNumber.100=1107 +TitleList.ContextNumber.100=1055 TitleList.ApplyTemp.100=0 TitleList.Expanded.100=0 TitleList.Kind.100=0 -TitleList.Title.101=_plugin_menuaddseparator +TitleList.Title.101=_plugin_logprintf TitleList.Level.101=2 -TitleList.Url.101=_plugin_menuaddseparator.htm +TitleList.Url.101=_plugin_logprintf.htm TitleList.Icon.101=0 TitleList.Status.101=0 TitleList.Keywords.101= -TitleList.ContextNumber.101=1106 +TitleList.ContextNumber.101=1056 TitleList.ApplyTemp.101=0 TitleList.Expanded.101=0 TitleList.Kind.101=0 -TitleList.Title.102=_plugin_menuclear +TitleList.Title.102=_plugin_logputs TitleList.Level.102=2 -TitleList.Url.102=_plugin_menuclear.htm +TitleList.Url.102=_plugin_logputs.htm TitleList.Icon.102=0 TitleList.Status.102=0 TitleList.Keywords.102= -TitleList.ContextNumber.102=1105 +TitleList.ContextNumber.102=1057 TitleList.ApplyTemp.102=0 TitleList.Expanded.102=0 TitleList.Kind.102=0 -TitleList.Title.103=Structures -TitleList.Level.103=1 -TitleList.Url.103=Structures.htm +TitleList.Title.103=_plugin_debugpause +TitleList.Level.103=2 +TitleList.Url.103=_plugin_debugpause.htm TitleList.Icon.103=0 TitleList.Status.103=0 TitleList.Keywords.103= -TitleList.ContextNumber.103=1059 +TitleList.ContextNumber.103=1058 TitleList.ApplyTemp.103=0 -TitleList.Expanded.103=1 +TitleList.Expanded.103=0 TitleList.Kind.103=0 -TitleList.Title.104=Callback Structures +TitleList.Title.104=_plugin_debugskipexceptions TitleList.Level.104=2 -TitleList.Url.104=Callbacks.htm +TitleList.Url.104=_plugin_debugskipexceptions.htm TitleList.Icon.104=0 TitleList.Status.104=0 TitleList.Keywords.104= -TitleList.ContextNumber.104=1060 +TitleList.ContextNumber.104=1104 TitleList.ApplyTemp.104=0 TitleList.Expanded.104=0 TitleList.Kind.104=0 -TitleList.Title.105=PLUG_INITSTRUCT +TitleList.Title.105=_plugin_menuadd TitleList.Level.105=2 -TitleList.Url.105=PLUGINIT_STRUCT.htm +TitleList.Url.105=_plugin_menuadd.htm TitleList.Icon.105=0 TitleList.Status.105=0 TitleList.Keywords.105= -TitleList.ContextNumber.105=1061 +TitleList.ContextNumber.105=1108 TitleList.ApplyTemp.105=0 TitleList.Expanded.105=0 TitleList.Kind.105=0 -TitleList.Title.106=PLUG_SETUPSTRUCT +TitleList.Title.106=_plugin_menuaddentry TitleList.Level.106=2 -TitleList.Url.106=PLUG_SETUPSTRUCT.htm +TitleList.Url.106=_plugin_menuaddentry.htm TitleList.Icon.106=0 TitleList.Status.106=0 TitleList.Keywords.106= -TitleList.ContextNumber.106=1102 +TitleList.ContextNumber.106=1107 TitleList.ApplyTemp.106=0 TitleList.Expanded.106=0 TitleList.Kind.106=0 -TitleList.Title.107=Scripting -TitleList.Level.107=0 -TitleList.Url.107=Scripting.htm +TitleList.Title.107=_plugin_menuaddseparator +TitleList.Level.107=2 +TitleList.Url.107=_plugin_menuaddseparator.htm TitleList.Icon.107=0 TitleList.Status.107=0 TitleList.Keywords.107= -TitleList.ContextNumber.107=1069 +TitleList.ContextNumber.107=1106 TitleList.ApplyTemp.107=0 TitleList.Expanded.107=0 TitleList.Kind.107=0 -TitleList.Title.108=Special Thanks -TitleList.Level.108=0 -TitleList.Url.108=Special_Thanks.htm +TitleList.Title.108=_plugin_menuclear +TitleList.Level.108=2 +TitleList.Url.108=_plugin_menuclear.htm TitleList.Icon.108=0 TitleList.Status.108=0 TitleList.Keywords.108= -TitleList.ContextNumber.108=1024 +TitleList.ContextNumber.108=1105 TitleList.ApplyTemp.108=0 TitleList.Expanded.108=0 TitleList.Kind.108=0 -TitleList.Title.109=Fixed Top Style -TitleList.Level.109=0 -TitleList.Url.109=template\fixedtop.htm +TitleList.Title.109=Structures +TitleList.Level.109=1 +TitleList.Url.109=Structures.htm TitleList.Icon.109=0 TitleList.Status.109=0 TitleList.Keywords.109= -TitleList.ContextNumber.109= +TitleList.ContextNumber.109=1059 TitleList.ApplyTemp.109=0 TitleList.Expanded.109=0 -TitleList.Kind.109=2 +TitleList.Kind.109=0 +TitleList.Title.110=Callback Structures +TitleList.Level.110=2 +TitleList.Url.110=Callbacks.htm +TitleList.Icon.110=0 +TitleList.Status.110=0 +TitleList.Keywords.110= +TitleList.ContextNumber.110=1060 +TitleList.ApplyTemp.110=0 +TitleList.Expanded.110=0 +TitleList.Kind.110=0 +TitleList.Title.111=PLUG_INITSTRUCT +TitleList.Level.111=2 +TitleList.Url.111=PLUGINIT_STRUCT.htm +TitleList.Icon.111=0 +TitleList.Status.111=0 +TitleList.Keywords.111= +TitleList.ContextNumber.111=1061 +TitleList.ApplyTemp.111=0 +TitleList.Expanded.111=0 +TitleList.Kind.111=0 +TitleList.Title.112=PLUG_SETUPSTRUCT +TitleList.Level.112=2 +TitleList.Url.112=PLUG_SETUPSTRUCT.htm +TitleList.Icon.112=0 +TitleList.Status.112=0 +TitleList.Keywords.112= +TitleList.ContextNumber.112=1102 +TitleList.ApplyTemp.112=0 +TitleList.Expanded.112=0 +TitleList.Kind.112=0 +TitleList.Title.113=Scripting +TitleList.Level.113=0 +TitleList.Url.113=Scripting.htm +TitleList.Icon.113=0 +TitleList.Status.113=0 +TitleList.Keywords.113= +TitleList.ContextNumber.113=1069 +TitleList.ApplyTemp.113=0 +TitleList.Expanded.113=0 +TitleList.Kind.113=0 +TitleList.Title.114=Special Thanks +TitleList.Level.114=0 +TitleList.Url.114=Special_Thanks.htm +TitleList.Icon.114=0 +TitleList.Status.114=0 +TitleList.Keywords.114= +TitleList.ContextNumber.114=1024 +TitleList.ApplyTemp.114=0 +TitleList.Expanded.114=0 +TitleList.Kind.114=0 +TitleList.Title.115=Fixed Top Style +TitleList.Level.115=0 +TitleList.Url.115=template\fixedtop.htm +TitleList.Icon.115=0 +TitleList.Status.115=0 +TitleList.Keywords.115= +TitleList.ContextNumber.115= +TitleList.ApplyTemp.115=0 +TitleList.Expanded.115=0 +TitleList.Kind.115=2 diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 433e061a..4fadd073 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -89,6 +89,8 @@ static void registercommands() cmdnew(cmd, "chd", cbInstrChd, false); //Change directory cmdnew(cmd, "disasm\1dis\1d", cbDebugDisasm, true); //doDisasm cmdnew(cmd, "HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger + cmdnew(cmd, "dump", cbDebugDump, true); //dump at address + cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address //user database cmdnew(cmd, "cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment @@ -135,25 +137,20 @@ static void registercommands() cmdnew(cmd, "msg", cbScriptMsg, false); cmdnew(cmd, "msgyn", cbScriptMsgyn, false); - //undocumented - cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc) - - cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test - cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction - - cmdnew(cmd, "dump", cbDebugDump, true); //dump at address - cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address - cmdnew(cmd, "dprintf", cbPrintf, false); //printf - - cmdnew(cmd, "refinit", cbInstrRefinit, false); - cmdnew(cmd, "refadd", cbInstrRefadd, false); + //data cmdnew(cmd, "reffind\1findref\1ref", cbInstrRefFind, true); cmdnew(cmd, "refstr\1strref", cbInstrRefStr, true); + cmdnew(cmd, "find", cbInstrFind, true); //find a pattern + //undocumented + cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc) + cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test + cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction + cmdnew(cmd, "dprintf", cbPrintf, false); //printf + cmdnew(cmd, "refinit", cbInstrRefinit, false); + cmdnew(cmd, "refadd", cbInstrRefadd, false); cmdnew(cmd, "setstr\1strset", cbInstrSetstr, false); //set a string variable cmdnew(cmd, "getstr\1strget", cbInstrGetstr, false); //get a string variable - - cmdnew(cmd, "find", cbInstrFind, true); //find a pattern } static bool cbCommandProvider(char* cmd, int maxlen) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 5d8e3a25..e54be6de 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -187,6 +187,13 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) mFollowMenu->actions().last()->setObjectName(QString("DUMP|")+QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper()); connect(mFollowMenu->actions().last(), SIGNAL(triggered()), this, SLOT(followActionSlot())); + wMenu->addSeparator(); + + //wMenu->addMenu(mSearchMenu); + + mReferencesMenu->addAction(mReferenceSelectedAddress); + wMenu->addMenu(mReferencesMenu); + QAction* wAction = wMenu->exec(event->globalPos()); } } @@ -268,6 +275,24 @@ void CPUDisassembly::setupRightClickContextMenu() // Menu mFollowMenu = new QMenu("&Follow in Dump", this); + //-------------------- Find references to ----------------------- + // Menu + mReferencesMenu = new QMenu("Find &references to", this); + + // Selected address + mReferenceSelectedAddress = new QAction("&Selected address", this); + mReferenceSelectedAddress->setShortcutContext(Qt::WidgetShortcut); + mReferenceSelectedAddress->setShortcut(QKeySequence("ctrl+r")); + this->addAction(mReferenceSelectedAddress); + connect(mReferenceSelectedAddress, SIGNAL(triggered()), this, SLOT(findReferences())); + + //---------------------- Search for ----------------------------- + // Menu + mSearchMenu = new QMenu("&Search for", this); + + // + + //---------------------- Breakpoints ----------------------------- // Menu mBPMenu = new QMenu("Breakpoint", this); @@ -614,3 +639,10 @@ void CPUDisassembly::gotoNext() { historyNext(); } + +void CPUDisassembly::findReferences() +{ + QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("findref " + addrText + ", " + addrText).toUtf8().constData()); + emit displayReferencesWidget(); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 09196ce8..0989e51a 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -30,6 +30,7 @@ public: void setHwBpAt(uint_t va, int slot); signals: + void displayReferencesWidget(); public slots: void toggleInt3BPAction(); @@ -49,6 +50,7 @@ public slots: void followActionSlot(); void gotoPrevious(); void gotoNext(); + void findReferences(); private: @@ -60,6 +62,8 @@ private: QMenu* mFollowMenu; QMenu* mBPMenu; QMenu* mHwSlotSelectMenu; + QMenu* mReferencesMenu; + QMenu* mSearchMenu; QAction* mToggleInt3BpAction; QAction* mSetHwBpAction; @@ -78,6 +82,7 @@ private: QAction* mGotoExpression; QAction* mGotoPrevious; QAction* mGotoNext; + QAction* mReferenceSelectedAddress; }; #endif // CPUDISASSEMBLY_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index 4521a363..5ba0f63f 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -97,12 +97,3 @@ QVBoxLayout* CPUWidget::getBotRightWidget(void) { return ui->mBotRightFrameLayout; } - -void CPUWidget::runSelection() -{ - if(!DbgIsDebugging()) - return; - QString command = "bp " + QString("%1").arg(mDisas->rvaToVa(mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper() + ", ss"; - if(DbgCmdExecDirect(command.toUtf8().constData())) - DbgCmdExecDirect("run"); -} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h index cb2940c2..e980d4fc 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h @@ -28,17 +28,14 @@ public: QVBoxLayout* getBotLeftWidget(void); QVBoxLayout* getBotRightWidget(void); -signals: - -public slots: - void runSelection(); - -private: - Ui::CPUWidget *ui; - Disassembly* mDisas; +public: + CPUDisassembly* mDisas; RegistersView* mGeneralRegs; InfoBox* mInfo; QTabWidget* mRegsTab; + +private: + Ui::CPUWidget *ui; }; #endif // CPUWIDGET_H diff --git a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp index fc4c45f8..4fac23ca 100644 --- a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp @@ -27,6 +27,8 @@ void ExceptionRangeDialog::on_editStart_textChanged(const QString &arg1) ui->btnOk->setEnabled(false); return; } + if(ui->editStart->text()=="-1") + ui->editStart->setText("FFFFFFFF"); bool converted=false; unsigned long start=ui->editStart->text().toUInt(&converted, 16); if(!converted) @@ -49,6 +51,8 @@ void ExceptionRangeDialog::on_editEnd_textChanged(const QString &arg1) ui->btnOk->setEnabled(false); return; } + if(ui->editEnd->text()=="-1") + ui->editEnd->setText("FFFFFFFF"); bool converted=false; unsigned long start=ui->editStart->text().toUInt(&converted, 16); if(!converted) diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 01d38526..f33fde53 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -119,7 +119,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(ui->actioneRun,SIGNAL(triggered()),this,SLOT(execeRun())); connect(ui->actioneRtr,SIGNAL(triggered()),this,SLOT(execeRtr())); connect(ui->actionScript,SIGNAL(triggered()),this,SLOT(displayScriptWidget())); - connect(ui->actionRunSelection,SIGNAL(triggered()),mCpuWidget,SLOT(runSelection())); + connect(ui->actionRunSelection,SIGNAL(triggered()),this,SLOT(runSelection())); connect(ui->actionCpu,SIGNAL(triggered()),this,SLOT(displayCpuWidget())); connect(ui->actionSymbolInfo,SIGNAL(triggered()),this,SLOT(displaySymbolWidget())); connect(mSymbolView,SIGNAL(showCpu()),this,SLOT(displayCpuWidget())); @@ -136,6 +136,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(Bridge::getBridge(), SIGNAL(menuAddMenuEntry(int,QString)), this, SLOT(addMenuEntry(int,QString))); connect(Bridge::getBridge(), SIGNAL(menuAddSeparator(int)), this, SLOT(addSeparator(int))); connect(Bridge::getBridge(), SIGNAL(menuClearMenu(int)), this, SLOT(clearMenu(int))); + connect(mCpuWidget->mDisas, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidget())); //Set default setttings (when not set) SettingsDialog defaultSettings; @@ -529,7 +530,7 @@ void MainWindow::setLastException(unsigned int exceptionCode) void MainWindow::findStrings() { - DbgCmdExec("strref"); + DbgCmdExec(QString("strref " + QString("%1").arg(mCpuWidget->mDisas->rvaToVa(mCpuWidget->mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper()).toUtf8().constData()); displayReferencesWidget(); } @@ -669,3 +670,12 @@ void MainWindow::menuEntrySlot() DbgMenuEntryClicked(hEntry); } } + +void MainWindow::runSelection() +{ + if(!DbgIsDebugging()) + return; + QString command = "bp " + QString("%1").arg(mCpuWidget->mDisas->rvaToVa(mCpuWidget->mDisas->getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper() + ", ss"; + if(DbgCmdExecDirect(command.toUtf8().constData())) + DbgCmdExecDirect("run"); +} diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index d40c9f5b..48b3ef27 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -67,6 +67,7 @@ public slots: void addSeparator(int hMenu); void clearMenu(int hMenu); void menuEntrySlot(); + void runSelection(); private: Ui::MainWindow *ui; From f35240b3bb542121aa41d7c464d763626245ca5b Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 29 Apr 2014 22:45:57 +0200 Subject: [PATCH 016/676] GUI: added 'Search for' context menu in the disassembler. You can now search for constants (+strings) from this menu --- .../Project/Src/BasicView/WordEditDialog.cpp | 4 --- .../Project/Src/Gui/CPUDisassembly.cpp | 30 +++++++++++++++++-- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 5 ++++ x64_dbg_gui/Project/Src/Gui/MainWindow.ui | 2 +- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp index 4cbb50d2..3549f317 100644 --- a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.cpp @@ -8,7 +8,6 @@ WordEditDialog::WordEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Wo setModal(true); setWindowFlags(Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint); - mWord = 0; connect(ui->expressionLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(expressionChanged(QString))); @@ -37,8 +36,6 @@ void WordEditDialog::expressionChanged(QString s) } } - - void WordEditDialog::setup(QString title, uint_t defVal, int byteCount) { this->setWindowTitle(title); @@ -51,7 +48,6 @@ void WordEditDialog::setup(QString title, uint_t defVal, int byteCount) ui->expressionLineEdit->setFocus(); } - uint_t WordEditDialog::getVal() { return mWord; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index e54be6de..3f77a539 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -189,7 +189,9 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) wMenu->addSeparator(); - //wMenu->addMenu(mSearchMenu); + mSearchMenu->addAction(mSearchConstant); + mSearchMenu->addAction(mSearchStrings); + wMenu->addMenu(mSearchMenu); mReferencesMenu->addAction(mReferenceSelectedAddress); wMenu->addMenu(mReferencesMenu); @@ -290,8 +292,13 @@ void CPUDisassembly::setupRightClickContextMenu() // Menu mSearchMenu = new QMenu("&Search for", this); - // + // Constant + mSearchConstant = new QAction("&Constant", this); + connect(mSearchConstant, SIGNAL(triggered()), this, SLOT(findConstant())); + // String References + mSearchStrings = new QAction("&String references", this); + connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings())); //---------------------- Breakpoints ----------------------------- // Menu @@ -646,3 +653,22 @@ void CPUDisassembly::findReferences() DbgCmdExec(QString("findref " + addrText + ", " + addrText).toUtf8().constData()); emit displayReferencesWidget(); } + +void CPUDisassembly::findConstant() +{ + WordEditDialog wordEdit(this); + wordEdit.setup("Constant", 0, sizeof(int_t)); + if(wordEdit.exec() != QDialog::Accepted) //cancel pressed + return; + QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper(); + QString constText=QString("%1").arg(wordEdit.getVal(), sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("findref " + constText + ", " + addrText).toUtf8().constData()); + emit displayReferencesWidget(); +} + +void CPUDisassembly::findStrings() +{ + QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("strref " + addrText).toUtf8().constData()); + emit displayReferencesWidget(); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 0989e51a..6fa4a7fe 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -12,6 +12,7 @@ #include #include #include +#include "WordEditDialog.h" class CPUDisassembly : public Disassembly { @@ -51,6 +52,8 @@ public slots: void gotoPrevious(); void gotoNext(); void findReferences(); + void findConstant(); + void findStrings(); private: @@ -83,6 +86,8 @@ private: QAction* mGotoPrevious; QAction* mGotoNext; QAction* mReferenceSelectedAddress; + QAction* mSearchConstant; + QAction* mSearchStrings; }; #endif // CPUDISASSEMBLY_H diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui index 6461af13..e9ed7d2f 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui @@ -494,7 +494,7 @@ &Find Strings - &Find Strings + Find Strings From 9cd792c070249047ded024644a2193d3b441bb7d Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 29 Apr 2014 22:47:48 +0200 Subject: [PATCH 017/676] GUI: 'Ready' instead of 'Terminated' on debugger start --- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index f33fde53..efc7662d 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -93,7 +93,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // Status bar mStatusLabel=new StatusLabel(ui->statusBar); - mStatusLabel->setText("Terminated"); + mStatusLabel->setText("Ready"); ui->statusBar->addWidget(mStatusLabel); mLastLogLabel=new StatusLabel(); ui->statusBar->addPermanentWidget(mLastLogLabel, 1); From 32ffed108b81d1da037c34f442ee0d5ad7d32ac2 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 29 Apr 2014 23:03:45 +0200 Subject: [PATCH 018/676] GUI: little refactoring --- .../Project/Src/Gui/CPUDisassembly.cpp | 85 ++++++++++--------- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 3 - 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 3f77a539..12afed4f 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -206,6 +206,8 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) ************************************************************************************/ void CPUDisassembly::setupRightClickContextMenu() { + ///Setup menu actions + // Labels mSetLabel = new QAction("Label", this); mSetLabel->setShortcutContext(Qt::WidgetShortcut); @@ -241,6 +243,48 @@ void CPUDisassembly::setupRightClickContextMenu() this->addAction(mAssemble); connect(mAssemble, SIGNAL(triggered()), this, SLOT(assembleAt())); + //---------------------- Breakpoints ----------------------------- + // Menu + mBPMenu = new QMenu("Breakpoint", this); + + // Standard breakpoint (option set using SetBPXOption) + mToggleInt3BpAction = new QAction("Toggle", this); + mToggleInt3BpAction->setShortcutContext(Qt::WidgetShortcut); + mToggleInt3BpAction->setShortcut(QKeySequence(Qt::Key_F2)); + this->addAction(mToggleInt3BpAction); + connect(mToggleInt3BpAction, SIGNAL(triggered()), this, SLOT(toggleInt3BPAction())); + + // HW BP + mHwSlotSelectMenu = new QMenu("Set Hardware on Execution", this); + + mSetHwBpAction = new QAction("Set Hardware on Execution", this); + connect(mSetHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot())); + + mClearHwBpAction = new QAction("Remove Hardware", this); + connect(mClearHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot())); + + msetHwBPOnSlot0Action = new QAction("Set Hardware on Execution on Slot 0 (Free)", this); + connect(msetHwBPOnSlot0Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot0ActionSlot())); + + msetHwBPOnSlot1Action = new QAction("Set Hardware on Execution on Slot 1 (Free)", this); + connect(msetHwBPOnSlot1Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot1ActionSlot())); + + msetHwBPOnSlot2Action = new QAction("Set Hardware on Execution on Slot 2 (Free)", this); + connect(msetHwBPOnSlot2Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot2ActionSlot())); + + msetHwBPOnSlot3Action = new QAction("Set Hardware on Execution on Slot 3 (Free)", this); + connect(msetHwBPOnSlot3Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot3ActionSlot())); + + //-------------------------------------------------------------------- + + //---------------------- New origin here ----------------------------- + mSetNewOriginHere = new QAction("Set New Origin Here", this); + mSetNewOriginHere->setShortcutContext(Qt::WidgetShortcut); + mSetNewOriginHere->setShortcut(QKeySequence("ctrl+*")); + this->addAction(mSetNewOriginHere); + connect(mSetNewOriginHere, SIGNAL(triggered()), this, SLOT(setNewOriginHereActionSlot())); + + //---------------------- Go to ----------------------------------- // Menu mGotoMenu = new QMenu("Go to", this); @@ -299,45 +343,6 @@ void CPUDisassembly::setupRightClickContextMenu() // String References mSearchStrings = new QAction("&String references", this); connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings())); - - //---------------------- Breakpoints ----------------------------- - // Menu - mBPMenu = new QMenu("Breakpoint", this); - - // Standard breakpoint (option set using SetBPXOption) - mToggleInt3BpAction = new QAction("Toggle", this); - mToggleInt3BpAction->setShortcutContext(Qt::WidgetShortcut); - mToggleInt3BpAction->setShortcut(QKeySequence(Qt::Key_F2)); - this->addAction(mToggleInt3BpAction); - connect(mToggleInt3BpAction, SIGNAL(triggered()), this, SLOT(toggleInt3BPAction())); - - // HW BP - mHwSlotSelectMenu = new QMenu("Set Hardware on Execution", this); - - mSetHwBpAction = new QAction("Set Hardware on Execution", this); - connect(mSetHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot())); - - mClearHwBpAction = new QAction("Remove Hardware", this); - connect(mClearHwBpAction, SIGNAL(triggered()), this, SLOT(toggleHwBpActionSlot())); - - msetHwBPOnSlot0Action = new QAction("Set Hardware on Execution on Slot 0 (Free)", this); - connect(msetHwBPOnSlot0Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot0ActionSlot())); - - msetHwBPOnSlot1Action = new QAction("Set Hardware on Execution on Slot 1 (Free)", this); - connect(msetHwBPOnSlot1Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot1ActionSlot())); - - msetHwBPOnSlot2Action = new QAction("Set Hardware on Execution on Slot 2 (Free)", this); - connect(msetHwBPOnSlot2Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot2ActionSlot())); - - msetHwBPOnSlot3Action = new QAction("Set Hardware on Execution on Slot 3 (Free)", this); - connect(msetHwBPOnSlot3Action, SIGNAL(triggered()), this, SLOT(setHwBpOnSlot3ActionSlot())); - - //---------------------- New origin here ----------------------------- - mSetNewOriginHere = new QAction("Set New Origin Here", this); - mSetNewOriginHere->setShortcutContext(Qt::WidgetShortcut); - mSetNewOriginHere->setShortcut(QKeySequence("ctrl+*")); - this->addAction(mSetNewOriginHere); - connect(mSetNewOriginHere, SIGNAL(triggered()), this, SLOT(setNewOriginHereActionSlot())); } void CPUDisassembly::gotoOrigin() @@ -657,7 +662,7 @@ void CPUDisassembly::findReferences() void CPUDisassembly::findConstant() { WordEditDialog wordEdit(this); - wordEdit.setup("Constant", 0, sizeof(int_t)); + wordEdit.setup("Enter Constant", 0, sizeof(int_t)); if(wordEdit.exec() != QDialog::Accepted) //cancel pressed return; QString addrText=QString("%1").arg(rvaToVa(getInitialSelection()), sizeof(int_t)*2, 16, QChar('0')).toUpper(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 6fa4a7fe..1c63cf37 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -57,9 +57,6 @@ public slots: private: - // Rigth Click Context Menu - QMenu* mRightClickContextMenu; - // Menus QMenu* mGotoMenu; QMenu* mFollowMenu; From c523a37dc0eb8ee46b89d956417cd5173e24235f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 30 Apr 2014 01:16:12 +0200 Subject: [PATCH 019/676] DBG: fixed a bug in specialformat (thanks to Nukem for reporting!) --- x64_dbg_dbg/command.cpp | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/x64_dbg_dbg/command.cpp b/x64_dbg_dbg/command.cpp index 2d18b419..6af81812 100644 --- a/x64_dbg_dbg/command.cpp +++ b/x64_dbg_dbg/command.cpp @@ -1,5 +1,6 @@ #include "command.h" #include "argument.h" +#include "value.h" #include "console.h" #include "debugger.h" #include "math.h" @@ -195,11 +196,20 @@ CMDRESULT cmdloop(COMMAND* command_list, CBCOMMAND cbUnknownCommand, CBCOMMANDPR /* - custom command formatting rules */ + +static bool isvalidexpression(const char* expression) +{ + uint value; + return valfromstring(expression, &value); +} + static void specialformat(char* string) { int len=strlen(string); char* found=strstr(string, "="); char* str=(char*)emalloc(len*2, "specialformat:str"); + char* backup=(char*)emalloc(len+1, "specialformat:backup"); + strcpy(backup, string); //create a backup of the string memset(str, 0, len*2); if(found) //contains = { @@ -210,6 +220,7 @@ static void specialformat(char* string) { *found='='; efree(str, "specialformat:str"); + efree(backup, "specialformat:backup"); return; } int flen=strlen(found); //n(+)=n++ @@ -224,20 +235,32 @@ static void specialformat(char* string) { char op=*a; *a=0; - sprintf(str, "mov %s,%s%c%s", string, string, op, found); + if(isvalidexpression(string)) + sprintf(str, "mov %s,%s%c%s", string, string, op, found); + else + strcpy(str, backup); } else - sprintf(str, "mov %s,%s", string, found); + { + if(isvalidexpression(string) && isvalidexpression(found)) + sprintf(str, "mov %s,%s", string, found); + else + strcpy(str, backup); + } strcpy(string, str); } else if((string[len-1]=='+' and string[len-2]=='+') or (string[len-1]=='-' and string[len-2]=='-')) //eax++/eax-- { string[len-2]=0; char op=string[len-1]; - sprintf(str, "mov %s,%s%c1", string, string, op); + if(isvalidexpression(string)) + sprintf(str, "mov %s,%s%c1", string, string, op); + else + strcpy(str, backup); strcpy(string, str); } efree(str, "specialformat:str"); + efree(backup, "specialformat:backup"); } /* From 282e185557f269be2ffd33823443007eb893d6ad Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 1 May 2014 17:11:24 +0200 Subject: [PATCH 020/676] BRIDGE: added selection API GUI: added selection API for Disassembly, Dump and Stack --- x64_dbg_bridge/bridgemain.cpp | 10 +++++ x64_dbg_bridge/bridgemain.h | 16 +++++++- .../Project/Src/BasicView/Disassembly.cpp | 2 - x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 12 +++++- x64_dbg_gui/Project/Src/BasicView/HexDump.h | 4 +- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 38 +++++++++++++++++++ x64_dbg_gui/Project/Src/Bridge/Bridge.h | 9 ++++- .../Project/Src/Gui/CPUDisassembly.cpp | 15 ++++++++ x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 + x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 14 +++++++ x64_dbg_gui/Project/Src/Gui/CPUDump.h | 3 ++ x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 14 +++++++ x64_dbg_gui/Project/Src/Gui/CPUStack.h | 2 + 13 files changed, 135 insertions(+), 6 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 6f747860..cd0b18cd 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -814,6 +814,16 @@ BRIDGE_IMPEXP void GuiMenuClear(int hMenu) _gui_sendmessage(GUI_MENU_CLEAR, (void*)(duint)hMenu, 0); } +BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection) +{ + return (bool)(duint)_gui_sendmessage(GUI_SELECTION_GET, (void*)(duint)hWindow, selection); +} + +BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection) +{ + return (bool)(duint)_gui_sendmessage(GUI_SELECTION_SET, (void*)(duint)hWindow, (void*)selection); +} + //Main BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 5557a0d9..48e75d47 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -489,6 +489,10 @@ BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry); //Gui defines #define GUI_PLUGIN_MENU 0 +#define GUI_DISASSEMBLY 0 +#define GUI_DUMP 1 +#define GUI_STACK 2 + //Gui enums enum GUIMSG { @@ -533,7 +537,9 @@ enum GUIMSG GUI_MENU_ADD, // param1=int hMenu, param2=const char* title GUI_MENU_ADD_ENTRY, // param1=int hMenu, param2=const char* title GUI_MENU_ADD_SEPARATOR, // param1=int hMenu, param2=unused - GUI_MENU_CLEAR // param1=int hMenu, param2=unused + GUI_MENU_CLEAR, // param1=int hMenu, param2=unused + GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection + GUI_SELECTION_SET // param1=int hWindow, param2=const SELECTIONDATA* selection }; //GUI structures @@ -544,6 +550,12 @@ struct CELLINFO const char* str; }; +struct SELECTIONDATA +{ + duint start; + duint end; +}; + //GUI functions BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip); BRIDGE_IMPEXP void GuiSetDebugState(DBGSTATE state); @@ -588,6 +600,8 @@ BRIDGE_IMPEXP int GuiMenuAdd(int hMenu, const char* title); BRIDGE_IMPEXP int GuiMenuAddEntry(int hMenu, const char* title); BRIDGE_IMPEXP void GuiMenuAddSeparator(int hMenu); BRIDGE_IMPEXP void GuiMenuClear(int hMenu); +BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection); +BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection); #ifdef __cplusplus } diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index a4fd4fa4..7258b070 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -876,7 +876,6 @@ void Disassembly::expandSelectionUpTo(int_t to) } } - void Disassembly::setSingleSelection(int_t index) { mSelection.firstSelectedIndex = index; @@ -906,7 +905,6 @@ int_t Disassembly::getSelectionEnd() return mSelection.toIndex; } - void Disassembly::selectNext() { int_t wAddr = getInstructionRVA(getInitialSelection(), 1); diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp index dfa6456c..5a04d250 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp @@ -241,11 +241,21 @@ void HexDump::setSingleSelection(int_t rva) mSelection.toIndex = rva; } -int HexDump::getInitialSelection() +int_t HexDump::getInitialSelection() { return mSelection.firstSelectedIndex; } +int_t HexDump::getSelectionStart() +{ + return mSelection.fromIndex; +} + +int_t HexDump::getSelectionEnd() +{ + return mSelection.toIndex; +} + bool HexDump::isSelected(int_t rva) { if(rva >= mSelection.fromIndex && rva <= mSelection.toIndex) diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.h b/x64_dbg_gui/Project/Src/BasicView/HexDump.h index b54f31aa..bcfab897 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HexDump.h +++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.h @@ -95,7 +95,9 @@ public: // Selection Management void expandSelectionUpTo(int_t rva); void setSingleSelection(int_t rva); - int getInitialSelection(); + int_t getInitialSelection(); + int_t getSelectionStart(); + int_t getSelectionEnd(); bool isSelected(int_t rva); QString getString(int col, int_t rva); diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 740800e1..b66fd361 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -256,6 +256,44 @@ void Bridge::emitMenuClearMenu(int hMenu) emit menuClearMenu(hMenu); } +bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) +{ + switch(hWindow) + { + case GUI_DISASSEMBLY: + emit selectionDisasmGet(selection); + break; + case GUI_DUMP: + emit selectionDumpGet(selection); + break; + case GUI_STACK: + emit selectionStackGet(selection); + break; + default: + return false; + } + return true; +} + +bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection) +{ + switch(hWindow) + { + case GUI_DISASSEMBLY: + emit selectionDisasmSet(selection); + break; + case GUI_DUMP: + emit selectionDumpSet(selection); + break; + case GUI_STACK: + emit selectionStackSet(selection); + break; + default: + return false; + } + return true; +} + /************************************************************************************ Static Functions ************************************************************************************/ diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h index 09d39fac..9e317d9a 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h @@ -13,7 +13,6 @@ #include "Exports.h" #include "Imports.h" - class Bridge : public QObject { Q_OBJECT @@ -68,6 +67,8 @@ public: int emitMenuAddMenuEntry(int hMenu, QString title); void emitMenuAddSeparator(int hMenu); void emitMenuClearMenu(int hMenu); + bool emitSelectionGet(int hWindow, SELECTIONDATA* selection); + bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection); //Public variables void* winId; @@ -113,6 +114,12 @@ signals: void menuAddMenuEntry(int hMenu, QString title); void menuAddSeparator(int hMenu); void menuClearMenu(int hMenu); + void selectionDisasmGet(SELECTIONDATA* selection); + void selectionDisasmSet(const SELECTIONDATA* selection); + void selectionDumpGet(SELECTIONDATA* selection); + void selectionDumpSet(const SELECTIONDATA* selection); + void selectionStackGet(SELECTIONDATA* selection); + void selectionStackSet(const SELECTIONDATA* selection); private: QMutex mBridgeMutex; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 12afed4f..5a937a9b 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -4,6 +4,9 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent) { // Create the action list for the right click context menu setupRightClickContextMenu(); + + connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*))); + connect(Bridge::getBridge(), SIGNAL(selectionDisasmSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); } void CPUDisassembly::mousePressEvent(QMouseEvent* event) @@ -677,3 +680,15 @@ void CPUDisassembly::findStrings() DbgCmdExec(QString("strref " + addrText).toUtf8().constData()); emit displayReferencesWidget(); } + +void CPUDisassembly::selectionGet(SELECTIONDATA* selection) +{ + selection->start=getSelectionStart(); + selection->end=getSelectionEnd(); +} + +void CPUDisassembly::selectionSet(const SELECTIONDATA* selection) +{ + setSingleSelection(selection->start); + expandSelectionUpTo(selection->end); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 1c63cf37..1ae13df7 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -54,6 +54,8 @@ public slots: void findReferences(); void findConstant(); void findStrings(); + void selectionGet(SELECTIONDATA* selection); + void selectionSet(const SELECTIONDATA* selection); private: diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp index 2344557c..3bb6562b 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp @@ -5,6 +5,8 @@ CPUDump::CPUDump(QWidget *parent) : HexDump(parent) hexAsciiSlot(); connect(Bridge::getBridge(), SIGNAL(dumpAt(int_t)), this, SLOT(printDumpAt(int_t))); + connect(Bridge::getBridge(), SIGNAL(selectionDumpGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*))); + connect(Bridge::getBridge(), SIGNAL(selectionDumpSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); setupContextMenu(); } @@ -580,3 +582,15 @@ void CPUDump::disassemblySlot() msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint)); msg.exec(); } + +void CPUDump::selectionGet(SELECTIONDATA* selection) +{ + selection->start=getSelectionStart(); + selection->end=getSelectionEnd(); +} + +void CPUDump::selectionSet(const SELECTIONDATA* selection) +{ + setSingleSelection(selection->start); + expandSelectionUpTo(selection->end); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h index cea3b1c7..80f07a0e 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h @@ -45,6 +45,9 @@ public slots: void addressSlot(); void disassemblySlot(); + void selectionGet(SELECTIONDATA* selection); + void selectionSet(const SELECTIONDATA* selection); + private: QMenu* mGotoMenu; QAction* mGotoExpression; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp index 4669e538..59478fde 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp @@ -26,6 +26,8 @@ CPUStack::CPUStack(QWidget *parent) : HexDump(parent) appendDescriptor(0, "Comments", false, wColDesc); connect(Bridge::getBridge(), SIGNAL(stackDumpAt(uint_t,uint_t)), this, SLOT(stackDumpAt(uint_t,uint_t))); + connect(Bridge::getBridge(), SIGNAL(selectionStackGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*))); + connect(Bridge::getBridge(), SIGNAL(selectionStackSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); setupContextMenu(); } @@ -167,3 +169,15 @@ void CPUStack::gotoExpressionSlot() DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData()); } } + +void CPUStack::selectionGet(SELECTIONDATA* selection) +{ + selection->start=getSelectionStart(); + selection->end=getSelectionEnd(); +} + +void CPUStack::selectionSet(const SELECTIONDATA* selection) +{ + setSingleSelection(selection->start); + expandSelectionUpTo(selection->end); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h index 0de3a760..6d2d0257 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h @@ -25,6 +25,8 @@ public slots: void gotoSpSlot(); void gotoBpSlot(); void gotoExpressionSlot(); + void selectionGet(SELECTIONDATA* selection); + void selectionSet(const SELECTIONDATA* selection); private: uint_t mCsp; From 92df7faea122481fc646c92f97523f563cc072d5 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 1 May 2014 18:39:40 +0200 Subject: [PATCH 021/676] DBG: added size argument to 'find', 'strref' and 'reffind' DBG: updated reference API to support a custom size and start address PROJECT: updated help --- help/find.htm | 6 ++- help/reffind_findref_ref.htm | 85 +++++++++++++++++++----------------- help/refstr_strref.htm | 53 +++++++++++----------- x64_dbg_dbg/instruction.cpp | 32 +++++++++++--- x64_dbg_dbg/reference.cpp | 40 ++++++++++++----- x64_dbg_dbg/reference.h | 2 +- 6 files changed, 135 insertions(+), 83 deletions(-) diff --git a/help/find.htm b/help/find.htm index 110e18b6..9cf8087d 100644 --- a/help/find.htm +++ b/help/find.htm @@ -21,9 +21,11 @@ from. Notice that the searching will stop when the end of the memory page this address resides in has been reached. This means you cannot search the complete process memory without enumerating the memory pages first.

  arg2: The byte pattern to search for. This byte -pattern can contain wildcards (?) for example: "EB0?90??8D"

+pattern can contain wildcards (?) for example: "EB0?90??8D".

+

[arg3]: +The size of the data to search in.

result
The $result variable is set to the virtual address of the address that matches the byte pattern. $result will be 0 when the pattern could not be matched.

-

 

\ No newline at end of file +

 

\ No newline at end of file diff --git a/help/reffind_findref_ref.htm b/help/reffind_findref_ref.htm index 734b5778..61ba8cae 100644 --- a/help/reffind_findref_ref.htm +++ b/help/reffind_findref_ref.htm @@ -1,39 +1,46 @@ - - - -reffind/findref/ref - - - - - - - -

reffind[,findref,ref]
Find references to a certain value.

-

arguments
-  -arg1: The value to look for. - -

-

- -[arg2]: Address of/inside a memory page to look -in. When -not specified CIP will be used.  - -

-

- - - result - -
-The $result variable is set to the number of references -found.

\ No newline at end of file + + + +reffind/findref/ref + + + + + + + +

reffind[,findref,ref]
Find references to a certain value.

+

arguments
+  +arg1: The value to look for. + +

+

+ +[arg2]: Address of/inside a memory page to look +in. When +not specified CIP will be used.  + +

+

+ + [arg3]: +The size +of the data to search in. + +

+

+ + + result + +
+The $result variable is set to the number of references +found.

\ No newline at end of file diff --git a/help/refstr_strref.htm b/help/refstr_strref.htm index c9bfc8f4..731ad8ed 100644 --- a/help/refstr_strref.htm +++ b/help/refstr_strref.htm @@ -1,25 +1,28 @@ - - - -refstr/strref - - - - - - - -

refstr[,strref]
Find referenced text strings.

-

arguments
[arg1]: Address of/inside a memory page to find -referenced text strings in. When not specified CIP -will be used.

-

result
The $result variable is set to the number of string references -found.

\ No newline at end of file + + + +refstr/strref + + + + + + + +

refstr[,strref]
Find referenced text strings.

+

arguments
[arg1]: Address of/inside a memory page to find +referenced text strings in. When not specified CIP +will be used.

+

+ [arg2]: The size of the data +to search in.

+

result
The $result variable is set to the number of string references +found.

\ No newline at end of file diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index 3704c818..6b005073 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -782,17 +782,23 @@ CMDRESULT cbInstrRefFind(int argc, char* argv[]) { if(argc<2) { - puts("not enough arguments!"); + dputs("not enough arguments!"); return STATUS_ERROR; } uint value=0; if(!valfromstring(argv[1], &value, false)) return STATUS_ERROR; uint addr=0; - if(argc<3 or !valfromstring(argv[2], &addr, true)) + if(argc<3 or !valfromstring(argv[2], &addr)) addr=GetContextData(UE_CIP); + uint size; + if(argc>=4) + { + if(!valfromstring(argv[3], &size)) + size=0; + } uint ticks=GetTickCount(); - int found=reffind(addr, cbRefFind, (void*)value, false); + int found=reffind(addr, size, cbRefFind, (void*)value, false); dprintf("%u references in %ums\n", found, GetTickCount()-ticks); varset("$result", found, false); return STATUS_CONTINUE; @@ -852,8 +858,14 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[]) uint addr; if(argc<2 or !valfromstring(argv[1], &addr, true)) addr=GetContextData(UE_CIP); + uint size; + if(argc>=3) + { + if(!valfromstring(argv[2], &size, true)) + size=0; + } uint ticks=GetTickCount(); - int found=reffind(addr, cbRefStr, 0, false); + int found=reffind(addr, size, cbRefStr, 0, false); dprintf("%u references in %ums\n", found, GetTickCount()-ticks); varset("$result", found, false); return STATUS_CONTINUE; @@ -953,7 +965,17 @@ CMDRESULT cbInstrFind(int argc, char* argv[]) return STATUS_ERROR; } uint start=addr-base; - uint foundoffset=memfindpattern(data+start, size-start, pattern); + uint find_size=0; + if(argc>=4) + { + if(!valfromstring(argv[3], &find_size)) + find_size=size-start; + if(find_size>(size-start)) + find_size=size-start; + } + else + find_size=size-start; + uint foundoffset=memfindpattern(data+start, find_size, pattern); uint result=0; if(foundoffset!=-1) result=addr+foundoffset; diff --git a/x64_dbg_dbg/reference.cpp b/x64_dbg_dbg/reference.cpp index 8465ceb8..f278a7de 100644 --- a/x64_dbg_dbg/reference.cpp +++ b/x64_dbg_dbg/reference.cpp @@ -3,22 +3,40 @@ #include "memory.h" #include "console.h" -int reffind(uint addr, CBREF cbRef, void* userinfo, bool silent) +int reffind(uint addr, uint size, CBREF cbRef, void* userinfo, bool silent) { - uint size=0; - uint base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &size); - if(!base or !size) + uint start_addr; + uint start_size; + uint base; + uint base_size; + base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &base_size); + if(!base or !base_size) { if(!silent) dputs("invalid memory page"); return 0; } - unsigned char* data=(unsigned char*)emalloc(size); - if(!memread(fdProcessInfo->hProcess, (const void*)base, data, size, 0)) + + if(!size) //assume the whole page + { + start_addr=base; + start_size=base_size; + } + else //custom boundaries + { + start_addr=addr; + uint maxsize=size-(start_addr-base); + if(sizehProcess, (const void*)start_addr, data, start_size, 0)) { if(!silent) dputs("error reading memory"); - efree(data); + efree(data, "reffind:data"); return 0; } DISASM disasm; @@ -27,18 +45,18 @@ int reffind(uint addr, CBREF cbRef, void* userinfo, bool silent) disasm.Archi=64; #endif // _WIN64 disasm.EIP=(UIntPtr)data; - disasm.VirtualAddr=(UInt64)base; + disasm.VirtualAddr=(UInt64)start_addr; uint i=0; BASIC_INSTRUCTION_INFO basicinfo; cbRef(&disasm, &basicinfo, 0); //allow initializing REFINFO refinfo; memset(&refinfo, 0, sizeof(REFINFO)); refinfo.userinfo=userinfo; - while(i Date: Fri, 2 May 2014 18:40:00 +0200 Subject: [PATCH 022/676] GUI: fixed GuiSelectionGet & GuiSelectionSet --- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 30 ++++++++++++++++++- .../Project/Src/Gui/CPUDisassembly.cpp | 20 ++++++++++--- x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 20 ++++++++++--- x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 20 ++++++++++--- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index b66fd361..31342c7b 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -258,6 +258,10 @@ void Bridge::emitMenuClearMenu(int hMenu) bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) { + if(!DbgIsDebugging()) + return false; + mBridgeMutex.lock(); + hasBridgeResult=false; switch(hWindow) { case GUI_DISASSEMBLY: @@ -270,13 +274,21 @@ bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) emit selectionStackGet(selection); break; default: + mBridgeMutex.unlock(); return false; } + while(!hasBridgeResult) //wait for thread completion + Sleep(100); + mBridgeMutex.unlock(); return true; } bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection) { + if(!DbgIsDebugging()) + return false; + mBridgeMutex.lock(); + hasBridgeResult=false; switch(hWindow) { case GUI_DISASSEMBLY: @@ -289,9 +301,13 @@ bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection) emit selectionStackSet(selection); break; default: + mBridgeMutex.unlock(); return false; } - return true; + while(!hasBridgeResult) //wait for thread completion + Sleep(100); + mBridgeMutex.unlock(); + return bridgeResult; } /************************************************************************************ @@ -587,6 +603,18 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa } break; + case GUI_SELECTION_GET: + { + Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2); + } + break; + + case GUI_SELECTION_SET: + { + Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2); + } + break; + default: { } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 5a937a9b..783dc02e 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -683,12 +683,24 @@ void CPUDisassembly::findStrings() void CPUDisassembly::selectionGet(SELECTIONDATA* selection) { - selection->start=getSelectionStart(); - selection->end=getSelectionEnd(); + selection->start=rvaToVa(getSelectionStart()); + selection->end=rvaToVa(getSelectionEnd()); + Bridge::getBridge()->BridgeSetResult(1); } void CPUDisassembly::selectionSet(const SELECTIONDATA* selection) { - setSingleSelection(selection->start); - expandSelectionUpTo(selection->end); + int_t selMin=getBase(); + int_t selMax=selMin + getSize(); + int_t start=selection->start; + int_t end=selection->end; + if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range + { + Bridge::getBridge()->BridgeSetResult(0); + return; + } + setSingleSelection(start - selMin); + expandSelectionUpTo(end - selMin); + reloadData(); + Bridge::getBridge()->BridgeSetResult(1); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp index 3bb6562b..52ee5884 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp @@ -585,12 +585,24 @@ void CPUDump::disassemblySlot() void CPUDump::selectionGet(SELECTIONDATA* selection) { - selection->start=getSelectionStart(); - selection->end=getSelectionEnd(); + selection->start=getSelectionStart() + mBase; + selection->end=getSelectionEnd() + mBase; + Bridge::getBridge()->BridgeSetResult(1); } void CPUDump::selectionSet(const SELECTIONDATA* selection) { - setSingleSelection(selection->start); - expandSelectionUpTo(selection->end); + int_t selMin=mBase; + int_t selMax=selMin + mSize; + int_t start=selection->start; + int_t end=selection->end; + if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range + { + Bridge::getBridge()->BridgeSetResult(0); + return; + } + setSingleSelection(start - selMin); + expandSelectionUpTo(end - selMin); + reloadData(); + Bridge::getBridge()->BridgeSetResult(1); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp index 59478fde..9e6ed4f7 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp @@ -172,12 +172,24 @@ void CPUStack::gotoExpressionSlot() void CPUStack::selectionGet(SELECTIONDATA* selection) { - selection->start=getSelectionStart(); - selection->end=getSelectionEnd(); + selection->start=getSelectionStart() + mBase; + selection->end=getSelectionEnd() + mBase; + Bridge::getBridge()->BridgeSetResult(1); } void CPUStack::selectionSet(const SELECTIONDATA* selection) { - setSingleSelection(selection->start); - expandSelectionUpTo(selection->end); + int_t selMin=mBase; + int_t selMax=selMin + mSize; + int_t start=selection->start; + int_t end=selection->end; + if(start < selMin || start >= selMax || end < selMin || end >= selMax) //selection out of range + { + Bridge::getBridge()->BridgeSetResult(0); + return; + } + setSingleSelection(start - selMin); + expandSelectionUpTo(end - selMin); + reloadData(); + Bridge::getBridge()->BridgeSetResult(1); } From 41fc89f40258748d1d11eb23a45120c611421347 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 4 May 2014 17:33:23 +0200 Subject: [PATCH 023/676] DBG: strings in the stack --- x64_dbg_dbg/disasm_helper.cpp | 2 + x64_dbg_dbg/instruction.cpp | 4 +- x64_dbg_dbg/stackinfo.cpp | 168 ++++++++++++++++++---------------- 3 files changed, 94 insertions(+), 80 deletions(-) diff --git a/x64_dbg_dbg/disasm_helper.cpp b/x64_dbg_dbg/disasm_helper.cpp index ddfdc02d..2fb64231 100644 --- a/x64_dbg_dbg/disasm_helper.cpp +++ b/x64_dbg_dbg/disasm_helper.cpp @@ -324,6 +324,8 @@ bool disasmgetstringat(uint addr, STRING_TYPE* type, char* ascii, char* unicode, { if(type) *type=str_none; + if(!disasmispossiblestring(addr)) + return false; unsigned char* data=(unsigned char*)emalloc((maxlen+1)*2, "disasmgetstringat:data"); memset(data, 0, (maxlen+1)*2); if(!memread(fdProcessInfo->hProcess, (const void*)addr, data, (maxlen+1)*2, 0)) diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index 6b005073..22fc8b46 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -824,12 +824,12 @@ bool cbRefStr(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo, REFINFO* refinf return false; if((basicinfo->type&TYPE_VALUE)==TYPE_VALUE) { - if(disasmispossiblestring(basicinfo->value.value) and disasmgetstringat(basicinfo->value.value, &strtype, string, string, 500)) + if(disasmgetstringat(basicinfo->value.value, &strtype, string, string, 500)) found=true; } if((basicinfo->type&TYPE_MEMORY)==TYPE_MEMORY) { - if(!found and disasmispossiblestring(basicinfo->memory.value) and disasmgetstringat(basicinfo->memory.value, &strtype, string, string, 500)) + if(!found and disasmgetstringat(basicinfo->memory.value, &strtype, string, string, 500)) found=true; } if(found) diff --git a/x64_dbg_dbg/stackinfo.cpp b/x64_dbg_dbg/stackinfo.cpp index db38b117..49c6ce73 100644 --- a/x64_dbg_dbg/stackinfo.cpp +++ b/x64_dbg_dbg/stackinfo.cpp @@ -11,88 +11,100 @@ bool stackcommentget(uint addr, STACK_COMMENT* comment) uint data=0; memset(comment, 0, sizeof(STACK_COMMENT)); memread(fdProcessInfo->hProcess, (const void*)addr, &data, sizeof(uint), 0); - if(memisvalidreadptr(fdProcessInfo->hProcess, data)) //valid memory - { - uint size=0; - uint base=memfindbaseaddr(fdProcessInfo->hProcess, data, &size); - uint readStart=data-16*4; - if(readStarthProcess, (const void*)readStart, disasmData, sizeof(disasmData), 0); - unsigned int prev=disasmback(disasmData, 0, sizeof(disasmData), data-readStart, 1); - uint previousInstr=readStart+prev; - DISASM disasm; - disasm.Options=NoformatNumeral; + if(!memisvalidreadptr(fdProcessInfo->hProcess, data)) //the stack value is no pointer + return false; + + uint size=0; + uint base=memfindbaseaddr(fdProcessInfo->hProcess, data, &size); + uint readStart=data-16*4; + if(readStarthProcess, (const void*)readStart, disasmData, sizeof(disasmData), 0); + unsigned int prev=disasmback(disasmData, 0, sizeof(disasmData), data-readStart, 1); + uint previousInstr=readStart+prev; + DISASM disasm; + disasm.Options=NoformatNumeral; #ifdef _WIN64 - disasm.Archi=64; + disasm.Archi=64; #endif // _WIN64 - disasm.VirtualAddr=previousInstr; - disasm.EIP=(UIntPtr)(disasmData+prev); - int len=Disasm(&disasm); - static char instruction[INSTRUCT_LENGTH]=""; - if(len!=UNKNOWN_OPCODE && disasm.Instruction.BranchType==CallType) //call - { - DISASM_INSTR instr; - memset(&instr, 0, sizeof(instr)); - disasmget((unsigned char*)disasm.EIP, previousInstr, &instr); - - char label[MAX_LABEL_SIZE]=""; - ADDRINFO addrinfo; - addrinfo.flags=flaglabel; - if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) - strcpy(label, addrinfo.label); - char module[MAX_MODULE_SIZE]=""; - modnamefromaddr(data, module, false); - char returnToAddr[MAX_COMMENT_SIZE]=""; - if(*module) - sprintf(returnToAddr, "%s.", module); - if(!*label) - sprintf(label, fhex, data); - strcat(returnToAddr, label); + disasm.VirtualAddr=previousInstr; + disasm.EIP=(UIntPtr)(disasmData+prev); + int len=Disasm(&disasm); + static char instruction[INSTRUCT_LENGTH]=""; + if(len!=UNKNOWN_OPCODE && disasm.Instruction.BranchType==CallType) //call + { + DISASM_INSTR instr; + memset(&instr, 0, sizeof(instr)); + disasmget((unsigned char*)disasm.EIP, previousInstr, &instr); - data=instr.arg[0].value; - *label=0; - addrinfo.flags=flaglabel; - if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) - strcpy(label, addrinfo.label); - *module=0; - modnamefromaddr(data, module, false); - char returnFromAddr[MAX_COMMENT_SIZE]=""; - if(*module) - sprintf(returnFromAddr, "%s.", module); - if(!*label) - sprintf(label, fhex, data); - strcat(returnFromAddr, label); + char label[MAX_LABEL_SIZE]=""; + ADDRINFO addrinfo; + addrinfo.flags=flaglabel; + if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) + strcpy(label, addrinfo.label); + char module[MAX_MODULE_SIZE]=""; + modnamefromaddr(data, module, false); + char returnToAddr[MAX_COMMENT_SIZE]=""; + if(*module) + sprintf(returnToAddr, "%s.", module); + if(!*label) + sprintf(label, fhex, data); + strcat(returnToAddr, label); - sprintf(comment->comment, "return to %s from %s", returnToAddr, returnFromAddr); - strcpy(comment->color, "#ff0000"); - return true; - } - else - { - char label[MAX_LABEL_SIZE]=""; - ADDRINFO addrinfo; - addrinfo.flags=flaglabel; - if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) - strcpy(label, addrinfo.label); - char module[MAX_MODULE_SIZE]=""; - modnamefromaddr(data, module, false); - char addrInfo[MAX_COMMENT_SIZE]=""; - if(*module) //module - { - if(*label) //+label - sprintf(comment->comment, "%s.%s", module, label); - else //module only - sprintf(comment->comment, "%s."fhex, module, data); - return true; - } - else if(*label) //label only - { - sprintf(comment->comment, "<%s>", label); - return true; - } - } + data=instr.arg[0].value; + *label=0; + addrinfo.flags=flaglabel; + if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) + strcpy(label, addrinfo.label); + *module=0; + modnamefromaddr(data, module, false); + char returnFromAddr[MAX_COMMENT_SIZE]=""; + if(*module) + sprintf(returnFromAddr, "%s.", module); + if(!*label) + sprintf(label, fhex, data); + strcat(returnFromAddr, label); + + sprintf(comment->comment, "return to %s from %s", returnToAddr, returnFromAddr); + strcpy(comment->color, "#ff0000"); + return true; } + + //string + STRING_TYPE strtype; + char string[512]=""; + if(disasmgetstringat(data, &strtype, string, string, 500)) + { + if(strtype==str_ascii) + sprintf(comment->comment, "\"%s\"", string); + else //unicode + sprintf(comment->comment, "L\"%s\"", string); + return true; + } + + //label + char label[MAX_LABEL_SIZE]=""; + ADDRINFO addrinfo; + addrinfo.flags=flaglabel; + if(_dbg_addrinfoget(data, SEG_DEFAULT, &addrinfo)) + strcpy(label, addrinfo.label); + char module[MAX_MODULE_SIZE]=""; + modnamefromaddr(data, module, false); + char addrInfo[MAX_COMMENT_SIZE]=""; + if(*module) //module + { + if(*label) //+label + sprintf(comment->comment, "%s.%s", module, label); + else //module only + sprintf(comment->comment, "%s."fhex, module, data); + return true; + } + else if(*label) //label only + { + sprintf(comment->comment, "<%s>", label); + return true; + } + return false; } \ No newline at end of file From 5b92f63e29d3fc2044d73f98cf931a799027b581 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 5 May 2014 18:16:56 +0200 Subject: [PATCH 024/676] DBG: fixed a bug with the reference functions --- x64_dbg_dbg/instruction.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index 22fc8b46..ca067cc4 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -791,12 +791,10 @@ CMDRESULT cbInstrRefFind(int argc, char* argv[]) uint addr=0; if(argc<3 or !valfromstring(argv[2], &addr)) addr=GetContextData(UE_CIP); - uint size; + uint size=0; if(argc>=4) - { if(!valfromstring(argv[3], &size)) size=0; - } uint ticks=GetTickCount(); int found=reffind(addr, size, cbRefFind, (void*)value, false); dprintf("%u references in %ums\n", found, GetTickCount()-ticks); @@ -858,12 +856,10 @@ CMDRESULT cbInstrRefStr(int argc, char* argv[]) uint addr; if(argc<2 or !valfromstring(argv[1], &addr, true)) addr=GetContextData(UE_CIP); - uint size; + uint size=0; if(argc>=3) - { if(!valfromstring(argv[2], &size, true)) size=0; - } uint ticks=GetTickCount(); int found=reffind(addr, size, cbRefStr, 0, false); dprintf("%u references in %ums\n", found, GetTickCount()-ticks); From b4374713fe6714a2107bb34a41081f7908fc5a2f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 5 May 2014 21:49:26 +0200 Subject: [PATCH 025/676] GUI: added stack 'follow in dump/stack/disassembler' context menu to the GUI --- x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 64 ++++++++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/CPUStack.h | 6 +++ 2 files changed, 70 insertions(+) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp index 9e6ed4f7..92af0299 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp @@ -52,6 +52,18 @@ void CPUStack::setupContextMenu() mGotoExpression->setShortcut(QKeySequence("ctrl+g")); this->addAction(mGotoExpression); connect(mGotoExpression, SIGNAL(triggered()), this, SLOT(gotoExpressionSlot())); + + mFollowDisasm = new QAction("&Follow in Disassembler", this); + mFollowDisasm->setShortcutContext(Qt::WidgetShortcut); + mFollowDisasm->setShortcut(QKeySequence("enter")); + this->addAction(mFollowDisasm); + connect(mFollowDisasm, SIGNAL(triggered()), this, SLOT(followDisasmSlot())); + + mFollowDump = new QAction("Follow in &Dump", this); + connect(mFollowDump, SIGNAL(triggered()), this, SLOT(followDumpSlot())); + + mFollowStack = new QAction("Follow in &Stack", this); + connect(mFollowStack, SIGNAL(triggered()), this, SLOT(followStackSlot())); } QString CPUStack::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h) @@ -124,10 +136,26 @@ void CPUStack::contextMenuEvent(QContextMenuEvent* event) { if(!DbgIsDebugging()) return; + QMenu* wMenu = new QMenu(this); //create context menu wMenu->addAction(mGotoSp); wMenu->addAction(mGotoBp); wMenu->addAction(mGotoExpression); + + int_t selectedVa = getInitialSelection() + mMemPage->getBase(); + uint_t selectedData; + if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t))) + if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer + { + uint_t stackBegin = mMemPage->getBase(); + uint_t stackEnd = stackBegin + mMemPage->getSize(); + if(selectedData >= stackBegin && selectedData < stackEnd) + wMenu->addAction(mFollowStack); + else + wMenu->addAction(mFollowDisasm); + wMenu->addAction(mFollowDump); + } + wMenu->exec(event->globalPos()); } @@ -193,3 +221,39 @@ void CPUStack::selectionSet(const SELECTIONDATA* selection) reloadData(); Bridge::getBridge()->BridgeSetResult(1); } + +void CPUStack::followDisasmSlot() +{ + int_t selectedVa = getInitialSelection() + mMemPage->getBase(); + uint_t selectedData; + if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t))) + if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer + { + QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("disasm " + addrText).toUtf8().constData()); + } +} + +void CPUStack::followDumpSlot() +{ + int_t selectedVa = getInitialSelection() + mMemPage->getBase(); + uint_t selectedData; + if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t))) + if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer + { + QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("dump " + addrText).toUtf8().constData()); + } +} + +void CPUStack::followStackSlot() +{ + int_t selectedVa = getInitialSelection() + mMemPage->getBase(); + uint_t selectedData; + if(DbgMemRead(selectedVa, (unsigned char*)&selectedData, sizeof(uint_t))) + if(DbgMemIsValidReadPtr(selectedData)) //data is a pointer + { + QString addrText=QString("%1").arg(selectedData, sizeof(int_t)*2, 16, QChar('0')).toUpper(); + DbgCmdExec(QString("sdump " + addrText).toUtf8().constData()); + } +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h index 6d2d0257..a6596d2a 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h @@ -27,6 +27,9 @@ public slots: void gotoExpressionSlot(); void selectionGet(SELECTIONDATA* selection); void selectionSet(const SELECTIONDATA* selection); + void followDisasmSlot(); + void followDumpSlot(); + void followStackSlot(); private: uint_t mCsp; @@ -34,6 +37,9 @@ private: QAction* mGotoSp; QAction* mGotoBp; QAction* mGotoExpression; + QAction* mFollowDisasm; + QAction* mFollowDump; + QAction* mFollowStack; }; #endif // CPUSTACK_H From 0972dfdcee5a91b32fe9cdf1d13011d037778dfe Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 7 May 2014 20:45:52 +0200 Subject: [PATCH 026/676] DBG: updated plugin SDK version, fixed issue #95 (I think) --- x64_dbg_bridge/bridgemain.h | 6 +++++- x64_dbg_dbg/_plugins.h | 6 +++++- x64_dbg_dbg/plugin_loader.cpp | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 48e75d47..e04cc5ac 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -3,6 +3,8 @@ #include +#pragma pack(push, 1) + #ifdef _WIN64 typedef unsigned long long duint; typedef signed long long dsint; @@ -26,7 +28,7 @@ extern "C" //Bridge defines #define MAX_SETTING_SIZE 65536 -#define DBG_VERSION 15 +#define DBG_VERSION 16 //Bridge functions BRIDGE_IMPEXP const char* BridgeInit(); @@ -607,4 +609,6 @@ BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection); } #endif +#pragma pack(pop) + #endif // _BRIDGEMAIN_H_ diff --git a/x64_dbg_dbg/_plugins.h b/x64_dbg_dbg/_plugins.h index 0afa18c7..37d0314a 100644 --- a/x64_dbg_dbg/_plugins.h +++ b/x64_dbg_dbg/_plugins.h @@ -11,8 +11,10 @@ #include "_plugin_types.h" +#pragma pack(push, 1) + //defines -#define PLUG_SDKVERSION 1 +#define PLUG_SDKVERSION 2 //structures struct PLUG_INITSTRUCT @@ -186,4 +188,6 @@ PLUG_IMPEXP bool _plugin_menuclear(int hMenu); } #endif +#pragma pack(pop) + #endif // _PLUGINS_H diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp index 497bf29a..eb9f0dcc 100644 --- a/x64_dbg_dbg/plugin_loader.cpp +++ b/x64_dbg_dbg/plugin_loader.cpp @@ -59,6 +59,12 @@ void pluginload(const char* pluginDir) FreeLibrary(pluginData.hPlugin); continue; } + else if(pluginData.initStruct.sdkVersion < PLUG_SDKVERSION) //the plugin SDK is not compatible + { + dprintf("[PLUGIN] %s is incompatible with this SDK version\n", pluginData.initStruct.pluginName); + FreeLibrary(pluginData.hPlugin); + continue; + } else dprintf("[PLUGIN] %s v%d Loaded!\n", pluginData.initStruct.pluginName, pluginData.initStruct.pluginVersion); //add plugin menu From 0bee4ed73a3ced592662a3f6257297733cccbd21 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 9 May 2014 02:04:55 +0200 Subject: [PATCH 027/676] PROJECT: updated debugging command (ctrl+f5 now runs the main executable, easier for testing) --- x64_dbg_bridge/x64_dbg_bridge.vcxproj.user | 10 ++++++++++ x64_dbg_dbg/x64_dbg_dbg.vcxproj.user | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user b/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user index 695b5c78..b72054fc 100644 --- a/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user +++ b/x64_dbg_bridge/x64_dbg_bridge.vcxproj.user @@ -1,3 +1,13 @@  + + $(OutDir)\x32_dbg.exe + WindowsLocalDebugger + $(OutDir) + + + $(OutDir)\x64_dbg.exe + WindowsLocalDebugger + $(OutDir) + \ No newline at end of file diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user index 695b5c78..b72054fc 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.user @@ -1,3 +1,13 @@  + + $(OutDir)\x32_dbg.exe + WindowsLocalDebugger + $(OutDir) + + + $(OutDir)\x64_dbg.exe + WindowsLocalDebugger + $(OutDir) + \ No newline at end of file From 70a91a06fc9c0d8b36b1ce393a4e1952d6d74e00 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 9 May 2014 13:43:12 +0200 Subject: [PATCH 028/676] DBG: added section names to the memory map DBG: fixed a bug with string escaping in cbOutputDebugString DBG: bring to front when paused --- x64_dbg_bridge/bridgemain.h | 2 +- x64_dbg_dbg/_exports.cpp | 133 ++++++++++++++++-- x64_dbg_dbg/_plugins.cpp | 1 + x64_dbg_dbg/debugger.cpp | 24 +++- .../Project/Src/BasicView/MemoryMapView.cpp | 24 +--- 5 files changed, 154 insertions(+), 30 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index e04cc5ac..d0163101 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -244,7 +244,7 @@ typedef void (*CBSYMBOLENUM)(SYMBOLINFO* symbol, void* user); struct MEMPAGE { MEMORY_BASIC_INFORMATION mbi; - char mod[MAX_MODULE_SIZE]; + char info[MAX_MODULE_SIZE]; }; struct MEMMAP diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index c5522288..1983ea7c 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -37,19 +37,27 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap) MEMORY_BASIC_INFORMATION mbi; DWORD numBytes; uint MyAddress=0, newAddress=0; - SymInitialize(fdProcessInfo->hProcess, 0, true); + uint curAllocationBase=0; + + bool bListAllPages = false; //TODO: settings for this + std::vector pageVector; do { numBytes=VirtualQueryEx(fdProcessInfo->hProcess, (LPCVOID)MyAddress, &mbi, sizeof(mbi)); if(mbi.State==MEM_COMMIT) { - MEMPAGE curPage; - *curPage.mod=0; - modnamefromaddr(MyAddress, curPage.mod, true); - memcpy(&curPage.mbi, &mbi, sizeof(mbi)); - pageVector.push_back(curPage); - memmap->count++; + if(bListAllPages || curAllocationBase!=(uint)mbi.AllocationBase) //only list allocation bases + { + curAllocationBase=(uint)mbi.AllocationBase; + MEMPAGE curPage; + *curPage.info=0; + modnamefromaddr(MyAddress, curPage.info, true); + memcpy(&curPage.mbi, &mbi, sizeof(mbi)); + pageVector.push_back(curPage); + } + else + pageVector.at(pageVector.size()-1).mbi.RegionSize+=mbi.RegionSize; } newAddress=(uint)mbi.BaseAddress+mbi.RegionSize; if(newAddress<=MyAddress) @@ -59,8 +67,117 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap) } while(numBytes); + int pagecount; + + //filter executable sections + if(bListAllPages) + { + pagecount=pageVector.size(); + char curMod[MAX_MODULE_SIZE]=""; + for(int i=pagecount-1,curIdx=0; i>-1; i--) + { + if(pageVector.at(i).info[0]) //there is a module + { + if(!scmp(curMod, pageVector.at(i).info)) //mod is not the current mod + { + strcpy(curMod, pageVector.at(i).info); + curIdx=i; + } + else //current mod + { + pageVector.at(curIdx).mbi.RegionSize+=pageVector.at(i).mbi.RegionSize; + pageVector.erase(pageVector.begin()+i); + curIdx--; //the index changes when you remove an entry + } + } + } + } + + //process file sections + pagecount=pageVector.size(); + char curMod[MAX_MODULE_SIZE]=""; + for(int i=pagecount-1; i>-1; i--) + { + if(pageVector.at(i).info[0]) //there is a module + { + if(!scmp(curMod, pageVector.at(i).info)) //mod is not the current mod + { + strcpy(curMod, pageVector.at(i).info); + HMODULE hMod=(HMODULE)modbasefromname(curMod); + if(!hMod) + continue; + char curModPath[MAX_PATH]=""; + if(!GetModuleFileNameExA(fdProcessInfo->hProcess, hMod, curModPath, MAX_PATH)) + continue; + int SectionNumber=GetPE32Data(curModPath, 0, UE_SECTIONNUMBER); + MEMPAGE newPage; + pageVector.erase(pageVector.begin()+i); //remove the SizeOfImage page + for(int j=SectionNumber-1; j>-1; j--) + { + memset(&newPage, 0, sizeof(MEMPAGE)); + VirtualQueryEx(fdProcessInfo->hProcess, (LPCVOID)((uint)hMod+GetPE32Data(curModPath, j, UE_SECTIONVIRTUALOFFSET)), &newPage.mbi, sizeof(MEMORY_BASIC_INFORMATION)); + uint SectionSize=GetPE32Data(curModPath, j, UE_SECTIONVIRTUALSIZE); + if(SectionSize%PAGE_SIZE) //unaligned page size + SectionSize+=PAGE_SIZE-(SectionSize%PAGE_SIZE); //fix this + if(SectionSize) + newPage.mbi.RegionSize=SectionSize; + const char* SectionName=(const char*)GetPE32Data(curModPath, j, UE_SECTIONNAME); + if(!SectionName) + SectionName=""; + int len=strlen(SectionName); + int escape_count=0; + for(int i=0; ihProcess, (LPCVOID)hMod, &newPage.mbi, sizeof(MEMORY_BASIC_INFORMATION)); + strcpy(newPage.info, curMod); + pageVector.insert(pageVector.begin()+i, newPage); + } + } + } + //process vector - int pagecount=memmap->count; + memmap->count=pagecount=pageVector.size(); memmap->page=(MEMPAGE*)BridgeAlloc(sizeof(MEMPAGE)*pagecount); memset(memmap->page, 0, sizeof(MEMPAGE)*pagecount); for(int i=0; inDebugStringLength+escape_count+1, "cbOutputDebugString:DebugTextEscaped"); - memset(DebugTextEscaped, 0, DebugString->nDebugStringLength+escape_count+1); + char* DebugTextEscaped=(char*)emalloc(len+escape_count+1, "cbOutputDebugString:DebugTextEscaped"); + memset(DebugTextEscaped, 0, len+escape_count+1); for(int i=0,j=0; i Date: Fri, 9 May 2014 21:51:56 +0200 Subject: [PATCH 029/676] DBG: fixed a bug with the '=' sign (non-existent variables were seen as invalid) --- x64_dbg_dbg/command.cpp | 2 +- x64_dbg_dbg/plugin_loader.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/x64_dbg_dbg/command.cpp b/x64_dbg_dbg/command.cpp index 6af81812..6c4f43fe 100644 --- a/x64_dbg_dbg/command.cpp +++ b/x64_dbg_dbg/command.cpp @@ -242,7 +242,7 @@ static void specialformat(char* string) } else { - if(isvalidexpression(string) && isvalidexpression(found)) + if(isvalidexpression(found)) sprintf(str, "mov %s,%s", string, found); else strcpy(str, backup); diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp index eb9f0dcc..d9974921 100644 --- a/x64_dbg_dbg/plugin_loader.cpp +++ b/x64_dbg_dbg/plugin_loader.cpp @@ -175,6 +175,7 @@ bool plugincmdregister(int pluginHandle, const char* command, CBPLUGINCOMMAND cb if(!cmdnew(dbggetcommandlist(), command, (CBCOMMAND)cbCommand, debugonly)) return false; pluginCommandList.push_back(plugCmd); + dprintf("[PLUGIN] command \"%s\" registered!\n", command); return true; } @@ -190,6 +191,7 @@ bool plugincmdunregister(int pluginHandle, const char* command) if(!cmddel(dbggetcommandlist(), command)) return false; pluginCommandList.erase(pluginCommandList.begin()+i); + dprintf("[PLUGIN] command \"%s\" unregistered!\n", command); return true; } } From c6826ca65af4f74acde37f406c42c067a62a6aeb Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 10 May 2014 01:23:22 +0200 Subject: [PATCH 030/676] fixed issue #100 (ntdll redefinition problems) --- x64_dbg_bridge/bridgemain.h | 90 +++++++++---------- x64_dbg_dbg/thread.cpp | 2 +- .../Project/Src/BasicView/ThreadView.cpp | 88 +++++++++--------- 3 files changed, 90 insertions(+), 90 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index d0163101..295e9e5f 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -175,55 +175,55 @@ enum STRING_TYPE enum THREADPRIORITY { - PriorityIdle = -15, - PriorityAboveNormal = 1, - PriorityBelowNormal = -1, - PriorityHighest = 2, - PriorityLowest = -2, - PriorityNormal = 0, - PriorityTimeCritical = 15, - PriorityUnknown = 0x7FFFFFFF + _PriorityIdle = -15, + _PriorityAboveNormal = 1, + _PriorityBelowNormal = -1, + _PriorityHighest = 2, + _PriorityLowest = -2, + _PriorityNormal = 0, + _PriorityTimeCritical = 15, + _PriorityUnknown = 0x7FFFFFFF }; enum THREADWAITREASON { - Executive = 0, - FreePage = 1, - PageIn = 2, - PoolAllocation = 3, - DelayExecution = 4, - Suspended = 5, - UserRequest = 6, - WrExecutive = 7, - WrFreePage = 8, - WrPageIn = 9, - WrPoolAllocation = 10, - WrDelayExecution = 11, - WrSuspended = 12, - WrUserRequest = 13, - WrEventPair = 14, - WrQueue = 15, - WrLpcReceive = 16, - WrLpcReply = 17, - WrVirtualMemory = 18, - WrPageOut = 19, - WrRendezvous = 20, - Spare2 = 21, - Spare3 = 22, - Spare4 = 23, - Spare5 = 24, - WrCalloutStack = 25, - WrKernel = 26, - WrResource = 27, - WrPushLock = 28, - WrMutex = 29, - WrQuantumEnd = 30, - WrDispatchInt = 31, - WrPreempted = 32, - WrYieldExecution = 33, - WrFastMutex = 34, - WrGuardedMutex = 35, - WrRundown = 36, + _Executive = 0, + _FreePage = 1, + _PageIn = 2, + _PoolAllocation = 3, + _DelayExecution = 4, + _Suspended = 5, + _UserRequest = 6, + _WrExecutive = 7, + _WrFreePage = 8, + _WrPageIn = 9, + _WrPoolAllocation = 10, + _WrDelayExecution = 11, + _WrSuspended = 12, + _WrUserRequest = 13, + _WrEventPair = 14, + _WrQueue = 15, + _WrLpcReceive = 16, + _WrLpcReply = 17, + _WrVirtualMemory = 18, + _WrPageOut = 19, + _WrRendezvous = 20, + _Spare2 = 21, + _Spare3 = 22, + _Spare4 = 23, + _Spare5 = 24, + _WrCalloutStack = 25, + _WrKernel = 26, + _WrResource = 27, + _WrPushLock = 28, + _WrMutex = 29, + _WrQuantumEnd = 30, + _WrDispatchInt = 31, + _WrPreempted = 32, + _WrYieldExecution = 33, + _WrFastMutex = 34, + _WrGuardedMutex = 35, + _WrRundown = 36, }; enum MEMORY_SIZE diff --git a/x64_dbg_dbg/thread.cpp b/x64_dbg_dbg/thread.cpp index c256821d..dbc6e2ba 100644 --- a/x64_dbg_dbg/thread.cpp +++ b/x64_dbg_dbg/thread.cpp @@ -40,7 +40,7 @@ void threadclear() static THREADWAITREASON GetThreadWaitReason(DWORD dwThreadId) { - return Executive; + return _Executive; } static DWORD GetThreadLastError(uint tebAddress) diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp index 540607d8..5aa2b421 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp @@ -41,25 +41,25 @@ void ThreadView::updateThreadList() QString priorityString; switch(threadList.list[i].Priority) { - case PriorityIdle: + case _PriorityIdle: priorityString="Idle"; break; - case PriorityAboveNormal: + case _PriorityAboveNormal: priorityString="AboveNormal"; break; - case PriorityBelowNormal: + case _PriorityBelowNormal: priorityString="BelowNormal"; break; - case PriorityHighest: + case _PriorityHighest: priorityString="Highest"; break; - case PriorityLowest: + case _PriorityLowest: priorityString="Lowest"; break; - case PriorityNormal: + case _PriorityNormal: priorityString="Normal"; break; - case PriorityTimeCritical: + case _PriorityTimeCritical: priorityString="TimeCritical"; break; default: @@ -70,115 +70,115 @@ void ThreadView::updateThreadList() QString waitReasonString; switch(threadList.list[i].WaitReason) { - case Executive: + case _Executive: waitReasonString="Executive"; break; - case FreePage: + case _FreePage: waitReasonString="FreePage"; break; - case PageIn: + case _PageIn: waitReasonString="PageIn"; break; - case PoolAllocation: + case _PoolAllocation: waitReasonString="PoolAllocation"; break; - case DelayExecution: + case _DelayExecution: waitReasonString="DelayExecution"; break; - case Suspended: + case _Suspended: waitReasonString="Suspended"; break; - case UserRequest: + case _UserRequest: waitReasonString="UserRequest"; break; - case WrExecutive: + case _WrExecutive: waitReasonString="WrExecutive"; break; - case WrFreePage: + case _WrFreePage: waitReasonString="WrFreePage"; break; - case WrPageIn: + case _WrPageIn: waitReasonString="WrPageIn"; break; - case WrPoolAllocation: + case _WrPoolAllocation: waitReasonString="WrPoolAllocation"; break; - case WrDelayExecution: + case _WrDelayExecution: waitReasonString="WrDelayExecution"; break; - case WrSuspended: + case _WrSuspended: waitReasonString="WrSuspended"; break; - case WrUserRequest: + case _WrUserRequest: waitReasonString="WrUserRequest"; break; - case WrEventPair: + case _WrEventPair: waitReasonString="WrEventPair"; break; - case WrQueue: + case _WrQueue: waitReasonString="WrQueue"; break; - case WrLpcReceive: + case _WrLpcReceive: waitReasonString="WrLpcReceive"; break; - case WrLpcReply: + case _WrLpcReply: waitReasonString="WrLpcReply"; break; - case WrVirtualMemory: + case _WrVirtualMemory: waitReasonString="WrVirtualMemory"; break; - case WrPageOut: + case _WrPageOut: waitReasonString="WrPageOut"; break; - case WrRendezvous: + case _WrRendezvous: waitReasonString="WrRendezvous"; break; - case Spare2: + case _Spare2: waitReasonString="Spare2"; break; - case Spare3: + case _Spare3: waitReasonString="Spare3"; break; - case Spare4: + case _Spare4: waitReasonString="Spare4"; break; - case Spare5: + case _Spare5: waitReasonString="Spare5"; break; - case WrCalloutStack: + case _WrCalloutStack: waitReasonString="WrCalloutStack"; break; - case WrKernel: + case _WrKernel: waitReasonString="WrKernel"; break; - case WrResource: + case _WrResource: waitReasonString="WrResource"; break; - case WrPushLock: + case _WrPushLock: waitReasonString="WrPushLock"; break; - case WrMutex: + case _WrMutex: waitReasonString="WrMutex"; break; - case WrQuantumEnd: + case _WrQuantumEnd: waitReasonString="WrQuantumEnd"; break; - case WrDispatchInt: + case _WrDispatchInt: waitReasonString="WrDispatchInt"; break; - case WrPreempted: + case _WrPreempted: waitReasonString="WrPreempted"; break; - case WrYieldExecution: + case _WrYieldExecution: waitReasonString="WrYieldExecution"; break; - case WrFastMutex: + case _WrFastMutex: waitReasonString="WrFastMutex"; break; - case WrGuardedMutex: + case _WrGuardedMutex: waitReasonString="WrGuardedMutex"; break; - case WrRundown: + case _WrRundown: waitReasonString="WrRundown"; break; default: From 7bf164d8a5cd4d6a903a750826ea17b3d00223f5 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 10 May 2014 03:47:03 +0200 Subject: [PATCH 031/676] BRIDGE: added GuiGetLineWindow GUI: added GuiGetLineWindow --- x64_dbg_bridge/bridgemain.cpp | 5 +++++ x64_dbg_bridge/bridgemain.h | 6 +++++- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 25 ++++++++++++++++++++++ x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 ++ x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 12 +++++++++++ x64_dbg_gui/Project/Src/Gui/MainWindow.h | 1 + 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index cd0b18cd..643e19ae 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -824,6 +824,11 @@ BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection) return (bool)(duint)_gui_sendmessage(GUI_SELECTION_SET, (void*)(duint)hWindow, (void*)selection); } +BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text) +{ + return (bool)(duint)_gui_sendmessage(GUI_GETLINE_WINDOW, (void*)title, text); +} + //Main BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 295e9e5f..86c1c991 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -495,6 +495,8 @@ BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry); #define GUI_DUMP 1 #define GUI_STACK 2 +#define GUI_MAX_LINE_SIZE 65536 + //Gui enums enum GUIMSG { @@ -541,7 +543,8 @@ enum GUIMSG GUI_MENU_ADD_SEPARATOR, // param1=int hMenu, param2=unused GUI_MENU_CLEAR, // param1=int hMenu, param2=unused GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection - GUI_SELECTION_SET // param1=int hWindow, param2=const SELECTIONDATA* selection + GUI_SELECTION_SET, // param1=int hWindow, param2=const SELECTIONDATA* selection + GUI_GETLINE_WINDOW // param1=const char* title, param2=char* text }; //GUI structures @@ -604,6 +607,7 @@ BRIDGE_IMPEXP void GuiMenuAddSeparator(int hMenu); BRIDGE_IMPEXP void GuiMenuClear(int hMenu); BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection); BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection); +BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text); #ifdef __cplusplus } diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 31342c7b..751e3daf 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -310,6 +310,17 @@ bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection) return bridgeResult; } +bool Bridge::emitGetStrWindow(const QString title, QString* text) +{ + mBridgeMutex.lock(); + hasBridgeResult=false; + emit getStrWindow(title, text); + while(!hasBridgeResult) //wait for thread completion + Sleep(100); + mBridgeMutex.unlock(); + return bridgeResult; +} + /************************************************************************************ Static Functions ************************************************************************************/ @@ -615,6 +626,20 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa } break; + case GUI_GETLINE_WINDOW: + { + QString text = ""; + if(Bridge::getBridge()->emitGetStrWindow(QString(reinterpret_cast(param1)), &text)) + { + if(text.length()>=GUI_MAX_LINE_SIZE) + text.chop(text.length()-GUI_MAX_LINE_SIZE); + strcpy((char*)param2, text.toUtf8().constData()); + return (void*)(uint_t)true; + } + return (void*)(uint_t)false; //cancel/escape + } + break; + default: { } diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h index 9e317d9a..4df8b0bd 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h @@ -69,6 +69,7 @@ public: void emitMenuClearMenu(int hMenu); bool emitSelectionGet(int hWindow, SELECTIONDATA* selection); bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection); + bool emitGetStrWindow(const QString title, QString* text); //Public variables void* winId; @@ -120,6 +121,7 @@ signals: void selectionDumpSet(const SELECTIONDATA* selection); void selectionStackGet(SELECTIONDATA* selection); void selectionStackSet(const SELECTIONDATA* selection); + void getStrWindow(const QString title, QString* text); private: QMutex mBridgeMutex; diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index efc7662d..fcd102ff 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -137,6 +137,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(Bridge::getBridge(), SIGNAL(menuAddSeparator(int)), this, SLOT(addSeparator(int))); connect(Bridge::getBridge(), SIGNAL(menuClearMenu(int)), this, SLOT(clearMenu(int))); connect(mCpuWidget->mDisas, SIGNAL(displayReferencesWidget()), this, SLOT(displayReferencesWidget())); + connect(Bridge::getBridge(), SIGNAL(getStrWindow(QString,QString*)), this, SLOT(getStrWindow(QString,QString*))); //Set default setttings (when not set) SettingsDialog defaultSettings; @@ -679,3 +680,14 @@ void MainWindow::runSelection() if(DbgCmdExecDirect(command.toUtf8().constData())) DbgCmdExecDirect("run"); } + +void MainWindow::getStrWindow(const QString title, QString *text) +{ + LineEditDialog mLineEdit(this); + mLineEdit.setWindowTitle(title); + bool bResult = true; + if(mLineEdit.exec()!=QDialog::Accepted) + bResult = false; + *text=mLineEdit.editText; + Bridge::getBridge()->BridgeSetResult(bResult); +} diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 48b3ef27..d2deb04a 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -68,6 +68,7 @@ public slots: void clearMenu(int hMenu); void menuEntrySlot(); void runSelection(); + void getStrWindow(const QString title, QString* text); private: Ui::MainWindow *ui; From faf53de72abbc90d32a8232cc81b5b798b9ce84b Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 10 May 2014 15:10:02 +0200 Subject: [PATCH 032/676] DBG: downgraded plugin SDK version again (1 byte alignment not needed), now FORCE default alignment --- x64_dbg_bridge/bridgemain.h | 7 ++++++- x64_dbg_dbg/_plugins.h | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 86c1c991..3aab7c91 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -3,7 +3,12 @@ #include -#pragma pack(push, 1) +//default structure alignments forced +#ifdef _WIN64 +#pragma pack(push, 16) +#else //x86 +#pragma pack(push, 8) +#endif //_WIN64 #ifdef _WIN64 typedef unsigned long long duint; diff --git a/x64_dbg_dbg/_plugins.h b/x64_dbg_dbg/_plugins.h index 37d0314a..ecb25136 100644 --- a/x64_dbg_dbg/_plugins.h +++ b/x64_dbg_dbg/_plugins.h @@ -11,10 +11,15 @@ #include "_plugin_types.h" -#pragma pack(push, 1) +//default structure alignments forced +#ifdef _WIN64 +#pragma pack(push, 16) +#else //x86 +#pragma pack(push, 8) +#endif //_WIN64 //defines -#define PLUG_SDKVERSION 2 +#define PLUG_SDKVERSION 1 //structures struct PLUG_INITSTRUCT From 43744a6ef95608a03f50eb2507164ea49750c5cd Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 13 May 2014 21:35:17 +0200 Subject: [PATCH 033/676] DBG: updated TitanEngine --- x64_dbg_dbg/TitanEngine/TitanEngine_x64.a | Bin 325702 -> 325702 bytes x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib | Bin 99680 -> 99680 bytes x64_dbg_dbg/TitanEngine/TitanEngine_x86.a | Bin 324844 -> 324844 bytes x64_dbg_dbg/TitanEngine/TitanEngine_x86.lib | Bin 103416 -> 103416 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x64.a b/x64_dbg_dbg/TitanEngine/TitanEngine_x64.a index cff1fce52128ecb87eec0ba241d2e7c0938ced34..87249cc8d157cf2326e1496f646ded9812912d0a 100644 GIT binary patch delta 16147 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 delta 16147 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 diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib b/x64_dbg_dbg/TitanEngine/TitanEngine_x64.lib index 6e6fe41332da40ea020bbdfd012a151c0097558e..c9fdf36fe24c7c075c19b5052a70e01eeeed9e7a 100644 GIT binary patch delta 10577 zcmaJ{dsLNG7Wd=>Q30+N*^-v?f)zGru z9%g9P$YwX+p|^)4?R1lymQaIyu&l2~;r5y|WL*EAo6+YTq8Z^8@1U?{_%0D2jx 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 Uz>u2#2XEABM#VS|-Y63O2gLga^8f$< delta 10577 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 V1{hK^|KN>U$*35|fg45K{{XvS&KCdx diff --git a/x64_dbg_dbg/TitanEngine/TitanEngine_x86.a b/x64_dbg_dbg/TitanEngine/TitanEngine_x86.a index d20ee4587ce1baf3c557dd252e37b215eeb5b5e7..f1038babe54c50407b3cc5fa216aea84c11e75e2 100644 GIT binary patch delta 15715 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 delta 10750 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 From c4109393eb980d785082b392ea01bb4bcfac11a0 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 13 May 2014 22:38:08 +0200 Subject: [PATCH 034/676] PROJECT: updated readme --- readme.txt | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/readme.txt b/readme.txt index a02ba8d7..cae3be4f 100644 --- a/readme.txt +++ b/readme.txt @@ -1,13 +1,8 @@ [This is a new version of this repository. The old version can be found ] [here: https://bitbucket.org/mrexodia/x64_dbg_old ] ->Installation guide: -1) Download the latest 'qt_base_XXX.rar' -2) Download the latest 'bin_base_XXX.rar' -3) Download the latest 'release_xxx.rar' -4) (Optional) Download the latest 'help_XXX.rar' -5) Extract all in the same directory -6) Run 'bin\x64\x64_dbg.exe' or 'bin\x32\x32_dbg.exe' +>Downloads: +These can be found at https://sf.net/projects/x64dbg/ >Overview: This is a x64/x32 debugger that is currently in active development. From 6ebea665dc51741824bc29af42273db1d55c2ed8 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 15 May 2014 01:01:50 +0200 Subject: [PATCH 035/676] PROJECT: updated help (thanks Artic for the idea!) --- help/Plugins.htm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/help/Plugins.htm b/help/Plugins.htm index 652777a9..0f15062b 100644 --- a/help/Plugins.htm +++ b/help/Plugins.htm @@ -16,5 +16,7 @@ html,body {

Plugins
This section describes -various plugin functions for x64_dbg.

- \ No newline at end of file +various plugin functions for x64_dbg.

+

You can install plugins by copying the *.dp32 (x32 +plugins) or *.dp64 (x64 +plugins) to the 'plugins' directory.

From 72b16cf089654b56532c6a29ed4cf100c3d0c6e6 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 15 May 2014 01:18:43 +0200 Subject: [PATCH 036/676] PROJECT: added VERSIONINFO, resolved issue #106 --- x64_dbg_bridge/bridgemain.h | 2 +- x64_dbg_exe/resource.rc | 43 +++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 3aab7c91..83a0dd0b 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -33,7 +33,7 @@ extern "C" //Bridge defines #define MAX_SETTING_SIZE 65536 -#define DBG_VERSION 16 +#define DBG_VERSION 17 //Bridge functions BRIDGE_IMPEXP const char* BridgeInit(); diff --git a/x64_dbg_exe/resource.rc b/x64_dbg_exe/resource.rc index 1ee25103..229e75ba 100644 --- a/x64_dbg_exe/resource.rc +++ b/x64_dbg_exe/resource.rc @@ -1,5 +1,5 @@ -// Generated by ResEdit 1.5.11 -// Copyright (C) 2006-2012 +// Generated by ResEdit 1.6.2 +// Copyright (C) 2006-2014 // http://www.resedit.net #include @@ -18,6 +18,45 @@ IDI_ICON1 ICON "..\\bug.ico" +// +// Version Information resources +// +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +1 VERSIONINFO + FILEVERSION 0,0,1,7 + PRODUCTVERSION 0,0,1,7 + FILEOS VOS_UNKNOWN + FILETYPE VFT_UNKNOWN + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0x00000000 + FILEFLAGS 0x00000000 +{ + BLOCK "StringFileInfo" + { + BLOCK "0400047B" + { + VALUE "Comments", "" + VALUE "CompanyName", "" + VALUE "FileDescription", "x64_dbg" + VALUE "FileVersion", "" + VALUE "InternalName", "" + VALUE "LegalCopyright", "x64_dbg.com" + VALUE "LegalTrademarks", "" + VALUE "OriginalFilename", "" + VALUE "PrivateBuild", "" + VALUE "ProductName", "x64_dbg" + VALUE "ProductVersion", "V1.7ALPHA" + VALUE "SpecialBuild", "" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0400, 0x047B + } +} + + + // // Manifest resources // From 303723bcb562750164681b851f37854fbe944c00 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 15 May 2014 02:05:34 +0200 Subject: [PATCH 037/676] GUI: deleted custom tab widgets --- x64_dbg_gui/Project/Src/Gui/TabBar.h | 43 ----- x64_dbg_gui/Project/Src/Gui/tabbar.cpp | 149 ------------------ x64_dbg_gui/Project/Src/Gui/tabwidget.cpp | 182 ---------------------- x64_dbg_gui/Project/Src/Gui/tabwidget.h | 77 --------- 4 files changed, 451 deletions(-) delete mode 100644 x64_dbg_gui/Project/Src/Gui/TabBar.h delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabbar.cpp delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.cpp delete mode 100644 x64_dbg_gui/Project/Src/Gui/tabwidget.h diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h deleted file mode 100644 index 744c2e7e..00000000 --- a/x64_dbg_gui/Project/Src/Gui/TabBar.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __MHTABBAR_H__ -#define __MHTABBAR_H__ - -// Qt includes -#include - -// Qt forward class definitions -class MHTabBar; -class QMainWindow; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHTabBar implements the a Tab Bar with tear-off functionality. -////////////////////////////////////////////////////////////////////////////// -class MHTabBar: public QTabBar -{ - Q_OBJECT -public: - MHTabBar (QWidget* parent); - ~MHTabBar (void); - -protected: - void mousePressEvent(QMouseEvent* event); - void mouseMoveEvent(QMouseEvent* event); - void dragEnterEvent(QDragEnterEvent* event); - void dragMoveEvent(QDragMoveEvent* event); - void dropEvent(QDropEvent* event); - -signals: - // Detach Tab - void OnDetachTab (int index, QPoint& dropPoint); - // Move Tab - void OnMoveTab (int fromIndex, int toIndex); - -private: - QPoint m_dragStartPos; - QPoint m_dragMovedPos; - QPoint m_dragDroppedPos; - bool m_dragInitiated; - int m_dragCurrentIndex; -}; - -#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp b/x64_dbg_gui/Project/Src/Gui/tabbar.cpp deleted file mode 100644 index 209b9917..00000000 --- a/x64_dbg_gui/Project/Src/Gui/tabbar.cpp +++ /dev/null @@ -1,149 +0,0 @@ -// Qt includes -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tabbar.h" -#include "tabwidget.h" - -////////////////////////////////////////////////////////////// -// Default Constructor -////////////////////////////////////////////////////////////// -MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) -{ - setAcceptDrops(true); - setElideMode(Qt::ElideRight); - setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); - setMovable(true); -} - -////////////////////////////////////////////////////////////// -// Default Destructor -////////////////////////////////////////////////////////////// -MHTabBar::~MHTabBar(void) -{ -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::mousePressEvent(QMouseEvent* event) -{ - if (event->button() == Qt::LeftButton) - m_dragStartPos = event->pos(); - - m_dragDroppedPos.setX(0); - m_dragDroppedPos.setY(0); - m_dragMovedPos.setX(0); - m_dragMovedPos.setY(0); - - m_dragInitiated = false; - - QTabBar::mousePressEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::mouseMoveEvent(QMouseEvent* event) -{ - // Distinguish a drag - if ( !m_dragStartPos.isNull() && - ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) - { - m_dragInitiated = true; - } - - // The left button is pressed - // And the move could also be a drag - // And the mouse moved outside the tab bar - if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) - { - // Stop the move to be able to convert to a drag - { - QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - QTabBar::mouseMoveEvent(&finishMoveEvent); - } - - // A crude way to distinguish tab-reordering drops from other ones - QMimeData* mimeData = new QMimeData; - mimeData->setData("action", "application/tab-detach"); - - // Initiate Drag - QDrag* drag = new QDrag(this); - drag->setMimeData(mimeData); - - // Create transparent screen dump - QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); - QPixmap targetPixmap(pixmap.size()); - - QPainter painter(&targetPixmap); - painter.setOpacity(0.5); - painter.drawPixmap(0, 0, pixmap); - painter.end(); - - drag->setPixmap(targetPixmap); - - // Handle Detach and Move - Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); - - if (dragged == Qt::IgnoreAction) - { - event->accept(); - OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); - } - else if (dragged == Qt::MoveAction) - { - if (!m_dragDroppedPos.isNull()) - { - event->accept(); - OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); - } - } - - delete drag; - } - else - { - QTabBar::mouseMoveEvent(event); - } -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dragEnterEvent(QDragEnterEvent* event) -{ - // Only accept if it's an tab-reordering request (not a detach request) - const QMimeData* m = event->mimeData(); - - if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) - { - event->acceptProposedAction(); - } - - QTabBar::dragEnterEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dragMoveEvent(QDragMoveEvent* event) -{ - // Only accept if it's an tab-reordering request (not a detach request) - const QMimeData* m = event->mimeData(); - - if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) - { - m_dragMovedPos = event->pos(); - event->acceptProposedAction(); - } - - QTabBar::dragMoveEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dropEvent(QDropEvent* event) -{ - // If a dragged Event is dropped within this widget it is not a drag but a move. - m_dragDroppedPos = event->pos(); - - QTabBar::dropEvent(event); -} diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp b/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp deleted file mode 100644 index 3e58dfbd..00000000 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Qt includes -#include "tabbar.h" -#include "tabwidget.h" - -////////////////////////////////////////////////////////////// -// Default Constructor -////////////////////////////////////////////////////////////// -MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) -{ - m_tabBar = new MHTabBar(this); - connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - - setTabBar(m_tabBar); - setMovable(true); - - m_Windows.clear(); -} - -QTabBar* MHTabWidget::tabBar() -{ - return m_tabBar; -} - -////////////////////////////////////////////////////////////// -// Default Destructor -////////////////////////////////////////////////////////////// -MHTabWidget::~MHTabWidget(void) -{ - disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - delete m_tabBar; -} - -int MHTabWidget::count() const -{ - return QTabWidget::count() + m_Windows.size(); -} - -QWidget *MHTabWidget::widget(int index) const -{ - int baseCount = QTabWidget::count(); - - // Check if it's just a normal tab - if (index < baseCount) - return QTabWidget::widget(index); - - // Otherwise it's going to be a window - return m_Windows.at(index - baseCount); -} - -void MHTabWidget::setCurrentIndex(int index) -{ - // Check if it's just a normal tab - if (index < QTabWidget::count()) - { - QTabWidget::setCurrentIndex(index); - } - else - { - // Otherwise it's going to be a window (just bring it up) - MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); - window->activateWindow(); - } -} - -void MHTabWidget::setCurrentWidget(QWidget *widget) -{ - widget = 0; - // To be implemented. -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::MoveTab(int fromIndex, int toIndex) -{ - removeTab(fromIndex); - insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); - setCurrentIndex(toIndex); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::DetachTab(int index, QPoint& dropPoint) -{ - // Create the window - MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); - detachedWidget->setWindowModality(Qt::NonModal); - - // Find Widget and connect - connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - - detachedWidget->setWindowTitle(tabText(index)); - detachedWidget->setWindowIcon(tabIcon(index)); - - // Remove from tab bar - QWidget* tearOffWidget = widget(index); - tearOffWidget->setParent(detachedWidget); - - // Add it to the windows list - m_Windows.append(tearOffWidget); - - // Make first active - if (count() > 0) - setCurrentIndex(0); - - // Create and show - detachedWidget->setCentralWidget(tearOffWidget); - - // Needs to be done explicitly - tearOffWidget->show(); - detachedWidget->setGeometry(dropPoint.x(), dropPoint.y(), 640, 480); - detachedWidget->show(); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::AttachTab(QWidget *parent) -{ - // Retrieve widget - MHDetachedWindow* detachedWidget = dynamic_cast(parent); - QWidget* tearOffWidget = detachedWidget->centralWidget(); - - // Reattach the tab - int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); - - // Remove it from the windows list - for(int i = 0; i < m_Windows.size(); i++) - { - if (m_Windows.at(i) == tearOffWidget) - m_Windows.removeAt(i); - } - - // Make Active - if (newIndex != -1) - setCurrentIndex(newIndex); - - // Cleanup Window - disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - detachedWidget->hide(); - detachedWidget->close(); -} - -//---------------------------------------------------------------------------- - -////////////////////////////////////////////////////////////////////////////// -MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent) -{ - m_TabWidget = tabwidget; -} - -////////////////////////////////////////////////////////////////////////////// -MHDetachedWindow::~MHDetachedWindow(void) -{ -} - -////////////////////////////////////////////////////////////////////////////// -void MHDetachedWindow::moveEvent(QMoveEvent *event) -{ - QRect rect = m_TabWidget->geometry(); - QSize hint = m_TabWidget->tabBar()->sizeHint(); - - // Height of the actual top tab bar - rect.setBottom(rect.top() + hint.height()); - QPoint pos1(rect.x(), rect.y()); - pos1=m_TabWidget->mapToGlobal(pos1); - rect.setX(pos1.x()); - rect.setY(pos1.y()); - - if (rect.contains(event->pos())) - { - m_TabWidget->AttachTab(this); - event->accept(); - } - else - { - QMainWindow::moveEvent(event); - } -} - -////////////////////////////////////////////////////////////////////////////// -void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) -{ - emit OnClose(this); -} diff --git a/x64_dbg_gui/Project/Src/Gui/tabwidget.h b/x64_dbg_gui/Project/Src/Gui/tabwidget.h deleted file mode 100644 index 183a5936..00000000 --- a/x64_dbg_gui/Project/Src/Gui/tabwidget.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __MHTABWIDGET_H__ -#define __MHTABWIDGET_H__ - -// Qt includes -#include -#include -#include -#include - -// Qt forward class definitions -class MHTabBar; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHTabWidget implements the a Tab Widget with detach and attach -// functionality. -////////////////////////////////////////////////////////////////////////////// -class MHTabWidget: public QTabWidget -{ - Q_OBJECT - -public: - MHTabWidget(QWidget *parent); - virtual ~MHTabWidget(void); - QTabBar* tabBar(); - -public slots: - int count() const; - QWidget *widget(int index) const; - - // Move Tab - void MoveTab(int fromIndex, int toIndex); - - // Detach Tab - void DetachTab(int index, QPoint&); - - // Attach Tab - void AttachTab(QWidget *parent); - -public Q_SLOTS: - void setCurrentIndex(int index); - void setCurrentWidget(QWidget *widget); - -protected: - -private: - MHTabBar* m_tabBar; - - QList m_Windows; -}; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHDetachedWindow implements the WindowContainer for the Detached Widget -// -// Conditions: -// Header : MHTabWidget.h -////////////////////////////////////////////////////////////////////////////// -class MHDetachedWindow : public QMainWindow -{ - Q_OBJECT -public: - MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0); - ~MHDetachedWindow(void); - -protected: - MHTabWidget *m_TabWidget; - - virtual void moveEvent(QMoveEvent *event); - void closeEvent(QCloseEvent *event); - -signals: - void OnClose(QWidget* widget); -}; - -#endif // __MHTABWIDGET_H__ - From 9f6385a0eb095356a2aef418c5ca2d88ca38277e Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 15 May 2014 02:06:02 +0200 Subject: [PATCH 038/676] GUI: now detaching only works with a context menu --- x64_dbg_gui/Project/Src/TabBar.cpp | 163 ++++++++++++++++++++++ x64_dbg_gui/Project/Src/TabBar.h | 50 +++++++ x64_dbg_gui/Project/Src/TabWidget.cpp | 190 ++++++++++++++++++++++++++ x64_dbg_gui/Project/Src/TabWidget.h | 79 +++++++++++ 4 files changed, 482 insertions(+) create mode 100644 x64_dbg_gui/Project/Src/TabBar.cpp create mode 100644 x64_dbg_gui/Project/Src/TabBar.h create mode 100644 x64_dbg_gui/Project/Src/TabWidget.cpp create mode 100644 x64_dbg_gui/Project/Src/TabWidget.h diff --git a/x64_dbg_gui/Project/Src/TabBar.cpp b/x64_dbg_gui/Project/Src/TabBar.cpp new file mode 100644 index 00000000..7898f74b --- /dev/null +++ b/x64_dbg_gui/Project/Src/TabBar.cpp @@ -0,0 +1,163 @@ +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) +{ + setAcceptDrops(true); + setElideMode(Qt::ElideRight); + setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); + setMovable(true); +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabBar::~MHTabBar(void) +{ +} + +void MHTabBar::contextMenuEvent(QContextMenuEvent* event) +{ + QMenu wMenu(this); + QAction wDetach("&Detach", this); + wMenu.addAction(&wDetach); + if(wMenu.exec(event->globalPos())==&wDetach) + { + OnDetachTab(tabAt(event->pos()), QPoint(0, 0)); + } +} + + +/* +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) + m_dragStartPos = event->pos(); + + m_dragDroppedPos.setX(0); + m_dragDroppedPos.setY(0); + m_dragMovedPos.setX(0); + m_dragMovedPos.setY(0); + + m_dragInitiated = false; + + QTabBar::mousePressEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mouseMoveEvent(QMouseEvent* event) +{ + // Distinguish a drag + if ( !m_dragStartPos.isNull() && + ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) + { + m_dragInitiated = true; + } + + // The left button is pressed + // And the move could also be a drag + // And the mouse moved outside the tab bar + if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) + { + // Stop the move to be able to convert to a drag + { + QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QTabBar::mouseMoveEvent(&finishMoveEvent); + } + + // A crude way to distinguish tab-reordering drops from other ones + QMimeData* mimeData = new QMimeData; + mimeData->setData("action", "application/tab-detach"); + + // Initiate Drag + QDrag* drag = new QDrag(this); + drag->setMimeData(mimeData); + + // Create transparent screen dump + QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); + QPixmap targetPixmap(pixmap.size()); + + QPainter painter(&targetPixmap); + painter.setOpacity(0.5); + painter.drawPixmap(0, 0, pixmap); + painter.end(); + + drag->setPixmap(targetPixmap); + + // Handle Detach and Move + Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); + + if (dragged == Qt::IgnoreAction) + { + event->accept(); + OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); + } + else if (dragged == Qt::MoveAction) + { + if (!m_dragDroppedPos.isNull()) + { + event->accept(); + OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); + } + } + + delete drag; + } + else + { + QTabBar::mouseMoveEvent(event); + } +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragEnterEvent(QDragEnterEvent* event) +{ + // Only accept if it's an tab-reordering request (not a detach request) + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) + { + event->acceptProposedAction(); + } + + QTabBar::dragEnterEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragMoveEvent(QDragMoveEvent* event) +{ + // Only accept if it's an tab-reordering request (not a detach request) + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) + { + m_dragMovedPos = event->pos(); + event->acceptProposedAction(); + } + + QTabBar::dragMoveEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dropEvent(QDropEvent* event) +{ + // If a dragged Event is dropped within this widget it is not a drag but a move. + m_dragDroppedPos = event->pos(); + + QTabBar::dropEvent(event); +} +*/ diff --git a/x64_dbg_gui/Project/Src/TabBar.h b/x64_dbg_gui/Project/Src/TabBar.h new file mode 100644 index 00000000..493b0e28 --- /dev/null +++ b/x64_dbg_gui/Project/Src/TabBar.h @@ -0,0 +1,50 @@ +#ifndef __MHTABBAR_H__ +#define __MHTABBAR_H__ + +// Qt includes +#include +#include +#include + +// Qt forward class definitions +class MHTabBar; +class QMainWindow; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabBar implements the a Tab Bar with tear-off functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabBar: public QTabBar +{ + Q_OBJECT +public: + MHTabBar (QWidget* parent); + ~MHTabBar (void); + +protected: + void contextMenuEvent(QContextMenuEvent* event); + /* + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void dropEvent(QDropEvent* event); + */ + +signals: + // Detach Tab + void OnDetachTab (int index, QPoint& dropPoint); + // Move Tab + void OnMoveTab (int fromIndex, int toIndex); + +private: + /* + QPoint m_dragStartPos; + QPoint m_dragMovedPos; + QPoint m_dragDroppedPos; + bool m_dragInitiated; + int m_dragCurrentIndex; + */ +}; + +#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/TabWidget.cpp b/x64_dbg_gui/Project/Src/TabWidget.cpp new file mode 100644 index 00000000..fed6f634 --- /dev/null +++ b/x64_dbg_gui/Project/Src/TabWidget.cpp @@ -0,0 +1,190 @@ +// Qt includes +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) +{ + m_tabBar = new MHTabBar(this); + connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + + setTabBar(m_tabBar); + setMovable(true); + + m_Windows.clear(); +} + +QTabBar* MHTabWidget::tabBar() +{ + return m_tabBar; +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabWidget::~MHTabWidget(void) +{ + disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + delete m_tabBar; +} + +int MHTabWidget::count() const +{ + return QTabWidget::count() + m_Windows.size(); +} + +QWidget *MHTabWidget::widget(int index) const +{ + int baseCount = QTabWidget::count(); + + // Check if it's just a normal tab + if (index < baseCount) + return QTabWidget::widget(index); + + // Otherwise it's going to be a window + return m_Windows.at(index - baseCount); +} + +void MHTabWidget::setCurrentIndex(int index) +{ + // Check if it's just a normal tab + if (index < QTabWidget::count()) + { + QTabWidget::setCurrentIndex(index); + } + else + { + // Otherwise it's going to be a window (just bring it up) + MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); + window->activateWindow(); + } +} + +void MHTabWidget::setCurrentWidget(QWidget *widget) +{ + widget = 0; + // To be implemented. +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::MoveTab(int fromIndex, int toIndex) +{ + removeTab(fromIndex); + insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); + setCurrentIndex(toIndex); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::DetachTab(int index, QPoint& dropPoint) +{ + // Create the window + MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); + detachedWidget->setWindowModality(Qt::NonModal); + + // Find Widget and connect + connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + + detachedWidget->setWindowTitle(tabText(index)); + detachedWidget->setWindowIcon(tabIcon(index)); + + // Remove from tab bar + QWidget* tearOffWidget = widget(index); + tearOffWidget->setParent(detachedWidget); + + // Add it to the windows list + m_Windows.append(tearOffWidget); + + // Make first active + if (count() > 0) + setCurrentIndex(0); + + // Create and show + detachedWidget->setCentralWidget(tearOffWidget); + + // Needs to be done explicitly + tearOffWidget->show(); + QRect screenGeometry = QApplication::desktop()->screenGeometry(); + int w = 640; + int h = 480; + int x = (screenGeometry.width() - w) / 2; + int y = (screenGeometry.height() - h) / 2; + detachedWidget->show(); + detachedWidget->setGeometry(x, y, w, h); + detachedWidget->show(); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::AttachTab(QWidget *parent) +{ + // Retrieve widget + MHDetachedWindow* detachedWidget = dynamic_cast(parent); + QWidget* tearOffWidget = detachedWidget->centralWidget(); + + // Reattach the tab + int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); + + // Remove it from the windows list + for(int i = 0; i < m_Windows.size(); i++) + { + if (m_Windows.at(i) == tearOffWidget) + m_Windows.removeAt(i); + } + + // Make Active + if (newIndex != -1) + setCurrentIndex(newIndex); + + // Cleanup Window + disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + detachedWidget->hide(); + detachedWidget->close(); +} + +//---------------------------------------------------------------------------- + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent) +{ + m_TabWidget = tabwidget; +} + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::~MHDetachedWindow(void) +{ +} + +/* +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::moveEvent(QMoveEvent *event) +{ + QRect rect = m_TabWidget->geometry(); + QSize hint = m_TabWidget->tabBar()->sizeHint(); + + // Height of the actual top tab bar + rect.setBottom(rect.top() + hint.height()); + QPoint pos1(rect.x(), rect.y()); + pos1=m_TabWidget->mapToGlobal(pos1); + rect.setX(pos1.x()); + rect.setY(pos1.y()); + + if (rect.contains(event->pos())) + { + m_TabWidget->AttachTab(this); + event->accept(); + } + else + { + QMainWindow::moveEvent(event); + } +} +*/ + +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) +{ + emit OnClose(this); +} diff --git a/x64_dbg_gui/Project/Src/TabWidget.h b/x64_dbg_gui/Project/Src/TabWidget.h new file mode 100644 index 00000000..874913fb --- /dev/null +++ b/x64_dbg_gui/Project/Src/TabWidget.h @@ -0,0 +1,79 @@ +#ifndef __MHTABWIDGET_H__ +#define __MHTABWIDGET_H__ + +// Qt includes +#include +#include +#include +#include +#include +#include + +// Qt forward class definitions +class MHTabBar; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabWidget implements the a Tab Widget with detach and attach +// functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabWidget: public QTabWidget +{ + Q_OBJECT + +public: + MHTabWidget(QWidget *parent); + virtual ~MHTabWidget(void); + QTabBar* tabBar(); + +public slots: + int count() const; + QWidget *widget(int index) const; + + // Move Tab + void MoveTab(int fromIndex, int toIndex); + + // Detach Tab + void DetachTab(int index, QPoint&); + + // Attach Tab + void AttachTab(QWidget *parent); + +public Q_SLOTS: + void setCurrentIndex(int index); + void setCurrentWidget(QWidget *widget); + +protected: + +private: + MHTabBar* m_tabBar; + + QList m_Windows; +}; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHDetachedWindow implements the WindowContainer for the Detached Widget +// +// Conditions: +// Header : MHTabWidget.h +////////////////////////////////////////////////////////////////////////////// +class MHDetachedWindow : public QMainWindow +{ + Q_OBJECT +public: + MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0); + ~MHDetachedWindow(void); + +protected: + MHTabWidget *m_TabWidget; + + //virtual void moveEvent(QMoveEvent *event); + void closeEvent(QCloseEvent *event); + +signals: + void OnClose(QWidget* widget); +}; + +#endif // __MHTABWIDGET_H__ + From f87d2079b7775dff93c56022b1a175088c378b2a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 15 May 2014 02:06:42 +0200 Subject: [PATCH 039/676] GUI: some failures --- x64_dbg_gui/Project/Src/{ => Gui}/TabBar.cpp | 0 x64_dbg_gui/Project/Src/{ => Gui}/TabBar.h | 0 x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.cpp | 0 x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.h | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename x64_dbg_gui/Project/Src/{ => Gui}/TabBar.cpp (100%) rename x64_dbg_gui/Project/Src/{ => Gui}/TabBar.h (100%) rename x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.cpp (100%) rename x64_dbg_gui/Project/Src/{ => Gui}/TabWidget.h (100%) diff --git a/x64_dbg_gui/Project/Src/TabBar.cpp b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp similarity index 100% rename from x64_dbg_gui/Project/Src/TabBar.cpp rename to x64_dbg_gui/Project/Src/Gui/TabBar.cpp diff --git a/x64_dbg_gui/Project/Src/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h similarity index 100% rename from x64_dbg_gui/Project/Src/TabBar.h rename to x64_dbg_gui/Project/Src/Gui/TabBar.h diff --git a/x64_dbg_gui/Project/Src/TabWidget.cpp b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp similarity index 100% rename from x64_dbg_gui/Project/Src/TabWidget.cpp rename to x64_dbg_gui/Project/Src/Gui/TabWidget.cpp diff --git a/x64_dbg_gui/Project/Src/TabWidget.h b/x64_dbg_gui/Project/Src/Gui/TabWidget.h similarity index 100% rename from x64_dbg_gui/Project/Src/TabWidget.h rename to x64_dbg_gui/Project/Src/Gui/TabWidget.h From 03a18dd9c4ba7bbac5c4e5f3a43a467a972d2e45 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 18 May 2014 02:24:08 +0200 Subject: [PATCH 040/676] GUI: fixed a bug with the reference view (thanks to Artic for reporting this) GUI: fixed a bug with the reloadData function DBG: removed useless DeleteFile calls --- x64_dbg_dbg/debugger.cpp | 1 - x64_dbg_dbg/x64_dbg.cpp | 2 -- x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h | 2 +- x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp | 6 ++++++ x64_dbg_gui/Project/Src/BasicView/Disassembly.h | 1 + x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp | 5 +++++ 6 files changed, 13 insertions(+), 4 deletions(-) diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 3a82b542..1e3bf2d0 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -974,7 +974,6 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter) stopInfo.reserved=0; plugincbcall(CB_STOPDEBUG, &stopInfo); //message the user/do final stuff - DeleteFileA("DLLLoader.exe"); RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints //cleanup dbclose(); diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 4fadd073..7dd981fa 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -181,7 +181,6 @@ static DWORD WINAPI DbgCommandLoopThread(void* a) extern "C" DLL_EXPORT const char* _dbg_dbginit() { - DeleteFileA("DLLLoader.exe"); DeleteFileA("alloctrace.txt"); char dir[deflen]=""; if(!GetModuleFileNameA(hInst, dir, deflen)) @@ -211,7 +210,6 @@ extern "C" DLL_EXPORT void _dbg_dbgexitsignal() cbStopDebug(0, 0); wait(WAITID_STOP); //after this, debugging stopped pluginunload(); - DeleteFileA("DLLLoader.exe"); cmdfree(command_list); varfree(); msgfreestack(gMsgStack); diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h index ddfb7187..6d930a70 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h @@ -80,7 +80,7 @@ signals: public slots: // Update/Reload/Refresh/Repaint - void reloadData(); + virtual void reloadData(); void repaint(); // ScrollBar Management diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 7258b070..cfc956b2 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -995,6 +995,12 @@ void Disassembly::prepareData() } } +void Disassembly::reloadData() +{ + emit selectionChanged(rvaToVa(mSelection.firstSelectedIndex)); + AbstractTableView::reloadData(); +} + /************************************************************************************ Public Methods diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index 112871c7..fefb8a69 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -68,6 +68,7 @@ public: // Update/Reload/Refresh/Repaint void prepareData(); + void reloadData(); // Public Methods uint_t rvaToVa(int_t rva); diff --git a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp index 8f83e78b..d639d3a0 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.cpp @@ -61,10 +61,15 @@ void ReferenceView::setRowCount(int_t count) void ReferenceView::deleteAllColumns() { + mSearchBox->setText(""); mList->setTableOffset(0); mList->setSingleSelection(0); mList->deleteAllColumns(); mList->reloadData(); + mSearchList->setTableOffset(0); + mSearchList->setSingleSelection(0); + mSearchList->deleteAllColumns(); + mSearchList->reloadData(); mSearchStartCol = 1; } From 259099f9361f5a086735a845ad5dafeac22df15a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 18 May 2014 14:13:07 +0200 Subject: [PATCH 041/676] DBG: fixed two small bugs in the script engine --- x64_dbg_dbg/simplescript.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/x64_dbg_dbg/simplescript.cpp b/x64_dbg_dbg/simplescript.cpp index 98409614..82ef418e 100644 --- a/x64_dbg_dbg/simplescript.cpp +++ b/x64_dbg_dbg/simplescript.cpp @@ -69,6 +69,12 @@ static bool scriptcreatelinemap(const char* filename) return false; } unsigned int filesize=GetFileSize(hFile, 0); + if(!filesize) + { + CloseHandle(hFile); + GuiScriptError(0, "Empty script..."); + return false; + } char* filedata=(char*)emalloc(filesize+1, "createlinemap:filedata"); memset(filedata, 0, filesize+1); DWORD read=0; @@ -507,7 +513,7 @@ void scriptunload() void scriptrun(int destline) { - if(!waitislocked(WAITID_RUN)) + if(DbgIsDebugging() && !waitislocked(WAITID_RUN)) { GuiScriptError(0, "Debugger must be paused to run a script!"); return; From bf7c1fb8c342bf02e1f1d543a07c370c01d4293f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 21 May 2014 00:20:31 +0200 Subject: [PATCH 042/676] DBG: fixed a few warnings DBG: updated pattern finder --- x64_dbg_bridge/x64_dbg_bridge.vcxproj | 10 ++++----- x64_dbg_dbg/_exports.cpp | 28 +++++++++++------------ x64_dbg_dbg/disasm_helper.cpp | 4 ++-- x64_dbg_dbg/memory.cpp | 32 +++++++++++++++++++-------- x64_dbg_dbg/symbolinfo.cpp | 2 +- x64_dbg_dbg/thread.cpp | 2 +- x64_dbg_dbg/x64_dbg_dbg.vcxproj | 4 ++-- x64_dbg_exe/x64_dbg_exe.vcxproj | 10 ++++----- 8 files changed, 53 insertions(+), 39 deletions(-) diff --git a/x64_dbg_bridge/x64_dbg_bridge.vcxproj b/x64_dbg_bridge/x64_dbg_bridge.vcxproj index 87471fbf..f6d642f8 100644 --- a/x64_dbg_bridge/x64_dbg_bridge.vcxproj +++ b/x64_dbg_bridge/x64_dbg_bridge.vcxproj @@ -19,7 +19,7 @@ - {944D9923-CB1A-6F6C-BCBC-9E00A71954C1} + {944D9923-CB1A-6F6C-BCBC-9E00A71954C1} Win32Proj @@ -42,14 +42,14 @@ - true - $(SolutionDir)bin\x32 + false + $(SolutionDir)bin\x32\ $(Platform)\$(Configuration)\ x32_bridge - true - $(SolutionDir)bin\x64 + false + $(SolutionDir)bin\x64\ x64_bridge diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index 1983ea7c..73886564 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -126,41 +126,41 @@ extern "C" DLL_EXPORT bool _dbg_memmap(MEMMAP* memmap) SectionName=""; int len=strlen(SectionName); int escape_count=0; - for(int i=0; itype=arg_memory; arg->segment=ConvertBeaSeg(Argument->SegmentReg); - uint value=Argument->Memory.Displacement; + uint value=(uint)Argument->Memory.Displacement; if((Argument->ArgType&RELATIVE_)==RELATIVE_) - value=Instruction->AddrValue; + value=(uint)Instruction->AddrValue; arg->constant=value; arg->value=0; if(!valfromstring(argmnemonic, &value, true, true)) diff --git a/x64_dbg_dbg/memory.cpp b/x64_dbg_dbg/memory.cpp index 3b9474b0..eaeef393 100644 --- a/x64_dbg_dbg/memory.cpp +++ b/x64_dbg_dbg/memory.cpp @@ -99,6 +99,20 @@ void memfree(HANDLE hProcess, uint addr) VirtualFreeEx(hProcess, (void*)addr, 0, MEM_RELEASE); } +static int formathexpattern(char* string) +{ + int len=strlen(string); + _strupr(string); + char* new_string=(char*)emalloc(len+1, "formathexpattern:new_string"); + memset(new_string, 0, len+1); + for(int i=0,j=0; i* pattern) { if(!text or !pattern) @@ -109,6 +123,7 @@ static bool patterntransform(const char* text, std::vector* pattern return false; char* newtext=(char*)emalloc(len+2, "transformpattern:newtext"); strcpy(newtext, text); + len=formathexpattern(newtext); if(len%2) //not a multiple of 2 { newtext[len]='?'; @@ -118,7 +133,13 @@ static bool patterntransform(const char* text, std::vector* pattern PATTERNBYTE newByte; for(int i=0,j=0; i* pattern newByte.n[j].n=val&0xF; j++; } - else if(newtext[i]=='?') //wildcard - { - newByte.n[j].all=true; //match anything - newByte.n[j].n=0; - j++; - } - else //dafug dude.. - return false; //invalid pattern format + if(j==2) //two nibbles = one byte { j=0; diff --git a/x64_dbg_dbg/symbolinfo.cpp b/x64_dbg_dbg/symbolinfo.cpp index 8f2c4141..44e0a0f8 100644 --- a/x64_dbg_dbg/symbolinfo.cpp +++ b/x64_dbg_dbg/symbolinfo.cpp @@ -13,7 +13,7 @@ static BOOL CALLBACK EnumSymbols(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID int len=strlen(pSymInfo->Name); SYMBOLINFO curSymbol; memset(&curSymbol, 0, sizeof(SYMBOLINFO)); - curSymbol.addr=pSymInfo->Address; + curSymbol.addr=(duint)pSymInfo->Address; curSymbol.decoratedSymbol=(char*)BridgeAlloc(len+1); strcpy(curSymbol.decoratedSymbol, pSymInfo->Name); curSymbol.undecoratedSymbol=(char*)BridgeAlloc(MAX_SYM_NAME); diff --git a/x64_dbg_dbg/thread.cpp b/x64_dbg_dbg/thread.cpp index dbc6e2ba..05a385d7 100644 --- a/x64_dbg_dbg/thread.cpp +++ b/x64_dbg_dbg/thread.cpp @@ -22,7 +22,7 @@ void threadcreate(CREATE_THREAD_DEBUG_INFO* CreateThread) void threadexit(DWORD dwThreadId) { - for(int i=0; i - true + false $(SolutionDir)bin\x32\ $(Platform)\$(Configuration)\ x32_dbg - true + false $(SolutionDir)bin\x64\ x64_dbg diff --git a/x64_dbg_exe/x64_dbg_exe.vcxproj b/x64_dbg_exe/x64_dbg_exe.vcxproj index fb81b119..01b36e61 100644 --- a/x64_dbg_exe/x64_dbg_exe.vcxproj +++ b/x64_dbg_exe/x64_dbg_exe.vcxproj @@ -20,7 +20,7 @@ - {3A22175E-6B72-FDCC-1603-C4A2163C7900} + {3A22175E-6B72-FDCC-1603-C4A2163C7900} Win32Proj @@ -43,14 +43,14 @@ - true - $(SolutionDir)bin\x32 + false + $(SolutionDir)bin\x32\ $(Platform)\$(Configuration)\ x32_dbg - true - $(SolutionDir)bin\x64 + false + $(SolutionDir)bin\x64\ x64_dbg From 673602847982015a63d0ec2ba489ea5622cbd28b Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 21 May 2014 00:21:07 +0200 Subject: [PATCH 043/676] GUI: added CommandHelpView draft --- .../Project/Src/BasicView/CommandHelpView.cpp | 133 ++++++++++++++++++ .../Project/Src/BasicView/CommandHelpView.h | 41 ++++++ .../Project/Src/BasicView/CommandHelpView.ui | 103 ++++++++++++++ 3 files changed, 277 insertions(+) create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h create mode 100644 x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp new file mode 100644 index 00000000..a2d8b3c7 --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp @@ -0,0 +1,133 @@ +#include "CommandHelpView.h" +#include "ui_CommandHelpView.h" + +CommandHelpView::CommandHelpView(QWidget *parent) : + QWidget(parent), + ui(new Ui::CommandHelpView) +{ + ui->setupUi(this); + + // Set main layout + mMainLayout = new QVBoxLayout; + mMainLayout->setContentsMargins(0, 0, 0, 0); + mMainLayout->addWidget(ui->mainSplitter); + setLayout(mMainLayout); + + // Create reference view + mSearchListView = new SearchListView(); + mSearchListView->mSearchStartCol = 1; + + // Get font information + QFont wFont("Monospace", 8); + wFont.setStyleHint(QFont::Monospace); + wFont.setFixedPitch(true); + int charwidth=QFontMetrics(wFont).width(QChar(' ')); + + // Create module list + mModuleList = new StdTable(); + mModuleList->addColumnAt(0, "Module", false); + + // Setup symbol list + mSearchListView->mList->addColumnAt(0, "Command", true); + + // Setup search list + mSearchListView->mSearchList->addColumnAt(0, "Command", true); + + // Setup list splitter + ui->listSplitter->addWidget(mModuleList); + ui->listSplitter->addWidget(mSearchListView); +#ifdef _WIN64 + // mModuleList : mSymbolList = 40 : 100 + ui->listSplitter->setStretchFactor(0, 40); + ui->listSplitter->setStretchFactor(1, 100); +#else + // mModuleList : mSymbolList = 30 : 100 + ui->listSplitter->setStretchFactor(0, 30); + ui->listSplitter->setStretchFactor(1, 100); +#endif //_WIN64 + + // Setup log edit + ui->symbolLogEdit->setFont(wFont); + ui->symbolLogEdit->setStyleSheet("QTextEdit { background-color: rgb(255, 251, 240) }"); + ui->symbolLogEdit->setUndoRedoEnabled(false); + ui->symbolLogEdit->setReadOnly(true); + // Log : List = 2 : 9 + ui->mainSplitter->setStretchFactor(1, 9); + ui->mainSplitter->setStretchFactor(0, 1); + + connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int))); + connect(mSearchListView->mList, SIGNAL(selectionChangedSignal(int)), this, SLOT(symbolSelectionChanged(int))); + + //fill with example data + mModuleList->setRowCount(2); + mModuleList->setCellContent(0, 0, "x64_dbg"); + mModuleList->setCellContent(1, 0, "testplugin"); + + mModuleList->setSingleSelection(0); +} + +CommandHelpView::~CommandHelpView() +{ + delete ui; +} + +void CommandHelpView::moduleSelectionChanged(int index) +{ + mSearchListView->mList->setRowCount(0); + + if(index==0) //x64_dbg + { + mCurrentMode=0; + mSearchListView->mList->setRowCount(3); + mSearchListView->mList->setCellContent(0, 0, "InitDebug"); + mSearchListView->mList->setCellContent(1, 0, "StopDebug"); + mSearchListView->mList->setCellContent(2, 0, "run"); + } + else if(index==1) //testplugin + { + mCurrentMode=1; + mSearchListView->mList->setRowCount(2); + mSearchListView->mList->setCellContent(0, 0, "plugin1"); + mSearchListView->mList->setCellContent(1, 0, "grs"); + } + + mSearchListView->mList->reloadData(); + mSearchListView->mList->setSingleSelection(0); + mSearchListView->mList->setTableOffset(0); + mSearchListView->mList->setFocus(); + mSearchListView->mSearchBox->setText(""); +} + +void CommandHelpView::symbolSelectionChanged(int index) +{ + QString info=""; + if(mCurrentMode==0) //x64_dbg + { + switch(index) + { + case 0: //InitDebug + info="Initialize debugging a file.\n\nExample:\nInitDebug \"C:\\test.exe\", commandline, \"C:\\homeDir\""; + break; + case 1: //StopDebug + info="Stop debugging (terminate the target).\n\nExample:\nStopDebug"; + break; + case 2: //run + info="Resume debugging.\n\nExample:\nrun"; + break; + } + } + else if(mCurrentMode==1) //testplugin + { + switch(index) + { + case 0: //plugin1 + info="Just a simple plugin test command.\n\nExample:\nplugin1"; + break; + case 1: //grs + info="Get relocation table size.\n\nExample:\ngrs 404000"; + break; + } + + } + ui->symbolLogEdit->setText(info); +} diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h new file mode 100644 index 00000000..8e2a990b --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h @@ -0,0 +1,41 @@ +#ifndef COMMANDHELPVIEW_H +#define COMMANDHELPVIEW_H + +#include +#include +#include +#include +#include "StdTable.h" +#include "Bridge.h" +#include "SearchListView.h" + +namespace Ui { +class CommandHelpView; +} + +class CommandHelpView : public QWidget +{ + Q_OBJECT + +public: + explicit CommandHelpView(QWidget *parent = 0); + ~CommandHelpView(); + +private slots: + void moduleSelectionChanged(int index); + void symbolSelectionChanged(int index); + +signals: + void showCpu(); + +private: + Ui::CommandHelpView *ui; + QVBoxLayout* mMainLayout; + QVBoxLayout* mSymbolLayout; + QWidget* mSymbolPlaceHolder; + SearchListView* mSearchListView; + StdTable* mModuleList; + int mCurrentMode; +}; + +#endif // COMMANDHELPVIEW_H diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui new file mode 100644 index 00000000..bed24936 --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.ui @@ -0,0 +1,103 @@ + + + CommandHelpView + + + + 0 + 0 + 694 + 605 + + + + Form + + + true + + + + + + + + 0 + 0 + 691 + 601 + + + + + 0 + 0 + + + + Qt::Vertical + + + false + + + + + 0 + 0 + + + + Qt::Horizontal + + + 2 + + + false + + + + + + 3 + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + 16777215 + 15 + + + + 0 + + + false + + + + + + + + + + From 5777b7364fad0c8641f48e246f76964307afe6eb Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 21 May 2014 00:22:49 +0200 Subject: [PATCH 044/676] DBG: added command auto-completion BRIDGE: added command auto-completion GUI: added command auto-completion GUI: added HistoryLineEdit in the Goto Dialog --- x64_dbg_bridge/bridgemain.cpp | 15 ++ x64_dbg_bridge/bridgemain.h | 8 +- x64_dbg_dbg/debugger.cpp | 16 ++ x64_dbg_dbg/debugger.h | 3 + x64_dbg_dbg/plugin_loader.cpp | 8 +- x64_dbg_dbg/x64_dbg.cpp | 164 +++++++++--------- x64_dbg_gui/Project/DebuggerX64.pro | 11 +- .../Project/Src/BasicView/HistoryLineEdit.cpp | 51 ++++++ .../Project/Src/BasicView/HistoryLineEdit.h | 29 ++++ x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp | 11 ++ x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 39 +++++ x64_dbg_gui/Project/Src/Bridge/Bridge.h | 6 + .../Project/Src/Gui/CPUDisassembly.cpp | 9 +- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 + x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 11 +- x64_dbg_gui/Project/Src/Gui/CPUDump.h | 2 + x64_dbg_gui/Project/Src/Gui/CPUStack.cpp | 15 +- x64_dbg_gui/Project/Src/Gui/CPUStack.h | 2 + .../Project/Src/Gui/CommandLineEdit.cpp | 69 +++----- x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h | 29 ++-- x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp | 8 + x64_dbg_gui/Project/Src/Gui/GotoDialog.h | 2 + x64_dbg_gui/Project/Src/Gui/GotoDialog.ui | 9 +- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 4 +- 24 files changed, 357 insertions(+), 166 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp create mode 100644 x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 643e19ae..ea427f10 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -829,6 +829,21 @@ BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text) return (bool)(duint)_gui_sendmessage(GUI_GETLINE_WINDOW, (void*)title, text); } +BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd) +{ + _gui_sendmessage(GUI_AUTOCOMPLETE_ADDCMD, (void*)cmd, 0); +} + +BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd) +{ + _gui_sendmessage(GUI_AUTOCOMPLETE_DELCMD, (void*)cmd, 0); +} + +BRIDGE_IMPEXP void GuiAutoCompleteClearAll() +{ + _gui_sendmessage(GUI_AUTOCOMPLETE_CLEARALL, 0, 0); +} + //Main BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 83a0dd0b..15301402 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -549,7 +549,10 @@ enum GUIMSG GUI_MENU_CLEAR, // param1=int hMenu, param2=unused GUI_SELECTION_GET, // param1=int hWindow, param2=SELECTIONDATA* selection GUI_SELECTION_SET, // param1=int hWindow, param2=const SELECTIONDATA* selection - GUI_GETLINE_WINDOW // param1=const char* title, param2=char* text + GUI_GETLINE_WINDOW, // param1=const char* title, param2=char* text + GUI_AUTOCOMPLETE_ADDCMD, // param1=const char* cmd, param2=ununsed + GUI_AUTOCOMPLETE_DELCMD, // param1=const char* cmd, param2=ununsed + GUI_AUTOCOMPLETE_CLEARALL // param1=ununsed, param2=unused }; //GUI structures @@ -613,6 +616,9 @@ BRIDGE_IMPEXP void GuiMenuClear(int hMenu); BRIDGE_IMPEXP bool GuiSelectionGet(int hWindow, SELECTIONDATA* selection); BRIDGE_IMPEXP bool GuiSelectionSet(int hWindow, const SELECTIONDATA* selection); BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text); +BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd); +BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd); +BRIDGE_IMPEXP void GuiAutoCompleteClearAll(); #ifdef __cplusplus } diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 1e3bf2d0..0dd2568a 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -99,6 +99,22 @@ bool dbgisignoredexception(unsigned int exception) return false; } +bool dbgcmdnew(const char* name, CBCOMMAND cbCommand, bool debugonly) +{ + if(!cmdnew(dbggetcommandlist(), name, cbCommand, debugonly)) + return false; + GuiAutoCompleteAddCmd(name); + return true; +} + +bool dbgcmddel(const char* name) +{ + if(!cmddel(dbggetcommandlist(), name)) + return false; + GuiAutoCompleteDelCmd(name); + return true; +} + void DebugUpdateGui(uint disasm_addr, bool stack) { uint cip=GetContextData(UE_CIP); diff --git a/x64_dbg_dbg/debugger.h b/x64_dbg_dbg/debugger.h index a0d28ed1..608dfdb4 100644 --- a/x64_dbg_dbg/debugger.h +++ b/x64_dbg_dbg/debugger.h @@ -29,6 +29,9 @@ void dbgsetskipexceptions(bool skip); void dbgclearignoredexceptions(); void dbgaddignoredexception(ExceptionRange range); bool dbgisignoredexception(unsigned int exception); +bool dbgcmdnew(const char* name, CBCOMMAND cbCommand, bool debugonly); +bool dbgcmddel(const char* name); + //callbacks CMDRESULT cbDebugInit(int argc, char* argv[]); CMDRESULT cbStopDebug(int argc, char* argv[]); diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp index d9974921..fc337bdd 100644 --- a/x64_dbg_dbg/plugin_loader.cpp +++ b/x64_dbg_dbg/plugin_loader.cpp @@ -1,6 +1,6 @@ #include "plugin_loader.h" #include "console.h" -#include "command.h" +#include "debugger.h" #include "x64_dbg.h" static std::vector pluginList; @@ -105,7 +105,7 @@ static void plugincmdunregisterall(int pluginHandle) { if(pluginCommandList.at(i).pluginHandle==pluginHandle) { - cmddel(dbggetcommandlist(), pluginCommandList.at(i).command); + dbgcmddel(pluginCommandList.at(i).command); pluginCommandList.erase(pluginCommandList.begin()+i); } } @@ -172,7 +172,7 @@ bool plugincmdregister(int pluginHandle, const char* command, CBPLUGINCOMMAND cb PLUG_COMMAND plugCmd; plugCmd.pluginHandle=pluginHandle; strcpy(plugCmd.command, command); - if(!cmdnew(dbggetcommandlist(), command, (CBCOMMAND)cbCommand, debugonly)) + if(!dbgcmdnew(command, (CBCOMMAND)cbCommand, debugonly)) return false; pluginCommandList.push_back(plugCmd); dprintf("[PLUGIN] command \"%s\" registered!\n", command); @@ -188,7 +188,7 @@ bool plugincmdunregister(int pluginHandle, const char* command) { if(pluginCommandList.at(i).pluginHandle==pluginHandle and !strcmp(pluginCommandList.at(i).command, command)) { - if(!cmddel(dbggetcommandlist(), command)) + if(!dbgcmddel(command)) return false; pluginCommandList.erase(pluginCommandList.begin()+i); dprintf("[PLUGIN] command \"%s\" unregistered!\n", command); diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 7dd981fa..e71d4f1f 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -49,108 +49,108 @@ static void registercommands() COMMAND* cmd=command_list=cmdinit(); //debug control - cmdnew(cmd, "InitDebug\1init\1initdbg", cbDebugInit, false); //init debugger arg1:exefile,[arg2:commandline] - cmdnew(cmd, "StopDebug\1stop\1dbgstop", cbStopDebug, true); //stop debugger - cmdnew(cmd, "AttachDebugger\1attach", cbDebugAttach, false); //attach - cmdnew(cmd, "DetachDebugger\1detach", cbDebugDetach, true); //detach - cmdnew(cmd, "run\1go\1r\1g", cbDebugRun, true); //unlock WAITID_RUN - cmdnew(cmd, "erun\1egun\1er\1eg", cbDebugErun, true); //run + skip first chance exceptions - cmdnew(cmd, "pause", cbDebugPause, true); //pause debugger - cmdnew(cmd, "StepInto\1sti", cbDebugStepInto, true); //StepInto - cmdnew(cmd, "eStepInto\1esti", cbDebugeStepInto, true); //StepInto + skip first chance exceptions - cmdnew(cmd, "StepOver\1step\1sto\1st", cbDebugStepOver, true); //StepOver - cmdnew(cmd, "eStepOver\1estep\1esto\1est", cbDebugeStepOver, true); //StepOver + skip first chance exceptions - cmdnew(cmd, "SingleStep\1sstep\1sst", cbDebugSingleStep, true); //SingleStep arg1:count - cmdnew(cmd, "eSingleStep\1esstep\1esst", cbDebugeSingleStep, true); //SingleStep arg1:count + skip first chance exceptions - cmdnew(cmd, "StepOut\1rtr", cbDebugRtr, true); //rtr - cmdnew(cmd, "eStepOut\1ertr", cbDebugeRtr, true); //rtr + skip first chance exceptions + dbgcmdnew("InitDebug\1init\1initdbg", cbDebugInit, false); //init debugger arg1:exefile,[arg2:commandline] + dbgcmdnew("StopDebug\1stop\1dbgstop", cbStopDebug, true); //stop debugger + dbgcmdnew("AttachDebugger\1attach", cbDebugAttach, false); //attach + dbgcmdnew("DetachDebugger\1detach", cbDebugDetach, true); //detach + dbgcmdnew("run\1go\1r\1g", cbDebugRun, true); //unlock WAITID_RUN + dbgcmdnew("erun\1egun\1er\1eg", cbDebugErun, true); //run + skip first chance exceptions + dbgcmdnew("pause", cbDebugPause, true); //pause debugger + dbgcmdnew("StepInto\1sti", cbDebugStepInto, true); //StepInto + dbgcmdnew("eStepInto\1esti", cbDebugeStepInto, true); //StepInto + skip first chance exceptions + dbgcmdnew("StepOver\1step\1sto\1st", cbDebugStepOver, true); //StepOver + dbgcmdnew("eStepOver\1estep\1esto\1est", cbDebugeStepOver, true); //StepOver + skip first chance exceptions + dbgcmdnew("SingleStep\1sstep\1sst", cbDebugSingleStep, true); //SingleStep arg1:count + dbgcmdnew("eSingleStep\1esstep\1esst", cbDebugeSingleStep, true); //SingleStep arg1:count + skip first chance exceptions + dbgcmdnew("StepOut\1rtr", cbDebugRtr, true); //rtr + dbgcmdnew("eStepOut\1ertr", cbDebugeRtr, true); //rtr + skip first chance exceptions //breakpoints - cmdnew(cmd, "bplist", cbDebugBplist, true); //breakpoint list - cmdnew(cmd, "SetBPXOptions\1bptype", cbDebugSetBPXOptions, false); //breakpoint type - cmdnew(cmd, "SetBPX\1bp\1bpx", cbDebugSetBPX, true); //breakpoint - cmdnew(cmd, "DeleteBPX\1bpc\1bc", cbDebugDeleteBPX, true); //breakpoint delete - cmdnew(cmd, "EnableBPX\1bpe\1be", cbDebugEnableBPX, true); //breakpoint enable - cmdnew(cmd, "DisableBPX\1bpd\1bd", cbDebugDisableBPX, true); //breakpoint disable - cmdnew(cmd, "SetHardwareBreakpoint\1bph\1bphws", cbDebugSetHardwareBreakpoint, true); //hardware breakpoint - cmdnew(cmd, "DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint - cmdnew(cmd, "SetMemoryBPX\1membp\1bpm", cbDebugSetMemoryBpx, true); //SetMemoryBPX - cmdnew(cmd, "DeleteMemoryBPX\1membpc\1bpmc", cbDebugDeleteMemoryBreakpoint, true); //delete memory breakpoint + dbgcmdnew("bplist", cbDebugBplist, true); //breakpoint list + dbgcmdnew("SetBPXOptions\1bptype", cbDebugSetBPXOptions, false); //breakpoint type + dbgcmdnew("SetBPX\1bp\1bpx", cbDebugSetBPX, true); //breakpoint + dbgcmdnew("DeleteBPX\1bpc\1bc", cbDebugDeleteBPX, true); //breakpoint delete + dbgcmdnew("EnableBPX\1bpe\1be", cbDebugEnableBPX, true); //breakpoint enable + dbgcmdnew("DisableBPX\1bpd\1bd", cbDebugDisableBPX, true); //breakpoint disable + dbgcmdnew("SetHardwareBreakpoint\1bph\1bphws", cbDebugSetHardwareBreakpoint, true); //hardware breakpoint + dbgcmdnew("DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint + dbgcmdnew("SetMemoryBPX\1membp\1bpm", cbDebugSetMemoryBpx, true); //SetMemoryBPX + dbgcmdnew("DeleteMemoryBPX\1membpc\1bpmc", cbDebugDeleteMemoryBreakpoint, true); //delete memory breakpoint //variables - cmdnew(cmd, "varnew\1var", cbInstrVar, false); //make a variable arg1:name,[arg2:value] - cmdnew(cmd, "vardel", cbInstrVarDel, false); //delete a variable, arg1:variable name - cmdnew(cmd, "varlist", cbInstrVarList, false); //list variables[arg1:type filter] - cmdnew(cmd, "mov\1set", cbInstrMov, false); //mov a variable, arg1:dest,arg2:src + dbgcmdnew("varnew\1var", cbInstrVar, false); //make a variable arg1:name,[arg2:value] + dbgcmdnew("vardel", cbInstrVarDel, false); //delete a variable, arg1:variable name + dbgcmdnew("varlist", cbInstrVarList, false); //list variables[arg1:type filter] + dbgcmdnew("mov\1set", cbInstrMov, false); //mov a variable, arg1:dest,arg2:src //misc - cmdnew(cmd, "strlen\1charcount\1ccount", cbStrLen, false); //get strlen, arg1:string - cmdnew(cmd, "cls\1lc\1lclr", cbCls, false); //clear the log - cmdnew(cmd, "chd", cbInstrChd, false); //Change directory - cmdnew(cmd, "disasm\1dis\1d", cbDebugDisasm, true); //doDisasm - cmdnew(cmd, "HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger - cmdnew(cmd, "dump", cbDebugDump, true); //dump at address - cmdnew(cmd, "sdump", cbDebugStackDump, true); //dump at stack address + dbgcmdnew("strlen\1charcount\1ccount", cbStrLen, false); //get strlen, arg1:string + dbgcmdnew("cls\1lc\1lclr", cbCls, false); //clear the log + dbgcmdnew("chd", cbInstrChd, false); //Change directory + dbgcmdnew("disasm\1dis\1d", cbDebugDisasm, true); //doDisasm + dbgcmdnew("HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger + dbgcmdnew("dump", cbDebugDump, true); //dump at address + dbgcmdnew("sdump", cbDebugStackDump, true); //dump at stack address //user database - cmdnew(cmd, "cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment - cmdnew(cmd, "cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment - cmdnew(cmd, "lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label - cmdnew(cmd, "lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label - cmdnew(cmd, "bookmark\1bookmarkset", cbInstrBookmarkSet, true); //set bookmark - cmdnew(cmd, "bookmarkc\1bookmarkdel", cbInstrBookmarkDel, true); //delete bookmark - cmdnew(cmd, "savedb\1dbsave", cbSavedb, true); //save program database - cmdnew(cmd, "loaddb\1dbload", cbLoaddb, true); //load program database - cmdnew(cmd, "functionadd\1func", cbFunctionAdd, true); //function - cmdnew(cmd, "functiondel\1funcc", cbFunctionDel, true); //function + dbgcmdnew("cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment + dbgcmdnew("cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment + dbgcmdnew("lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label + dbgcmdnew("lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label + dbgcmdnew("bookmark\1bookmarkset", cbInstrBookmarkSet, true); //set bookmark + dbgcmdnew("bookmarkc\1bookmarkdel", cbInstrBookmarkDel, true); //delete bookmark + dbgcmdnew("savedb\1dbsave", cbSavedb, true); //save program database + dbgcmdnew("loaddb\1dbload", cbLoaddb, true); //load program database + dbgcmdnew("functionadd\1func", cbFunctionAdd, true); //function + dbgcmdnew("functiondel\1funcc", cbFunctionDel, true); //function //memory operations - cmdnew(cmd, "alloc", cbDebugAlloc, true); //allocate memory - cmdnew(cmd, "free", cbDebugFree, true); //free memory - cmdnew(cmd, "Fill\1memset", cbDebugMemset, true); //memset + dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory + dbgcmdnew("free", cbDebugFree, true); //free memory + dbgcmdnew("Fill\1memset", cbDebugMemset, true); //memset //plugins - cmdnew(cmd, "StartScylla\1scylla\1imprec", cbStartScylla, false); //start scylla + dbgcmdnew("StartScylla\1scylla\1imprec", cbStartScylla, false); //start scylla //general purpose - cmdnew(cmd, "cmp", cbInstrCmp, false); //compare - cmdnew(cmd, "gpa", cbInstrGpa, true); - cmdnew(cmd, "add", cbInstrAdd, false); - cmdnew(cmd, "and", cbInstrAnd, false); - cmdnew(cmd, "dec", cbInstrDec, false); - cmdnew(cmd, "div", cbInstrDiv, false); - cmdnew(cmd, "inc", cbInstrInc, false); - cmdnew(cmd, "mul", cbInstrMul, false); - cmdnew(cmd, "neg", cbInstrNeg, false); - cmdnew(cmd, "not", cbInstrNot, false); - cmdnew(cmd, "or", cbInstrOr, false); - cmdnew(cmd, "rol", cbInstrRol, false); - cmdnew(cmd, "ror", cbInstrRor, false); - cmdnew(cmd, "shl", cbInstrShl, false); - cmdnew(cmd, "shr", cbInstrShr, false); - cmdnew(cmd, "sub", cbInstrSub, false); - cmdnew(cmd, "test", cbInstrTest, false); - cmdnew(cmd, "xor", cbInstrXor, false); + dbgcmdnew("cmp", cbInstrCmp, false); //compare + dbgcmdnew("gpa", cbInstrGpa, true); + dbgcmdnew("add", cbInstrAdd, false); + dbgcmdnew("and", cbInstrAnd, false); + dbgcmdnew("dec", cbInstrDec, false); + dbgcmdnew("div", cbInstrDiv, false); + dbgcmdnew("inc", cbInstrInc, false); + dbgcmdnew("mul", cbInstrMul, false); + dbgcmdnew("neg", cbInstrNeg, false); + dbgcmdnew("not", cbInstrNot, false); + dbgcmdnew("or", cbInstrOr, false); + dbgcmdnew("rol", cbInstrRol, false); + dbgcmdnew("ror", cbInstrRor, false); + dbgcmdnew("shl", cbInstrShl, false); + dbgcmdnew("shr", cbInstrShr, false); + dbgcmdnew("sub", cbInstrSub, false); + dbgcmdnew("test", cbInstrTest, false); + dbgcmdnew("xor", cbInstrXor, false); //script - cmdnew(cmd, "scriptload", cbScriptLoad, false); - cmdnew(cmd, "msg", cbScriptMsg, false); - cmdnew(cmd, "msgyn", cbScriptMsgyn, false); + dbgcmdnew("scriptload", cbScriptLoad, false); + dbgcmdnew("msg", cbScriptMsg, false); + dbgcmdnew("msgyn", cbScriptMsgyn, false); //data - cmdnew(cmd, "reffind\1findref\1ref", cbInstrRefFind, true); - cmdnew(cmd, "refstr\1strref", cbInstrRefStr, true); - cmdnew(cmd, "find", cbInstrFind, true); //find a pattern + dbgcmdnew("reffind\1findref\1ref", cbInstrRefFind, true); + dbgcmdnew("refstr\1strref", cbInstrRefStr, true); + dbgcmdnew("find", cbInstrFind, true); //find a pattern //undocumented - cmdnew(cmd, "bench", cbBenchmark, true); //benchmark test (readmem etc) - cmdnew(cmd, "memwrite", cbMemWrite, true); //memwrite test - cmdnew(cmd, "asm", cbAssemble, true); //assemble instruction - cmdnew(cmd, "dprintf", cbPrintf, false); //printf - cmdnew(cmd, "refinit", cbInstrRefinit, false); - cmdnew(cmd, "refadd", cbInstrRefadd, false); - cmdnew(cmd, "setstr\1strset", cbInstrSetstr, false); //set a string variable - cmdnew(cmd, "getstr\1strget", cbInstrGetstr, false); //get a string variable + dbgcmdnew("bench", cbBenchmark, true); //benchmark test (readmem etc) + dbgcmdnew("memwrite", cbMemWrite, true); //memwrite test + dbgcmdnew("asm", cbAssemble, true); //assemble instruction + dbgcmdnew("dprintf", cbPrintf, false); //printf + dbgcmdnew("refinit", cbInstrRefinit, false); + dbgcmdnew("refadd", cbInstrRefadd, false); + dbgcmdnew("setstr\1strset", cbInstrSetstr, false); //set a string variable + dbgcmdnew("getstr\1strget", cbInstrGetstr, false); //get a string variable } static bool cbCommandProvider(char* cmd, int maxlen) diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index f94b121c..cb37f955 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -62,7 +62,9 @@ SOURCES += \ Src/Gui/ExceptionRangeDialog.cpp \ Src/BasicView/RichTextPainter.cpp \ Src/Gui/TabBar.cpp \ - Src/Gui/TabWidget.cpp + Src/Gui/TabWidget.cpp \ + Src/BasicView/CommandHelpView.cpp \ + Src/BasicView/HistoryLineEdit.cpp HEADERS += \ @@ -105,7 +107,9 @@ HEADERS += \ Src/Gui/ExceptionRangeDialog.h \ Src/BasicView/RichTextPainter.h \ Src/Gui/TabBar.h \ - Src/Gui/TabWidget.h + Src/Gui/TabWidget.h \ + Src/BasicView/CommandHelpView.h \ + Src/BasicView/HistoryLineEdit.h INCLUDEPATH += \ @@ -130,7 +134,8 @@ FORMS += \ Src/BasicView/SymbolView.ui \ Src/BasicView/SearchListView.ui \ Src/Gui/SettingsDialog.ui \ - Src/Gui/ExceptionRangeDialog.ui + Src/Gui/ExceptionRangeDialog.ui \ + Src/BasicView/CommandHelpView.ui INCLUDEPATH += $$PWD/Src/Bridge diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp new file mode 100644 index 00000000..b37b4384 --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp @@ -0,0 +1,51 @@ +#include "HistoryLineEdit.h" + +HistoryLineEdit::HistoryLineEdit(QWidget *parent) : QLineEdit(parent) +{ + mCmdHistory.clear(); + mCmdIndex = -1; +} + +void HistoryLineEdit::addLineToHistory(QString parLine) +{ + mCmdHistory.prepend(parLine); + + if(mCmdHistory.size() > 32) + mCmdHistory.removeLast(); + + mCmdIndex = -1; +} + +void HistoryLineEdit::keyPressEvent(QKeyEvent* event) +{ + int wKey = event->key(); + + if(wKey == Qt::Key_Up || wKey == Qt::Key_Down) + { + if(wKey == Qt::Key_Up) + mCmdIndex++; + else if(wKey == Qt::Key_Down) + mCmdIndex--; + + mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex; + mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex; + + if(mCmdIndex == -1) + { + setText(""); + } + else + { + setText(mCmdHistory.at(mCmdIndex)); + } + } + + QLineEdit::keyPressEvent(event); +} + +void HistoryLineEdit::setFocus() +{ + mCmdIndex = -1; + QLineEdit::setFocus(); +} + diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h new file mode 100644 index 00000000..7ef9485a --- /dev/null +++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h @@ -0,0 +1,29 @@ +#ifndef HISTORYLINEEDIT_H +#define HISTORYLINEEDIT_H + +#include +#include +#include + +class HistoryLineEdit : public QLineEdit +{ + Q_OBJECT +public: + explicit HistoryLineEdit(QWidget *parent = 0); + void keyPressEvent(QKeyEvent* event); + void addLineToHistory(QString parLine); + void setFocus(); + +signals: + void keyPressed(int parKey); + +public slots: + + +private: + QList mCmdHistory; + int mCmdIndex; + +}; + +#endif // HISTORYLINEEDIT_H diff --git a/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp b/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp index 5507f7a3..9e753328 100644 --- a/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/InfoBox.cpp @@ -30,5 +30,16 @@ void InfoBox::setInfoLine(int line, QString text) void InfoBox::disasmSelectionChanged(int_t parVA) { + char label[MAX_LABEL_SIZE]=""; + QString info=""; + if(DbgGetLabelAt(parVA, SEG_DEFAULT, label)) + { + QString fullLabel="<"+QString(label)+">"; + char mod[MAX_MODULE_SIZE]=""; + if(DbgGetModuleAt(parVA, mod)) + fullLabel="<"+QString(mod)+"."+QString(label)+">"; + info=QString("%1").arg(parVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper() + " " + fullLabel; + } + setInfoLine(2, info); //setInfoLine(0, QString("%1").arg(parVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper()); } diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 751e3daf..61b113af 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -280,6 +280,12 @@ bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) while(!hasBridgeResult) //wait for thread completion Sleep(100); mBridgeMutex.unlock(); + if(selection->start > selection->end) //swap start and end + { + int_t temp=selection->end; + selection->end=selection->start; + selection->start=temp; + } return true; } @@ -321,6 +327,21 @@ bool Bridge::emitGetStrWindow(const QString title, QString* text) return bridgeResult; } +void Bridge::emitAutoCompleteAddCmd(const QString cmd) +{ + emit autoCompleteAddCmd(cmd); +} + +void Bridge::emitAutoCompleteDelCmd(const QString cmd) +{ + emit autoCompleteDelCmd(cmd); +} + +void Bridge::emitAutoCompleteClearAll() +{ + emit autoCompleteClearAll(); +} + /************************************************************************************ Static Functions ************************************************************************************/ @@ -640,6 +661,24 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa } break; + case GUI_AUTOCOMPLETE_ADDCMD: + { + Bridge::getBridge()->emitAutoCompleteAddCmd(QString((const char*)param1)); + } + break; + + case GUI_AUTOCOMPLETE_DELCMD: + { + Bridge::getBridge()->emitAutoCompleteDelCmd(QString((const char*)param1)); + } + break; + + case GUI_AUTOCOMPLETE_CLEARALL: + { + Bridge::getBridge()->emitAutoCompleteClearAll(); + } + break; + default: { } diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h index 4df8b0bd..2a5ccaff 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h @@ -70,6 +70,9 @@ public: bool emitSelectionGet(int hWindow, SELECTIONDATA* selection); bool emitSelectionSet(int hWindow, const SELECTIONDATA* selection); bool emitGetStrWindow(const QString title, QString* text); + void emitAutoCompleteAddCmd(const QString cmd); + void emitAutoCompleteDelCmd(const QString cmd); + void emitAutoCompleteClearAll(); //Public variables void* winId; @@ -122,6 +125,9 @@ signals: void selectionStackGet(SELECTIONDATA* selection); void selectionStackSet(const SELECTIONDATA* selection); void getStrWindow(const QString title, QString* text); + void autoCompleteAddCmd(const QString cmd); + void autoCompleteDelCmd(const QString cmd); + void autoCompleteClearAll(); private: QMutex mBridgeMutex; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 783dc02e..3a94a805 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -7,6 +7,8 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent) connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*))); connect(Bridge::getBridge(), SIGNAL(selectionDisasmSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); + + mGoto = 0; } void CPUDisassembly::mousePressEvent(QMouseEvent* event) @@ -631,10 +633,11 @@ void CPUDisassembly::gotoExpression() { if(!DbgIsDebugging()) return; - GotoDialog mGoto(this); - if(mGoto.exec()==QDialog::Accepted) + if(!mGoto) + mGoto = new GotoDialog(this); + if(mGoto->exec()==QDialog::Accepted) { - DbgCmdExec(QString().sprintf("disasm \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData()); + DbgCmdExec(QString().sprintf("disasm \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData()); } } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 1ae13df7..606cb107 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -87,6 +87,8 @@ private: QAction* mReferenceSelectedAddress; QAction* mSearchConstant; QAction* mSearchStrings; + + GotoDialog* mGoto; }; #endif // CPUDISASSEMBLY_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp index 52ee5884..b7799d90 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp @@ -9,6 +9,8 @@ CPUDump::CPUDump(QWidget *parent) : HexDump(parent) connect(Bridge::getBridge(), SIGNAL(selectionDumpSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); setupContextMenu(); + + mGoto = 0; } void CPUDump::setupContextMenu() @@ -168,12 +170,13 @@ void CPUDump::gotoExpressionSlot() { if(!DbgIsDebugging()) return; - GotoDialog mGoto(this); - mGoto.setWindowTitle("Enter expression to follow in Dump..."); - if(mGoto.exec()==QDialog::Accepted) + if(!mGoto) + mGoto = new GotoDialog(this); + mGoto->setWindowTitle("Enter expression to follow in Dump..."); + if(mGoto->exec()==QDialog::Accepted) { QString cmd; - DbgCmdExec(cmd.sprintf("dump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData()); + DbgCmdExec(cmd.sprintf("dump \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData()); } } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h index 80f07a0e..a617d3c1 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h @@ -87,6 +87,8 @@ private: QMenu* mSpecialMenu; QMenu* mCustomMenu; + + GotoDialog* mGoto; }; #endif // CPUDUMP_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp index 92af0299..f4eda7d4 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.cpp @@ -30,6 +30,8 @@ CPUStack::CPUStack(QWidget *parent) : HexDump(parent) connect(Bridge::getBridge(), SIGNAL(selectionStackSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); setupContextMenu(); + + mGoto = 0; } void CPUStack::setupContextMenu() @@ -187,14 +189,15 @@ void CPUStack::gotoExpressionSlot() return; uint_t size=0; uint_t base=DbgMemFindBaseAddr(mCsp, &size); - GotoDialog mGoto(this); - mGoto.validRangeStart=base; - mGoto.validRangeEnd=base+size; - mGoto.setWindowTitle("Enter expression to follow in Stack..."); - if(mGoto.exec()==QDialog::Accepted) + if(!mGoto) + mGoto = new GotoDialog(this); + mGoto->validRangeStart=base; + mGoto->validRangeEnd=base+size; + mGoto->setWindowTitle("Enter expression to follow in Stack..."); + if(mGoto->exec()==QDialog::Accepted) { QString cmd; - DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto.expressionText.toUtf8().constData()).toUtf8().constData()); + DbgCmdExec(cmd.sprintf("sdump \"%s\"", mGoto->expressionText.toUtf8().constData()).toUtf8().constData()); } } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUStack.h b/x64_dbg_gui/Project/Src/Gui/CPUStack.h index a6596d2a..fb4b5b40 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUStack.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUStack.h @@ -40,6 +40,8 @@ private: QAction* mFollowDisasm; QAction* mFollowDump; QAction* mFollowStack; + + GotoDialog* mGoto; }; #endif // CPUSTACK_H diff --git a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp index 0ad08b16..86afea24 100644 --- a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.cpp @@ -1,55 +1,40 @@ #include "CommandLineEdit.h" -CommandLineEdit::CommandLineEdit(QWidget *parent) : QLineEdit(parent) +CommandLineEdit::CommandLineEdit(QWidget *parent) : HistoryLineEdit(parent) { - mCmdHistory.clear(); - mCmdIndex = -1; + //Initialize QCompleter + mCompleter = new QCompleter(QStringList(), this); + mCompleter->setCaseSensitivity(Qt::CaseInsensitive); + mCompleter->setCompletionMode(QCompleter::PopupCompletion); + this->setCompleter(mCompleter); + + //Setup signals & slots + connect(Bridge::getBridge(), SIGNAL(autoCompleteAddCmd(QString)), this, SLOT(autoCompleteAddCmd(QString))); + connect(Bridge::getBridge(), SIGNAL(autoCompleteDelCmd(QString)), this, SLOT(autoCompleteDelCmd(QString))); + connect(Bridge::getBridge(), SIGNAL(autoCompleteClearAll()), this, SLOT(autoCompleteClearAll())); } - -void CommandLineEdit::addCmdToHistory(QString parCmd) +void CommandLineEdit::autoCompleteAddCmd(const QString cmd) { - mCmdHistory.prepend(parCmd); - - if(mCmdHistory.size() > 32) - mCmdHistory.removeLast(); - - mCmdIndex = -1; + QStringListModel* model = (QStringListModel*)(mCompleter->model()); + QStringList stringList = model->stringList(); + stringList << cmd.split(QChar('\1'), QString::SkipEmptyParts); + stringList.removeDuplicates(); + model->setStringList(stringList); } - -void CommandLineEdit::keyPressEvent(QKeyEvent* event) +void CommandLineEdit::autoCompleteDelCmd(const QString cmd) { - int wKey = event->key(); - - if(wKey == Qt::Key_Up || wKey == Qt::Key_Down) - { - if(wKey == Qt::Key_Up) - mCmdIndex++; - else if(wKey == Qt::Key_Down) - mCmdIndex--; - - mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex; - mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex; - - if(mCmdIndex == -1) - { - setText(""); - } - else - { - setText(mCmdHistory.at(mCmdIndex)); - } - } - - QLineEdit::keyPressEvent(event); + QStringListModel* model = (QStringListModel*)(mCompleter->model()); + QStringList stringList = model->stringList(); + QStringList deleteList = cmd.split(QChar('\1'), QString::SkipEmptyParts); + for(int i=0; isetStringList(stringList); } - - -void CommandLineEdit::setFocusToCmd() +void CommandLineEdit::autoCompleteClearAll() { - mCmdIndex = -1; - setFocus(); + QStringListModel* model = (QStringListModel*)(mCompleter->model()); + model->setStringList(QStringList()); } - diff --git a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h index de7b702c..44b7d824 100644 --- a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h +++ b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h @@ -1,29 +1,22 @@ -#ifndef LINEEDIT_H -#define LINEEDIT_H +#ifndef COMMANDLINEEDIT_H +#define COMMANDLINEEDIT_H -#include -#include -#include +#include "HistoryLineEdit.h" +#include "Bridge.h" -class CommandLineEdit : public QLineEdit +class CommandLineEdit : public HistoryLineEdit { Q_OBJECT public: explicit CommandLineEdit(QWidget *parent = 0); - void keyPressEvent(QKeyEvent* event); - void addCmdToHistory(QString parCmd); - void setFocusToCmd(); - -signals: - void keyPressed(int parKey); - -public slots: +public slots: + void autoCompleteAddCmd(const QString cmd); + void autoCompleteDelCmd(const QString cmd); + void autoCompleteClearAll(); private: - QList mCmdHistory; - int mCmdIndex; - + QCompleter* mCompleter; }; -#endif // LINEEDIT_H +#endif // COMMANDLINEEDIT_H diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp b/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp index 42e93176..e8d5a9b4 100644 --- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.cpp @@ -82,3 +82,11 @@ bool GotoDialog::IsValidMemoryRange(uint_t addr) { return ((!validRangeStart && !validRangeEnd) || (addr >= validRangeStart && addr < validRangeEnd)); } + +void GotoDialog::on_buttonOk_clicked() +{ + QString expression = ui->editExpression->text(); + ui->editExpression->addLineToHistory(expression); + ui->editExpression->setText(""); + expressionText = expression; +} diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h index 2ffddcfb..f82de572 100644 --- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h @@ -23,6 +23,8 @@ public: private slots: void on_editExpression_textChanged(const QString &arg1); + void on_buttonOk_clicked(); + private: Ui::GotoDialog *ui; bool IsValidMemoryRange(uint_t addr); diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui b/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui index d4405c77..77c1c9b6 100644 --- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui +++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.ui @@ -26,7 +26,7 @@ - + @@ -75,6 +75,13 @@ + + + HistoryLineEdit + QLineEdit +
HistoryLineEdit.h
+
+
editExpression buttonOk diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index fcd102ff..534e7b9b 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -271,7 +271,7 @@ void MainWindow::executeCommand() DbgCmdExec(wCmd.toUtf8().constData()); - mCmdLineEdit->addCmdToHistory(wCmd); + mCmdLineEdit->addLineToHistory(wCmd); mCmdLineEdit->setText(""); } @@ -288,7 +288,7 @@ void MainWindow::execStepInto() void MainWindow::setFocusToCommandBar() { - mCmdLineEdit->setFocusToCmd(); + mCmdLineEdit->setFocus(); } void MainWindow::execClose() From a339dd2d2f6395fdf99e02c9d934b7d725580115 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 21 May 2014 01:18:20 +0200 Subject: [PATCH 045/676] BRIDGE: added GuiScriptEnableHighlighting DBG: removed debug printf DBG: fixed manifest problems --- x64_dbg_bridge/bridgemain.cpp | 5 + x64_dbg_bridge/bridgemain.h | 4 +- x64_dbg_dbg/debugger.h | 1 + x64_dbg_dbg/plugin_loader.cpp | 1 - x64_dbg_dbg/simplescript.cpp | 1 + x64_dbg_exe/x64_dbg_exe.vcxproj | 6 + .../Project/Src/BasicView/ScriptView.cpp | 258 +++++++++--------- .../Project/Src/BasicView/ScriptView.h | 2 + x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 11 + x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 + 10 files changed, 166 insertions(+), 125 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index ea427f10..b44b0651 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -690,6 +690,11 @@ BRIDGE_IMPEXP int GuiScriptMsgyn(const char* message) return (int)(duint)_gui_sendmessage(GUI_SCRIPT_MSGYN, (void*)message, 0); } +BRIDGE_IMPEXP void GuiScriptEnableHighlighting(bool enable) +{ + _gui_sendmessage(GUI_SCRIPT_ENABLEHIGHLIGHTING, (void*)(duint)enable, 0); +} + BRIDGE_IMPEXP void GuiSymbolLogAdd(const char* message) { _gui_sendmessage(GUI_SYMBOL_LOG_ADD, (void*)message, 0); diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 15301402..2a1e1fa9 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -552,7 +552,8 @@ enum GUIMSG GUI_GETLINE_WINDOW, // param1=const char* title, param2=char* text GUI_AUTOCOMPLETE_ADDCMD, // param1=const char* cmd, param2=ununsed GUI_AUTOCOMPLETE_DELCMD, // param1=const char* cmd, param2=ununsed - GUI_AUTOCOMPLETE_CLEARALL // param1=ununsed, param2=unused + GUI_AUTOCOMPLETE_CLEARALL, // param1=ununsed, param2=unused + GUI_SCRIPT_ENABLEHIGHLIGHTING // param1=bool enable, param2=unused }; //GUI structures @@ -589,6 +590,7 @@ BRIDGE_IMPEXP void GuiScriptSetTitle(const char* title); BRIDGE_IMPEXP void GuiScriptSetInfoLine(int line, const char* info); BRIDGE_IMPEXP void GuiScriptMessage(const char* message); BRIDGE_IMPEXP int GuiScriptMsgyn(const char* message); +BRIDGE_IMPEXP void GuiScriptEnableHighlighting(bool enable); BRIDGE_IMPEXP void GuiSymbolLogAdd(const char* message); BRIDGE_IMPEXP void GuiSymbolLogClear(); BRIDGE_IMPEXP void GuiSymbolSetProgress(int percent); diff --git a/x64_dbg_dbg/debugger.h b/x64_dbg_dbg/debugger.h index 608dfdb4..d5312470 100644 --- a/x64_dbg_dbg/debugger.h +++ b/x64_dbg_dbg/debugger.h @@ -68,6 +68,7 @@ CMDRESULT cbDebugAttach(int argc, char* argv[]); CMDRESULT cbDebugDetach(int argc, char* argv[]); CMDRESULT cbDebugDump(int argc, char* argv[]); CMDRESULT cbDebugStackDump(int argc, char* argv[]); +CMDRESULT cbDebugContinue(int argc, char* argv[]); //variables extern PROCESS_INFORMATION* fdProcessInfo; diff --git a/x64_dbg_dbg/plugin_loader.cpp b/x64_dbg_dbg/plugin_loader.cpp index fc337bdd..403d265c 100644 --- a/x64_dbg_dbg/plugin_loader.cpp +++ b/x64_dbg_dbg/plugin_loader.cpp @@ -289,7 +289,6 @@ bool pluginmenuclear(int hMenu) void pluginmenucall(int hEntry) { - dprintf("pluginmenucall(%d)\n", hEntry); if(hEntry==-1) return; for(unsigned int i=0; i().swap(scriptbplist); //clear breakpoints std::vector().swap(scriptstack); //clear script stack diff --git a/x64_dbg_exe/x64_dbg_exe.vcxproj b/x64_dbg_exe/x64_dbg_exe.vcxproj index 01b36e61..2ad12bb5 100644 --- a/x64_dbg_exe/x64_dbg_exe.vcxproj +++ b/x64_dbg_exe/x64_dbg_exe.vcxproj @@ -47,11 +47,13 @@ $(SolutionDir)bin\x32\ $(Platform)\$(Configuration)\ x32_dbg + false
false $(SolutionDir)bin\x64\ x64_dbg + false @@ -68,6 +70,8 @@ true $(SolutionDir)bin\x32\x32_bridge.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(TargetDir)$(TargetName)_exe.pdb + + @@ -84,6 +88,8 @@ true $(SolutionDir)bin\x64\x64_bridge.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(TargetDir)$(TargetName)_exe.pdb + + diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index 4dd11ecb..a395805b 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -2,6 +2,7 @@ ScriptView::ScriptView(StdTable *parent) : StdTable(parent) { + mEnableSyntaxHighlighting=false; enableMultiSelection(false); int charwidth=QFontMetrics(this->font()).width(QChar(' ')); @@ -20,6 +21,7 @@ ScriptView::ScriptView(StdTable *parent) : StdTable(parent) connect(Bridge::getBridge(), SIGNAL(scriptSetInfoLine(int,QString)), this, SLOT(setInfoLine(int,QString))); connect(Bridge::getBridge(), SIGNAL(scriptMessage(QString)), this, SLOT(message(QString))); connect(Bridge::getBridge(), SIGNAL(scriptQuestion(QString)), this, SLOT(question(QString))); + connect(Bridge::getBridge(), SIGNAL(scriptEnableHighlighting(bool)), this, SLOT(enableHighlighting(bool))); setupContextMenu(); } @@ -67,38 +69,103 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case 1: //command { - //initialize - painter->save(); - int charwidth=QFontMetrics(this->font()).width(QChar(' ')); - int xadd=charwidth; //for testing - QList richText; - CustomRichText_t newRichText; - QString command=getCellContent(rowBase+rowOffset, col); + if(mEnableSyntaxHighlighting) + { + //initialize + painter->save(); + int charwidth=QFontMetrics(this->font()).width(QChar(' ')); + int xadd=charwidth; //for testing + QList richText; + CustomRichText_t newRichText; + QString command=getCellContent(rowBase+rowOffset, col); - //handle comments - int comment_idx=command.indexOf("//"); //find the index of the space - QString comment=""; - if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment - { - comment=command.right(command.length()-comment_idx); - if(command.at(comment_idx-1)==QChar(' ')) - command.truncate(comment_idx-1); - else - command.truncate(comment_idx); - } - - //setup the richText list - switch(linetype) - { - case linecommand: - { - if(isScriptCommand(command, "ret")) + //handle comments + int comment_idx=command.indexOf("//"); //find the index of the space + QString comment=""; + if(comment_idx!=-1 && command.at(0)!=QChar('/')) //there is a comment { - newRichText.flags=FlagBackground; - newRichText.textBackground=QColor("#00FFFF"); - newRichText.text="ret"; + comment=command.right(command.length()-comment_idx); + if(command.at(comment_idx-1)==QChar(' ')) + command.truncate(comment_idx-1); + else + command.truncate(comment_idx); + } + + //setup the richText list + switch(linetype) + { + case linecommand: + { + if(isScriptCommand(command, "ret")) + { + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor("#00FFFF"); + newRichText.text="ret"; + richText.push_back(newRichText); + QString remainder=command.right(command.length()-3); + if(remainder.length()) + { + newRichText.flags=FlagNone; + newRichText.text=remainder; + richText.push_back(newRichText); + } + } + else + { + newRichText.flags=FlagNone; + newRichText.text=command; + richText.push_back(newRichText); + } + } + break; + + case linebranch: + { + SCRIPTBRANCH branchinfo; + DbgScriptGetBranchInfo(line, &branchinfo); + //jumps + int i=command.indexOf(" "); //find the index of the space + switch(branchinfo.type) + { + case scriptjmp: //unconditional jumps + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor("#FFFF00"); + break; + + case scriptjnejnz: //conditional jumps + case scriptjejz: + case scriptjbjl: + case scriptjajg: + case scriptjbejle: + case scriptjaejge: + newRichText.flags=FlagAll; + newRichText.textBackground=QColor("#FFFF00"); + newRichText.textColor=QColor("#FF0000"); + break; + + case scriptcall: //calls + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor("#00FFFF"); + break; + + default: + newRichText.flags=FlagNone; + break; + } + newRichText.text=command.left(i); richText.push_back(newRichText); - QString remainder=command.right(command.length()-3); + //space + newRichText.flags=FlagNone; + newRichText.text=" "; + richText.push_back(newRichText); + //label + QString label=branchinfo.branchlabel; + newRichText.flags=FlagBackground; + newRichText.textBackground=QColor("#FFFF00"); + newRichText.text=label; + richText.push_back(newRichText); + //remainder + QString remainder=command.right(command.length()-command.indexOf(label)-label.length()); if(remainder.length()) { newRichText.flags=FlagNone; @@ -106,113 +173,53 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset richText.push_back(newRichText); } } - else + break; + + case linelabel: { - newRichText.flags=FlagNone; + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); + newRichText.text=command; + richText.push_back(newRichText); + painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2)); + } + break; + + case linecomment: + { + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); newRichText.text=command; richText.push_back(newRichText); } - } - break; + break; - case linebranch: - { - SCRIPTBRANCH branchinfo; - DbgScriptGetBranchInfo(line, &branchinfo); - //jumps - int i=command.indexOf(" "); //find the index of the space - switch(branchinfo.type) + case lineempty: { - case scriptjmp: //unconditional jumps - newRichText.flags=FlagBackground; - newRichText.textBackground=QColor("#FFFF00"); - break; - - case scriptjnejnz: //conditional jumps - case scriptjejz: - case scriptjbjl: - case scriptjajg: - case scriptjbejle: - case scriptjaejge: - newRichText.flags=FlagAll; - newRichText.textBackground=QColor("#FFFF00"); - newRichText.textColor=QColor("#FF0000"); - break; - - case scriptcall: //calls - newRichText.flags=FlagBackground; - newRichText.textBackground=QColor("#00FFFF"); - break; - - default: - newRichText.flags=FlagNone; + } break; } - newRichText.text=command.left(i); - richText.push_back(newRichText); - //space - newRichText.flags=FlagNone; - newRichText.text=" "; - richText.push_back(newRichText); - //label - QString label=branchinfo.branchlabel; - newRichText.flags=FlagBackground; - newRichText.textBackground=QColor("#FFFF00"); - newRichText.text=label; - richText.push_back(newRichText); - //remainder - QString remainder=command.right(command.length()-command.indexOf(label)-label.length()); - if(remainder.length()) + + //append the comment (when present) + if(comment.length()) { + CustomRichText_t newRichText; newRichText.flags=FlagNone; - newRichText.text=remainder; - richText.push_back(newRichText); + newRichText.text=" "; + richText.push_back(newRichText); //space + newRichText.flags=FlagColor; + newRichText.textColor=QColor("#808080"); + newRichText.text=comment; + richText.push_back(newRichText); //comment } - } - break; - case linelabel: - { - newRichText.flags=FlagColor; - newRichText.textColor=QColor("#808080"); - newRichText.text=command; - richText.push_back(newRichText); - painter->drawLine(QPoint(x+xadd+2, y+h-2), QPoint(x+w-4, y+h-2)); + //paint the rich text + RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth); + painter->restore(); + returnString=""; } - break; - - case linecomment: - { - newRichText.flags=FlagColor; - newRichText.textColor=QColor("#808080"); - newRichText.text=command; - richText.push_back(newRichText); - } - break; - - case lineempty: - { - } - break; - } - - //append the comment (when present) - if(comment.length()) - { - CustomRichText_t newRichText; - newRichText.flags=FlagNone; - newRichText.text=" "; - richText.push_back(newRichText); //space - newRichText.flags=FlagColor; - newRichText.textColor=QColor("#808080"); - newRichText.text=comment; - richText.push_back(newRichText); //comment - } - - //paint the rich text - RichTextPainter::paintRichText(painter, x+1, y, w, h, xadd, &richText, charwidth); - painter->restore(); - returnString=""; + else //no syntax highlighting + returnString=getCellContent(rowBase+rowOffset, col); } break; @@ -529,3 +536,8 @@ void ScriptView::question(QString message) else Bridge::getBridge()->BridgeSetResult(0); } + +void ScriptView::enableHighlighting(bool enable) +{ + mEnableSyntaxHighlighting=enable; +} diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h index a045bba6..96ea577d 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.h +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.h @@ -40,6 +40,7 @@ public slots: void message(QString message); void newIp(); void question(QString message); + void enableHighlighting(bool enable); private: //private functions @@ -49,6 +50,7 @@ private: //private variables int mIpLine; + bool mEnableSyntaxHighlighting; QMenu* mLoadMenu; QAction* mScriptLoad; diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 61b113af..af36154e 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -139,6 +139,11 @@ int Bridge::emitScriptQuestion(QString message) return bridgeResult; } +void Bridge::emitScriptEnableHighlighting(bool enable) +{ + emit scriptEnableHighlighting(enable); +} + void Bridge::emitUpdateSymbolList(int module_count, SYMBOLMODULEINFO* modules) { emit updateSymbolList(module_count, modules); @@ -475,6 +480,12 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa } break; + case GUI_SCRIPT_ENABLEHIGHLIGHTING: + { + Bridge::getBridge()->emitScriptEnableHighlighting((bool)(int_t)param1); + } + break; + case GUI_SYMBOL_UPDATE_MODULE_LIST: { Bridge::getBridge()->emitUpdateSymbolList((int)(int_t)param1, (SYMBOLMODULEINFO*)param2); diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h index 2a5ccaff..b4be3915 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h @@ -46,6 +46,7 @@ public: void emitScriptSetInfoLine(int line, QString info); void emitScriptMessage(QString message); int emitScriptQuestion(QString message); + void emitScriptEnableHighlighting(bool enable); void emitUpdateSymbolList(int module_count, SYMBOLMODULEINFO* modules); void emitAddMsgToSymbolLog(QString msg); void emitClearSymbolLog(); @@ -97,6 +98,7 @@ signals: void scriptSetInfoLine(int line, QString info); void scriptMessage(QString message); void scriptQuestion(QString message); + void scriptEnableHighlighting(bool enable); void updateSymbolList(int module_count, SYMBOLMODULEINFO* modules); void addMsgToSymbolLog(QString msg); void clearSymbolLog(); From eabf2e293e36c969fc5aa8f14c37e02baff176d9 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 21 May 2014 02:22:14 +0200 Subject: [PATCH 046/676] GUI: fixed bugs in GuiSelectionGet & GuiSelectionSet (thanks to ahmadmansoor for finding) --- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index af36154e..3766ad5f 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -648,13 +648,13 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa case GUI_SELECTION_GET: { - Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2); + return (void*)(int_t)Bridge::getBridge()->emitSelectionGet((int)(uint_t)param1, (SELECTIONDATA*)param2); } break; case GUI_SELECTION_SET: { - Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2); + return (void*)(int_t)Bridge::getBridge()->emitSelectionSet((int)(uint_t)param1, (const SELECTIONDATA*)param2); } break; From 4ef078d463cd8f24924a1aa30cafe3b1fe5b0e8a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sat, 24 May 2014 02:05:36 +0200 Subject: [PATCH 047/676] resolved issue #105 (commandline support) --- x64_dbg_dbg/x64_dbg.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index e71d4f1f..7c3406e4 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -18,6 +18,31 @@ static MESSAGE_STACK* gMsgStack=0; static COMMAND* command_list=0; +//Original code by Aurel from http://www.codeguru.com/cpp/w-p/win32/article.php/c1427/A-Simple-Win32-CommandLine-Parser.htm +static void commandlinefree(int argc, char** argv) +{ + for(int i=0; i1) //we have an argument + { + std::string str="init \""; + str+=argv[1]; + str+="\""; + DbgCmdExec(str.c_str()); + } + commandlinefree(argc, argv); return 0; } From 4d5a8f37491e3f59edbb541626f05828efe70e9d Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 26 May 2014 15:40:14 +0200 Subject: [PATCH 048/676] DBG: fixed a nasty bug in modbasefromname (thanks Artic!) DBG: added draft of loop display GUI: simple status bar API --- help/Special_Thanks.htm | 4 +- readme.txt | 1 + x64_dbg_bridge/bridgemain.cpp | 53 ++++------ x64_dbg_bridge/bridgemain.h | 21 +++- x64_dbg_dbg/_exports.cpp | 5 + x64_dbg_dbg/addrinfo.cpp | 101 ++++++++++++++++++-- x64_dbg_dbg/addrinfo.h | 4 + x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 11 +++ x64_dbg_gui/Project/Src/Bridge/Bridge.h | 2 + x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp | 3 + 10 files changed, 156 insertions(+), 49 deletions(-) diff --git a/help/Special_Thanks.htm b/help/Special_Thanks.htm index 6835ed0c..9afffc79 100644 --- a/help/Special_Thanks.htm +++ b/help/Special_Thanks.htm @@ -52,5 +52,7 @@ Rogers
  • TEAM DVT
  • +
    Artic
    +
  • Sorry if I forgot -you!
  • \ No newline at end of file +you! \ No newline at end of file diff --git a/readme.txt b/readme.txt index cae3be4f..f7eefb29 100644 --- a/readme.txt +++ b/readme.txt @@ -76,6 +76,7 @@ The icon is taken from VisualPharm (http://www.visualpharm.com/) - Tuts4You community - DMichael - TEAM DVT +- Artic - Sorry if I forgot you! >Lead developers: diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index b44b0651..84161158 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -417,41 +417,19 @@ BRIDGE_IMPEXP FUNCTYPE DbgGetFunctionTypeAt(duint addr) BRIDGE_IMPEXP LOOPTYPE DbgGetLoopTypeAt(duint addr, int depth) { - //NOTE: test code for 'function.exe' - /*if(depth==0) - { - if(addr==0x00401348) - return LOOP_BEGIN; - else if(addr==0x004013A8) - return LOOP_ENTRY; - else if(addr>0x00401348 && addr<0x004013B3) - return LOOP_MIDDLE; - else if(addr==0x004013B3) - return LOOP_END; - } - else if(depth==1) - { - if(addr==0x00401351) - return LOOP_BEGIN; - else if(addr==0x00401398) - return LOOP_ENTRY; - else if(addr>0x00401351 && addr<0x004013A3) - return LOOP_MIDDLE; - else if(addr==0x004013A3) - return LOOP_END; - } - else if(depth==2) - { - if(addr==0x0040135A) - return LOOP_BEGIN; - else if(addr==0x00401388) - return LOOP_ENTRY; - else if(addr>0x0040135A && addr<0x00401393) - return LOOP_MIDDLE; - else if(addr==0x00401393) - return LOOP_END; - }*/ - return LOOP_NONE; + ADDRINFO info; + memset(&info, 0, sizeof(info)); + info.flags=flagloop; + info.loop.depth=depth; + if(!_dbg_addrinfoget(addr, SEG_DEFAULT, &info)) + return LOOP_NONE; + duint start=info.loop.start; + duint end=info.loop.end; + if(addr==start) + return LOOP_BEGIN; + else if(addr==end) + return LOOP_END; + return LOOP_MIDDLE; } BRIDGE_IMPEXP duint DbgGetBranchDestination(duint addr) @@ -849,6 +827,11 @@ BRIDGE_IMPEXP void GuiAutoCompleteClearAll() _gui_sendmessage(GUI_AUTOCOMPLETE_CLEARALL, 0, 0); } +BRIDGE_IMPEXP void GuiAddStatusBarMessage(const char* msg) +{ + _gui_sendmessage(GUI_ADD_MSG_TO_STATUSBAR, (void*)msg, 0); +} + //Main BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 2a1e1fa9..dc7a345e 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -83,7 +83,8 @@ enum ADDRINFOFLAGS flaglabel=2, flagcomment=4, flagbookmark=8, - flagfunction=16 + flagfunction=16, + flagloop=32 }; enum BPXTYPE @@ -278,18 +279,26 @@ struct BPMAP struct FUNCTION { - duint start; - duint end; + duint start; //OUT + duint end; //OUT +}; + +struct LOOP +{ + int depth; //IN + duint start; //OUT + duint end; //OUT }; struct ADDRINFO { - int flags; //ADDRINFOFLAGS + int flags; //ADDRINFOFLAGS (IN) char module[MAX_MODULE_SIZE]; //module the address is in char label[MAX_LABEL_SIZE]; char comment[MAX_COMMENT_SIZE]; bool isbookmark; FUNCTION function; + LOOP loop; }; struct SYMBOLINFO @@ -553,7 +562,8 @@ enum GUIMSG GUI_AUTOCOMPLETE_ADDCMD, // param1=const char* cmd, param2=ununsed GUI_AUTOCOMPLETE_DELCMD, // param1=const char* cmd, param2=ununsed GUI_AUTOCOMPLETE_CLEARALL, // param1=ununsed, param2=unused - GUI_SCRIPT_ENABLEHIGHLIGHTING // param1=bool enable, param2=unused + GUI_SCRIPT_ENABLEHIGHLIGHTING, // param1=bool enable, param2=unused + GUI_ADD_MSG_TO_STATUSBAR // param1=const char* msg, param2=unused }; //GUI structures @@ -621,6 +631,7 @@ BRIDGE_IMPEXP bool GuiGetLineWindow(const char* title, char* text); BRIDGE_IMPEXP void GuiAutoCompleteAddCmd(const char* cmd); BRIDGE_IMPEXP void GuiAutoCompleteDelCmd(const char* cmd); BRIDGE_IMPEXP void GuiAutoCompleteClearAll(); +BRIDGE_IMPEXP void GuiAddStatusBarMessage(const char* msg); #ifdef __cplusplus } diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index 73886564..d922060c 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -377,6 +377,11 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoget(duint addr, SEGMENTREG segment, ADDR if(functionget(addr, &addrinfo->function.start, &addrinfo->function.end)) retval=true; } + if(addrinfo->flags&flagloop) + { + if(loopget(addrinfo->loop.depth, addr, &addrinfo->loop.start, &addrinfo->loop.end)) + retval=true; + } return retval; } diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 6ddbf82f..b54af351 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -33,6 +33,8 @@ void dbinit() dprintf("SQL Error: %s\n", sqllasterror()); if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS functions (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, start INT64 NOT NULL, end INT64 NOT NULL, manual BOOL NOT NULL)")) dprintf("SQL Error: %s\n", sqllasterror()); + if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS loops (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, start INT64 NOT NULL, end INT64 NOT NULL, parent INT, depth INT NOT NULL, manual BOOL NOT NULL)")) + dprintf("SQL Error: %s\n", sqllasterror()); dbsave(); bpenumall(0); //update breakpoint list GuiUpdateBreakpointsView(); @@ -165,16 +167,13 @@ uint modbasefromname(const char* modname) int modname_len=strlen(modname); if(modname_len>=MAX_MODULE_SIZE) return 0; - char newmodname[MAX_MODULE_SIZE]=""; - strcpy(newmodname, modname); - _strlwr(newmodname); for(int i=0; ihProcess, addr)) + return false; + char modname[MAX_MODULE_SIZE]=""; + char sql[deflen]=""; + uint modbase=0; + if(!modnamefromaddr(addr, modname, true)) + sprintf(sql, "SELECT start,end FROM loops WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", addr, addr, depth); + else + { + modbase=modbasefromaddr(addr); + uint rva=addr-modbase; + sprintf(sql, "SELECT start,end FROM loops WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", modname, rva, rva, depth); + } + sqlite3_stmt* stmt; + lock(WAITID_USERDB); + if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) + { + sqlite3_finalize(stmt); + unlock(WAITID_USERDB); + return false; + } + if(sqlite3_step(stmt)!=SQLITE_ROW) + { + sqlite3_finalize(stmt); + unlock(WAITID_USERDB); + return false; + } +#ifdef _WIN64 + uint dbstart=sqlite3_column_int64(stmt, 0)+modbase; //start + uint dbend=sqlite3_column_int64(stmt, 1)+modbase; //end +#else + uint dbstart=sqlite3_column_int(stmt, 0)+modbase; //addr + uint dbend=sqlite3_column_int(stmt, 1)+modbase; //end +#endif // _WIN64 + sqlite3_finalize(stmt); + if(start) + *start=dbstart; + if(end) + *end=dbend; + unlock(WAITID_USERDB); + return true; +} + +bool loopadd(uint start, uint end, bool manual) +{ + return false; +} + +//check if a loop overlaps a range, inside is not overlapping +bool loopoverlaps(int depth, uint start, uint end) +{ + char sql[deflen]=""; + char modname[MAX_MODULE_SIZE]=""; + + //check if the new loop fits in the old loop + if(!modnamefromaddr(start, modname, true)) + sprintf(sql, "SELECT manual FROM loops WHERE mod IS NULL AND start<%"fext"d AND end>%"fext"d AND depth=%d", start, end, depth); + else + { + uint modbase=modbasefromaddr(start); + sprintf(sql, "SELECT manual FROM loops WHERE mod='%s' AND start<%"fext"d AND end>%"fext"d AND depth=%d", modname, start-modbase, end-modbase, depth); + } + if(sqlhasresult(userdb, sql)) //new loop fits in the old loop + return loopoverlaps(depth+1, start, end); //check the next depth + + //check for loop overlaps + if(!modnamefromaddr(start, modname, true)) + sprintf(sql, "SELECT manual FROM loops WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", end, start, depth); + else + { + uint modbase=modbasefromaddr(start); + sprintf(sql, "SELECT manual FROM loops WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", modname, end-modbase, start-modbase, depth); + } + if(sqlhasresult(userdb, sql)) //loops overlap + return true; + return false; + +} + +bool loopdel(uint addr) +{ + return false; +} diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 9bed8304..f64f8a91 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -43,5 +43,9 @@ bool functionget(duint addr, duint* start, duint* end); bool functionoverlaps(uint start, uint end); bool functionadd(uint start, uint end, bool manual); bool functiondel(uint addr); +bool loopget(int depth, uint addr, uint* start, uint* end); +bool loopoverlaps(int depth, uint start, uint end); +bool loopadd(uint start, uint end, bool manual); +bool loopdel(uint addr); #endif // _ADDRINFO_H diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 3766ad5f..f7186517 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -261,6 +261,11 @@ void Bridge::emitMenuClearMenu(int hMenu) emit menuClearMenu(hMenu); } +void Bridge::emitAddMsgToStatusBar(QString msg) +{ + emit addMsgToStatusBar(msg); +} + bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) { if(!DbgIsDebugging()) @@ -690,6 +695,12 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa } break; + case GUI_ADD_MSG_TO_STATUSBAR: + { + Bridge::getBridge()->emitAddMsgToStatusBar(QString((const char*)param1)); + } + break; + default: { } diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.h b/x64_dbg_gui/Project/Src/Bridge/Bridge.h index b4be3915..0e5ccc7e 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.h +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.h @@ -74,6 +74,7 @@ public: void emitAutoCompleteAddCmd(const QString cmd); void emitAutoCompleteDelCmd(const QString cmd); void emitAutoCompleteClearAll(); + void emitAddMsgToStatusBar(QString msg); //Public variables void* winId; @@ -130,6 +131,7 @@ signals: void autoCompleteAddCmd(const QString cmd); void autoCompleteDelCmd(const QString cmd); void autoCompleteClearAll(); + void addMsgToStatusBar(QString msg); private: QMutex mBridgeMutex; diff --git a/x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp b/x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp index 01e70d78..a18f1e18 100644 --- a/x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp +++ b/x64_dbg_gui/Project/Src/Gui/StatusLabel.cpp @@ -14,7 +14,10 @@ StatusLabel::StatusLabel(QStatusBar* parent) : QLabel(parent) connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); } else //last log message + { connect(Bridge::getBridge(), SIGNAL(addMsgToLog(QString)), this, SLOT(logUpdate(QString))); + connect(Bridge::getBridge(), SIGNAL(addMsgToStatusBar(QString)), this, SLOT(logUpdate(QString))); + } } void StatusLabel::debugStateChangedSlot(DBGSTATE state) From f6ebe364391af88bef82a38836b34462317113db Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 26 May 2014 16:40:17 +0200 Subject: [PATCH 049/676] DBG: resolved issue #116 (bpdll command) --- x64_dbg_dbg/_exports.cpp | 12 +++--- x64_dbg_dbg/debugger.cpp | 89 +++++++++++++++++++++++++++++++++++----- x64_dbg_dbg/debugger.h | 2 + x64_dbg_dbg/x64_dbg.cpp | 3 ++ 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index d922060c..3bf1ccc8 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -605,16 +605,14 @@ extern "C" DLL_EXPORT int _dbg_getbplist(BPXTYPE type, BPMAP* bpmap) if(memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr)) curBp.active=true; strcpy(curBp.mod, list[i].mod); - int len=strlen(curBp.mod); - while(curBp.mod[len]!='.' and len) - len--; - if(len) - curBp.mod[len]=0; strcpy(curBp.name, list[i].name); curBp.singleshoot=list[i].singleshoot; curBp.slot=slot; - bridgeList.push_back(curBp); - retcount++; + if(curBp.active) + { + bridgeList.push_back(curBp); + retcount++; + } } if(!retcount) { diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 0dd2568a..e9e90d30 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -31,6 +31,7 @@ static bool isDetachedByUser=false; static bool bScyllaLoaded=false; static bool bIsAttached=false; static bool bSkipExceptions=false; +static bool bBreakOnNextDll=false; static int ecount=0; static std::vector ignoredExceptionRange; @@ -318,6 +319,11 @@ static void cbMemoryBreakpoint(void* ExceptionAddress) wait(WAITID_RUN); } +static void cbLibrarianBreakpoint(void* lpData) +{ + bBreakOnNextDll=true; +} + static BOOL CALLBACK SymRegisterCallbackProc64(HANDLE hProcess, ULONG ActionCode, ULONG64 CallbackData, ULONG64 UserContext) { UNREFERENCED_PARAMETER(hProcess); @@ -530,7 +536,7 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo) { pDebuggedBase=(uint)CreateProcessInfo->lpBaseOfImage; //debugged base = executable char command[256]=""; - + if(settingboolget("Events", "TlsCallbacks")) { DWORD NumberOfCallBacks=0; @@ -590,19 +596,19 @@ static void cbCreateThread(CREATE_THREAD_DEBUG_INFO* CreateThread) { threadcreate(CreateThread); //update thread list DWORD dwThreadId=((DEBUG_EVENT*)GetDebugData())->dwThreadId; - + if(settingboolget("Events", "ThreadEntry")) { char command[256]=""; sprintf(command, "bp "fhex",\"Thread %X\",ss", CreateThread->lpStartAddress, dwThreadId); cmddirectexec(dbggetcommandlist(), command); } - + PLUG_CB_CREATETHREAD callbackInfo; callbackInfo.CreateThread=CreateThread; callbackInfo.dwThreadId=dwThreadId; plugincbcall(CB_CREATETHREAD, &callbackInfo); - + dprintf("Thread %X created\n", dwThreadId); if(settingboolget("Events", "ThreadStart")) @@ -657,7 +663,7 @@ static void cbSystemBreakpoint(void* ExceptionData) PLUG_CB_SYSTEMBREAKPOINT callbackInfo; callbackInfo.reserved=0; plugincbcall(CB_SYSTEMBREAKPOINT, &callbackInfo); - + if(settingboolget("Events", "SystemBreakpoint")) { //update GUI @@ -679,7 +685,6 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) char DLLDebugFileName[deflen]=""; if(!GetFileNameFromHandle(LoadDll->hFile, DLLDebugFileName)) strcpy(DLLDebugFileName, "??? (GetFileNameFromHandle failed!)"); - dprintf("DLL Loaded: "fhex" %s\n", base, DLLDebugFileName); SymLoadModuleEx(fdProcessInfo->hProcess, LoadDll->hFile, DLLDebugFileName, 0, (DWORD64)base, 0, 0, 0); IMAGEHLP_MODULE64 modInfo; @@ -705,7 +710,7 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) } GuiUpdateBreakpointsView(); - if(settingboolget("Events", "DllEntry") && !bAlreadySetEntry) + if((bBreakOnNextDll || settingboolget("Events", "DllEntry")) && !bAlreadySetEntry) { uint oep=GetPE32Data(DLLDebugFileName, 0, UE_OEP); if(oep) @@ -716,6 +721,8 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) } } + dprintf("DLL Loaded: "fhex" %s\n", base, DLLDebugFileName); + //plugin callback PLUG_CB_LOADDLL callbackInfo; callbackInfo.LoadDll=LoadDll; @@ -723,8 +730,9 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) callbackInfo.modname=modname; plugincbcall(CB_LOADDLL, &callbackInfo); - if(settingboolget("Events", "DllLoad")) + if(bBreakOnNextDll || settingboolget("Events", "DllLoad")) { + bBreakOnNextDll=false; //update GUI DebugUpdateGui(GetContextData(UE_CIP), true); GuiSetDebugState(paused); @@ -751,8 +759,9 @@ static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll) SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)base); dprintf("DLL Unloaded: "fhex" %s\n", base, modname); - if(settingboolget("Events", "DllÙnload")) + if(bBreakOnNextDll || settingboolget("Events", "DllÙnload")) { + bBreakOnNextDll=false; //update GUI DebugUpdateGui(GetContextData(UE_CIP), true); GuiSetDebugState(paused); @@ -822,7 +831,7 @@ static void cbOutputDebugString(OUTPUT_DEBUG_STRING_INFO* DebugString) efree(DebugTextEscaped, "cbOutputDebugString:DebugTextEscaped"); } efree(DebugText, "cbOutputDebugString:DebugText"); - } + } if(settingboolget("Events", "DebugStrings")) { @@ -919,6 +928,7 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter) //initialize bIsAttached=false; bSkipExceptions=false; + bBreakOnNextDll=false; INIT_STRUCT* init=(INIT_STRUCT*)lpParameter; bFileIsDll=IsFileDLL(init->exe, 0); pDebuggedEntry=GetPE32Data(init->exe, 0, UE_OEP); @@ -2039,3 +2049,62 @@ CMDRESULT cbDebugStackDump(int argc, char* argv[]) dputs("invalid stack address!"); return STATUS_CONTINUE; } + +CMDRESULT cbDebugContinue(int argc, char* argv[]) +{ + if(argc<2) + { + SetNextDbgContinueStatus(DBG_CONTINUE); + dputs("exception will be swallowed"); + } + else + { + SetNextDbgContinueStatus(DBG_EXCEPTION_NOT_HANDLED); + dputs("exception will be thrown in the program"); + } + return STATUS_CONTINUE; +} + +CMDRESULT cbBpDll(int argc, char* argv[]) +{ + if(argc<2) + { + dputs("not enough arguments!"); + return STATUS_ERROR; + } + DWORD type=UE_ON_LIB_ALL; + if(argc>2) + { + switch(*argv[2]) + { + case 'l': + type=UE_ON_LIB_LOAD; + break; + case 'u': + type=UE_ON_LIB_UNLOAD; + break; + } + } + bool singleshoot=true; + if(argc>3) + singleshoot=false; + LibrarianSetBreakPoint(argv[1], type, singleshoot, (void*)cbLibrarianBreakpoint); + dprintf("dll breakpoint set on \"%s\"!\n", argv[1]); + return STATUS_CONTINUE; +} + +CMDRESULT cbBcDll(int argc, char* argv[]) +{ + if(argc<2) + { + dputs("not enough arguments"); + return STATUS_ERROR; + } + if(!LibrarianRemoveBreakPoint(argv[1], UE_ON_LIB_ALL)) + { + dputs("failed to remove dll breakpoint..."); + return STATUS_ERROR; + } + dputs("dll breakpoint removed!"); + return STATUS_CONTINUE; +} diff --git a/x64_dbg_dbg/debugger.h b/x64_dbg_dbg/debugger.h index d5312470..4a9b8216 100644 --- a/x64_dbg_dbg/debugger.h +++ b/x64_dbg_dbg/debugger.h @@ -69,6 +69,8 @@ CMDRESULT cbDebugDetach(int argc, char* argv[]); CMDRESULT cbDebugDump(int argc, char* argv[]); CMDRESULT cbDebugStackDump(int argc, char* argv[]); CMDRESULT cbDebugContinue(int argc, char* argv[]); +CMDRESULT cbBpDll(int argc, char* argv[]); +CMDRESULT cbBcDll(int argc, char* argv[]); //variables extern PROCESS_INFORMATION* fdProcessInfo; diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 7c3406e4..0895c805 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -176,6 +176,9 @@ static void registercommands() dbgcmdnew("refadd", cbInstrRefadd, false); dbgcmdnew("setstr\1strset", cbInstrSetstr, false); //set a string variable dbgcmdnew("getstr\1strget", cbInstrGetstr, false); //get a string variable + dbgcmdnew("DebugContinue\1con", cbDebugContinue, true); //set continue status + dbgcmdnew("bpdll", cbBpDll, true); //set dll breakpoint + dbgcmdnew("bcdll", cbBcDll, true); //remove dll breakpoint } static bool cbCommandProvider(char* cmd, int maxlen) From edaa9eaffe2685f273bd23307fb2281243abad2b Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 26 May 2014 21:10:04 +0200 Subject: [PATCH 050/676] DBG: updated DeviceNameResolver (fixes a bug with changed directory names & GetMappedFileNameA) --- .../DeviceNameResolver/DeviceNameResolver.h | 6 +++++ .../DeviceNameResolver_x64.a | Bin 3022 -> 6134 bytes .../DeviceNameResolver_x64.lib | Bin 2186 -> 3174 bytes .../DeviceNameResolver_x86.a | Bin 3010 -> 6106 bytes .../DeviceNameResolver_x86.lib | Bin 2186 -> 3190 bytes x64_dbg_dbg/_global.cpp | 24 +----------------- 6 files changed, 7 insertions(+), 23 deletions(-) diff --git a/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h b/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h index dd6dd6af..70e584ae 100644 --- a/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h +++ b/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h @@ -1,6 +1,8 @@ #ifndef _DEVICENAMERESOLVER_H #define _DEVICENAMERESOLVER_H +#include + #ifdef __cplusplus extern "C" { @@ -8,6 +10,10 @@ extern "C" __declspec(dllexport) bool DevicePathToPathW(const wchar_t* szDevicePath, wchar_t* szPath, size_t nSize); __declspec(dllexport) bool DevicePathToPathA(const char* szDevicePath, char* szPath, size_t nSize); +__declspec(dllexport) bool DevicePathFromFileHandleW(HANDLE hFile, wchar_t* szDevicePath, size_t nSize); +__declspec(dllexport) bool DevicePathFromFileHandleA(HANDLE hFile, char* szDevicePath, size_t nSize); +__declspec(dllexport) bool PathFromFileHandleW(HANDLE hFile, wchar_t* szPath, size_t nSize); +__declspec(dllexport) bool PathFromFileHandleA(HANDLE hFile, char* szPath, size_t nSize); #ifdef __cplusplus } diff --git a/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver_x64.a b/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver_x64.a index d9c5f8c11c047c1cccc24e9b3bf8fd1da4de5a10..0d807fe58addbd227dd44c5eee40c4887b6a53c7 100644 GIT binary patch literal 6134 zcmeHL-D=c86h6DzT3zZ7(rPb6Q_wqElXf>&D5Wb>s-P4RiXdduChM-V%Q$P7}^9X>B+pqXBqXW$7w*A7} zYj1gPoUZrQ8}vJS-mdM~?H-{e3yQ}Svx90TRj<*4}-R|z#s-C2; zo{FvmpAlX2u1}@7bJ9QT5qC}cBaeF4>HTRv$+6;hu7lg{Zu^yfnA)_QnucLnmabdI zLYPzc@Cv3C;Bf)7##$3l@x6UaaHi?7-l({a?_{C?R$%?4vN;%xfWZOb+H}K*Re?oP zK?&z2+X@&0R}+51O{L?W3fwFXWi7>Y#Pf|#;cO<?E7Q4-6)~MpbO4 zbxA7R2v|jx4n|IuMOBm(gGNxzN!BJZL zftD#6RpZp+rZld^&V&~4sBsAve^KK?EuO~bJF6CJiti`Vuk*@adLNNRI$YrnRux2+o-}Tj_U@~33HE+d<3jDdhb!Q$+FOv=8~+=$ajsc>pX2~7(%@z8 yU}X{BV;!+|_{sTy!HoVqI|}2H)f8+_+H_6+7pzXt?fKT`zhQM!qvNd4*6Kgtyj0%+ delta 241 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 Date: Thu, 29 May 2014 00:36:45 +0200 Subject: [PATCH 051/676] DBG: function + loop (draft) API --- x64_dbg_bridge/_global.cpp | 1 - x64_dbg_bridge/_global.h | 2 - x64_dbg_bridge/bridgemain.cpp | 109 +++++++++++++++++++++++++++------- x64_dbg_bridge/bridgemain.h | 29 ++++++++- x64_dbg_dbg/_exports.cpp | 56 +++++++++++++++++ x64_dbg_dbg/addrinfo.cpp | 2 +- x64_dbg_dbg/addrinfo.h | 2 +- 7 files changed, 170 insertions(+), 31 deletions(-) diff --git a/x64_dbg_bridge/_global.cpp b/x64_dbg_bridge/_global.cpp index 96b23878..344a009f 100644 --- a/x64_dbg_bridge/_global.cpp +++ b/x64_dbg_bridge/_global.cpp @@ -28,5 +28,4 @@ DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr; DBGGETBPLIST _dbg_getbplist; DBGDBGCMDEXECDIRECT _dbg_dbgcmddirectexec; DBGGETBRANCHDESTINATION _dbg_getbranchdestination; -DBGFUNCTIONOVERLAPS _dbg_functionoverlaps; DBGSENDMESSAGE _dbg_sendmessage; diff --git a/x64_dbg_bridge/_global.h b/x64_dbg_bridge/_global.h index 94fbddbc..1a964680 100644 --- a/x64_dbg_bridge/_global.h +++ b/x64_dbg_bridge/_global.h @@ -36,7 +36,6 @@ typedef bool (*DBGMEMISVALIDREADPTR)(duint addr); typedef int (*DBGGETBPLIST)(BPXTYPE type, BPMAP* bplist); typedef bool (*DBGDBGCMDEXECDIRECT)(const char* cmd); typedef duint (*DBGGETBRANCHDESTINATION)(duint addr); -typedef bool (*DBGFUNCTIONOVERLAPS)(duint start, duint end); typedef duint (*DBGSENDMESSAGE)(DBGMSG type, void* param1, void* param2); //DBG functions @@ -59,7 +58,6 @@ extern DBGMEMISVALIDREADPTR _dbg_memisvalidreadptr; extern DBGGETBPLIST _dbg_getbplist; extern DBGDBGCMDEXECDIRECT _dbg_dbgcmddirectexec; extern DBGGETBRANCHDESTINATION _dbg_getbranchdestination; -extern DBGFUNCTIONOVERLAPS _dbg_functionoverlaps; extern DBGSENDMESSAGE _dbg_sendmessage; #endif // _GLOBAL_H diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 84161158..746d15a1 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -120,10 +120,6 @@ BRIDGE_IMPEXP const char* BridgeInit() _dbg_getbranchdestination=(DBGGETBRANCHDESTINATION)GetProcAddress(hInstDbg, "_dbg_getbranchdestination"); if(!_dbg_getbranchdestination) return "Export \"_dbg_getbranchdestination\" could not be found!"; - //_dbg_functionoverlaps - _dbg_functionoverlaps=(DBGFUNCTIONOVERLAPS)GetProcAddress(hInstDbg, "_dbg_functionoverlaps"); - if(!_dbg_functionoverlaps) - return "Export \"_dbg_functionoverlaps\" could not be found!"; //_dbg_sendmessage _dbg_sendmessage=(DBGSENDMESSAGE)GetProcAddress(hInstDbg, "_dbg_sendmessage"); if(!_dbg_sendmessage) @@ -437,25 +433,6 @@ BRIDGE_IMPEXP duint DbgGetBranchDestination(duint addr) return _dbg_getbranchdestination(addr); } -BRIDGE_IMPEXP bool DbgFunctionOverlaps(duint start, duint end) -{ - return _dbg_functionoverlaps(start, end); -} - -BRIDGE_IMPEXP bool DbgFunctionGet(duint addr, duint* start, duint* end) -{ - ADDRINFO info; - memset(&info, 0, sizeof(info)); - info.flags=flagfunction; - if(!_dbg_addrinfoget(addr, SEG_DEFAULT, &info)) - return false; - if(start) - *start=info.function.start; - if(end) - *end=info.function.end; - return true; -} - BRIDGE_IMPEXP void DbgScriptLoad(const char* filename) { _dbg_sendmessage(DBG_SCRIPT_LOAD, (void*)filename, 0); @@ -568,6 +545,92 @@ BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry) _dbg_sendmessage(DBG_MENU_ENTRY_CLICKED, (void*)(duint)hEntry, 0); } + +BRIDGE_IMPEXP bool DbgFunctionGet(duint addr, duint* start, duint* end) +{ + FUNCTION_LOOP_INFO info; + info.addr=addr; + if(!_dbg_sendmessage(DBG_FUNCTION_GET, &info, 0)) + return false; + *start=info.start; + *end=info.end; + return true; +} + +BRIDGE_IMPEXP bool DbgFunctionOverlaps(duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start=start; + info.end=end; + if(!_dbg_sendmessage(DBG_FUNCTION_OVERLAPS, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgFunctionAdd(duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start=start; + info.end=end; + info.manual=false; + if(!_dbg_sendmessage(DBG_FUNCTION_ADD, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgFunctionDel(duint addr) +{ + FUNCTION_LOOP_INFO info; + info.addr=addr; + if(!_dbg_sendmessage(DBG_FUNCTION_DEL, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgLoopGet(int depth, duint addr, duint* start, duint* end) +{ + FUNCTION_LOOP_INFO info; + info.addr=addr; + info.depth=depth; + if(!_dbg_sendmessage(DBG_LOOP_GET, &info, 0)) + return false; + *start=info.start; + *end=info.end; + return true; +} + +BRIDGE_IMPEXP bool DbgLoopOverlaps(int depth, duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start=start; + info.end=end; + info.depth=depth; + if(!_dbg_sendmessage(DBG_LOOP_OVERLAPS, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end) +{ + FUNCTION_LOOP_INFO info; + info.start=start; + info.end=end; + info.manual=false; + if(!_dbg_sendmessage(DBG_LOOP_ADD, &info, 0)) + return false; + return true; +} + +BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr) +{ + FUNCTION_LOOP_INFO info; + info.addr=addr; + info.depth; + if(!_dbg_sendmessage(DBG_LOOP_DEL, &info, 0)) + return false; + return true; +} + //GUI BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index dc7a345e..20cb6f9f 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -134,7 +134,15 @@ enum DBGMSG DBG_GET_THREAD_LIST, // param1=THREADALLINFO* list, param2=unused DBG_SETTINGS_UPDATED, // param1=unused, param2=unused DBG_DISASM_FAST_AT, // param1=duint addr, param2=BASIC_INSTRUCTION_INFO* basicinfo - DBG_MENU_ENTRY_CLICKED // param1=int hEntry, param2=unused + DBG_MENU_ENTRY_CLICKED, // param1=int hEntry, param2=unused + DBG_FUNCTION_GET, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_FUNCTION_OVERLAPS, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_FUNCTION_ADD, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_FUNCTION_DEL, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_LOOP_GET, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_LOOP_OVERLAPS, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_LOOP_ADD, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_LOOP_DEL // param1=FUNCTION_LOOP_INFO* info, param2=unused }; enum SCRIPTLINETYPE @@ -451,6 +459,15 @@ struct SCRIPTBRANCH char branchlabel[256]; }; +struct FUNCTION_LOOP_INFO +{ + duint addr; + duint start; + duint end; + bool manual; + int depth; +}; + //Debugger functions BRIDGE_IMPEXP const char* DbgInit(); BRIDGE_IMPEXP bool DbgMemRead(duint va, unsigned char* dest, duint size); @@ -479,8 +496,6 @@ BRIDGE_IMPEXP int DbgGetBpList(BPXTYPE type, BPMAP* list); BRIDGE_IMPEXP FUNCTYPE DbgGetFunctionTypeAt(duint addr); BRIDGE_IMPEXP LOOPTYPE DbgGetLoopTypeAt(duint addr, int depth); BRIDGE_IMPEXP duint DbgGetBranchDestination(duint addr); -BRIDGE_IMPEXP bool DbgFunctionOverlaps(duint start, duint end); -BRIDGE_IMPEXP bool DbgFunctionGet(duint addr, duint* start, duint* end); BRIDGE_IMPEXP void DbgScriptLoad(const char* filename); BRIDGE_IMPEXP void DbgScriptUnload(); BRIDGE_IMPEXP void DbgScriptRun(int destline); @@ -501,6 +516,14 @@ BRIDGE_IMPEXP void DbgGetThreadList(THREADLIST* list); BRIDGE_IMPEXP void DbgSettingsUpdated(); BRIDGE_IMPEXP void DbgDisasmFastAt(duint addr, BASIC_INSTRUCTION_INFO* basicinfo); BRIDGE_IMPEXP void DbgMenuEntryClicked(int hEntry); +BRIDGE_IMPEXP bool DbgFunctionGet(duint addr, duint* start, duint* end); +BRIDGE_IMPEXP bool DbgFunctionOverlaps(duint start, duint end); +BRIDGE_IMPEXP bool DbgFunctionAdd(duint start, duint end); +BRIDGE_IMPEXP bool DbgFunctionDel(duint addr); +BRIDGE_IMPEXP bool DbgLoopGet(int depth, duint addr, duint* start, duint* end); +BRIDGE_IMPEXP bool DbgLoopOverlaps(int depth, duint start, duint end); +BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end); +BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr); //Gui defines #define GUI_PLUGIN_MENU 0 diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index 3bf1ccc8..f861ac23 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -843,6 +843,62 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par pluginmenucall(hEntry); } break; + + case DBG_FUNCTION_GET: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)functionget(info->addr, &info->start, &info->end); + } + break; + + case DBG_FUNCTION_OVERLAPS: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)functionoverlaps(info->start, info->end); + } + break; + + case DBG_FUNCTION_ADD: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)functionadd(info->start, info->end, info->manual); + } + break; + + case DBG_FUNCTION_DEL: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)functiondel(info->addr); + } + break; + + case DBG_LOOP_GET: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)loopget(info->depth, info->addr, &info->start, &info->end); + } + break; + + case DBG_LOOP_OVERLAPS: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)loopoverlaps(info->depth, info->start, info->end); + } + break; + + case DBG_LOOP_ADD: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)loopadd(info->start, info->end, info->manual); + } + break; + + case DBG_LOOP_DEL: + { + FUNCTION_LOOP_INFO* info=(FUNCTION_LOOP_INFO*)param1; + return (uint)loopdel(info->depth, info->addr); + } + break; } return 0; } diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index b54af351..e96fb908 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -730,7 +730,7 @@ bool loopoverlaps(int depth, uint start, uint end) } -bool loopdel(uint addr) +bool loopdel(int depth, uint addr) { return false; } diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index f64f8a91..5f72515a 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -46,6 +46,6 @@ bool functiondel(uint addr); bool loopget(int depth, uint addr, uint* start, uint* end); bool loopoverlaps(int depth, uint start, uint end); bool loopadd(uint start, uint end, bool manual); -bool loopdel(uint addr); +bool loopdel(int depth, uint addr); #endif // _ADDRINFO_H From 46cf431007c92d998d10d2fd746886812e7296c5 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 29 May 2014 03:21:25 +0200 Subject: [PATCH 052/676] GUI: fixed a bug with the functions --- x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 3a94a805..364a50e5 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -100,7 +100,7 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) mToggleFunction->setText("Add function"); wMenu->addAction(mToggleFunction); } - else if(DbgGetFunctionTypeAt(selection_start) != FUNC_NONE) + else if(DbgFunctionOverlaps(selection_start, selection_end)) { mToggleFunction->setText("Delete function"); wMenu->addAction(mToggleFunction); @@ -565,8 +565,13 @@ void CPUDisassembly::toggleFunction() QString cmd = "functionadd " + start_text + "," + end_text; DbgCmdExec(cmd.toUtf8().constData()); } - else if(DbgFunctionGet(start, &function_start, &function_end)) + else { + for(int_t i=start; i<=end; i++) + { + if(DbgFunctionGet(i, &function_start, &function_end)) + break; + } QString start_text=QString("%1").arg(function_start, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); QString end_text=QString("%1").arg(function_end, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); char labeltext[MAX_LABEL_SIZE]=""; From 49bfaebedd9c81a96e7957d8f826a1e5cb117004 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Mon, 2 Jun 2014 10:22:09 +0200 Subject: [PATCH 053/676] DBG: added DbgIsRunLocked BRIDGE: added BridgeGetDbgVersion GUI: use BridgeGetDbgVersion --- x64_dbg_bridge/bridgemain.cpp | 12 ++++++++++++ x64_dbg_bridge/bridgemain.h | 5 ++++- x64_dbg_dbg/_exports.cpp | 6 ++++++ x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 746d15a1..4fbba721 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -203,6 +203,11 @@ BRIDGE_IMPEXP bool BridgeSettingSetUint(const char* section, const char* key, du return BridgeSettingSet(section, key, newvalue); } +BRIDGE_IMPEXP int BridgeGetDbgVersion() +{ + return DBG_VERSION; +} + //Debugger BRIDGE_IMPEXP bool DbgMemRead(duint va, unsigned char* dest, duint size) { @@ -631,6 +636,13 @@ BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr) return true; } +BRIDGE_IMPEXP bool DbgIsRunLocked() +{ + if(_dbg_sendmessage(DBG_IS_RUN_LOCKED, 0, 0)) + return true; + return false; +} + //GUI BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 20cb6f9f..b7f6c4fc 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -44,6 +44,7 @@ BRIDGE_IMPEXP bool BridgeSettingGet(const char* section, const char* key, char* BRIDGE_IMPEXP bool BridgeSettingGetUint(const char* section, const char* key, duint* value); BRIDGE_IMPEXP bool BridgeSettingSet(const char* section, const char* key, const char* value); BRIDGE_IMPEXP bool BridgeSettingSetUint(const char* section, const char* key, duint value); +BRIDGE_IMPEXP int BridgeGetDbgVersion(); //Debugger defines #define MAX_LABEL_SIZE 256 @@ -142,7 +143,8 @@ enum DBGMSG DBG_LOOP_GET, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_LOOP_OVERLAPS, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_LOOP_ADD, // param1=FUNCTION_LOOP_INFO* info, param2=unused - DBG_LOOP_DEL // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_LOOP_DEL, // param1=FUNCTION_LOOP_INFO* info, param2=unused + DBG_IS_RUN_LOCKED // param1=unused, param2=unused }; enum SCRIPTLINETYPE @@ -524,6 +526,7 @@ BRIDGE_IMPEXP bool DbgLoopGet(int depth, duint addr, duint* start, duint* end); BRIDGE_IMPEXP bool DbgLoopOverlaps(int depth, duint start, duint end); BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end); BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr); +BRIDGE_IMPEXP bool DbgIsRunLocked(); //Gui defines #define GUI_PLUGIN_MENU 0 diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index f861ac23..ea65cfee 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -899,6 +899,12 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par return (uint)loopdel(info->depth, info->addr); } break; + + case DBG_IS_RUN_LOCKED: + { + return (uint)waitislocked(WAITID_RUN); + } + break; } return 0; } diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 534e7b9b..630d1b31 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -334,7 +334,7 @@ void MainWindow::displayAboutWidget() #else QString title="About x32_dbg"; #endif - title += QString().sprintf(" v%d", DBG_VERSION); + title += QString().sprintf(" v%d", BridgeGetDbgVersion()); QMessageBox msg(QMessageBox::Information, title, "Created by:\nSigma (GUI)\nMr. eXoDia (DBG)\n\nSpecial Thanks:\nVisualPharm (http://visualpharm.com)\nReversingLabs (http://reversinglabs.com)\nBeatriX (http://beaengine.org)\nQt Project (http://qt-project.org)\nFugue Icons (http://yusukekamiyamane.com)\nNanomite (https://github.com/zer0fl4g/Nanomite)"); msg.setWindowIcon(QIcon(":/icons/images/information.png")); msg.setParent(this, Qt::Dialog); From e683aa227162378511c36cdc033652a928289e6e Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Sun, 8 Jun 2014 21:50:31 +0200 Subject: [PATCH 054/676] ida sidebar --- x64_dbg_gui/Project/DebuggerX64.pro | 8 +- .../Src/BasicView/AbstractTableView.cpp | 11 + .../Project/Src/BasicView/AbstractTableView.h | 3 + .../Project/Src/BasicView/CommandHelpView.cpp | 2 +- .../Project/Src/BasicView/Disassembly.cpp | 26 +- .../Project/Src/BasicView/Disassembly.h | 10 +- .../Project/Src/BasicView/ReferenceView.h | 1 + .../Project/Src/BasicView/RegistersView.cpp | 2 + .../Project/Src/BasicView/ScriptView.cpp | 1 + .../Project/Src/Disassembler/QBeaEngine.cpp | 13 +- .../Project/Src/Gui/BreakpointsView.cpp | 6 +- .../Project/Src/Gui/CPUDisassembly.cpp | 2 + x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 4 +- x64_dbg_gui/Project/Src/Gui/CPUDump.h | 1 + x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp | 230 ++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/CPUJumps.h | 42 ++++ x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 16 +- x64_dbg_gui/Project/Src/Gui/CPUWidget.h | 2 + x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h | 1 + x64_dbg_gui/Project/Src/Gui/SettingsDialog.h | 1 + x64_dbg_gui/Project/Src/Gui/TabBar.cpp | 3 +- x64_dbg_gui/Project/Src/Gui/TabWidget.cpp | 1 + x64_dbg_gui/Project/Src/Memory/MemoryPage.cpp | 2 + .../Project/Src/Memory/ProcessMemoryMap.cpp | 2 +- 24 files changed, 369 insertions(+), 21 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/CPUJumps.h diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index cb37f955..980baf87 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -64,7 +64,8 @@ SOURCES += \ Src/Gui/TabBar.cpp \ Src/Gui/TabWidget.cpp \ Src/BasicView/CommandHelpView.cpp \ - Src/BasicView/HistoryLineEdit.cpp + Src/BasicView/HistoryLineEdit.cpp \ + Src/Gui/CPUJumps.cpp HEADERS += \ @@ -109,7 +110,8 @@ HEADERS += \ Src/Gui/TabBar.h \ Src/Gui/TabWidget.h \ Src/BasicView/CommandHelpView.h \ - Src/BasicView/HistoryLineEdit.h + Src/BasicView/HistoryLineEdit.h \ + Src/Gui/CPUJumps.h INCLUDEPATH += \ @@ -141,6 +143,8 @@ INCLUDEPATH += $$PWD/Src/Bridge LIBS += -luser32 + DEFINES += NOMINMAX + !contains(QMAKE_HOST.arch, x86_64) { message("x86 build") LIBS += -L"$$PWD/Src/ThirdPartyLibs/BeaEngine/" -lBeaEngine diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index 6790e488..57cbaf52 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -61,6 +61,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare */ void AbstractTableView::paintEvent(QPaintEvent* event) { + Q_UNUSED(event); QPainter wPainter(this->viewport()); int wViewableRowsCount = getViewableRowsCount(); @@ -128,6 +129,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) y = getHeaderHeight(); x += getColumnWidth(j); } + emit repainted(); } @@ -484,6 +486,7 @@ void AbstractTableView::vertSliderActionSlot(int action) // Call the hook (Usefull for disassembly) mTableOffset = sliderMovedHook(action, mTableOffset, wDelta); + emit tableOffsetChanged(mTableOffset); // Scale the new table offset to the 32bits scrollbar range #ifdef _WIN64 @@ -492,9 +495,13 @@ void AbstractTableView::vertSliderActionSlot(int action) wNewScrollBarValue = mTableOffset; #endif + qDebug() << mTableOffset; + // Update scrollbar attributes verticalScrollBar()->setValue(wNewScrollBarValue); verticalScrollBar()->setSliderPosition(wNewScrollBarValue); + + } @@ -511,6 +518,7 @@ void AbstractTableView::vertSliderActionSlot(int action) */ int_t AbstractTableView::sliderMovedHook(int type, int_t value, int_t delta) { + Q_UNUSED(type); int_t wValue = value + delta; int_t wMax = getRowCount() - 1; @@ -723,6 +731,7 @@ int AbstractTableView::getViewableRowsCount() wCount += (wTableHeight % getRowHeight()) > 0 ? 1 : 0; + emit viewableRows(wCount); return wCount; } @@ -899,6 +908,7 @@ int_t AbstractTableView::getTableOffset() void AbstractTableView::setTableOffset(int_t val) { mTableOffset = val; + emit tableOffsetChanged(val); #ifdef _WIN64 int wNewValue = scaleFromUint64ToScrollBarRange(mTableOffset); @@ -924,6 +934,7 @@ void AbstractTableView::reloadData() void AbstractTableView::repaint() { this->viewport()->repaint(); + } diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h index 6d930a70..eeeed8f6 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h @@ -77,6 +77,9 @@ public: signals: void headerButtonPressed(int col); void headerButtonReleased(int col); + void tableOffsetChanged(int i); + void viewableRows(int rows); + void repainted(); public slots: // Update/Reload/Refresh/Repaint diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp index a2d8b3c7..7d770644 100644 --- a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp @@ -21,7 +21,7 @@ CommandHelpView::CommandHelpView(QWidget *parent) : QFont wFont("Monospace", 8); wFont.setStyleHint(QFont::Monospace); wFont.setFixedPitch(true); - int charwidth=QFontMetrics(wFont).width(QChar(' ')); + //int charwidth=QFontMetrics(wFont).width(QChar(' ')); // Create module list mModuleList = new StdTable(); diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index cfc956b2..1c9eb8c1 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -219,14 +219,14 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse int funcsize = paintFunctionGraphic(painter, x, y, funcType, false); //draw jump arrows - int jumpsize = paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line + int jumpsize = 7;//paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line //draw bytes painter->save(); painter->setPen(QColor("#000000")); //DisassemblyBytesColor QString wBytes = ""; for(int i = 0; i < mInstBuffer.at(rowOffset).dump.size(); i++) - wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper(); + wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper()+" "; painter->drawText(QRect(x + jumpsize + funcsize, y, getColumnWidth(col) - jumpsize - funcsize, getRowHeight()), 0, wBytes); painter->restore(); @@ -281,6 +281,11 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->setPen(QColor("#000000")); //DisassemblyCommentColor painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); painter->restore(); + }else{ + painter->save(); + painter->setPen(QColor("#000000")); //DisassemblyCommentColor + //painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, "QString(comment)"); + painter->restore(); } } break; @@ -993,6 +998,7 @@ void Disassembly::prepareData() mInstBuffer.append(wInst); wRVA += wInst.lentgh; } + } void Disassembly::reloadData() @@ -1132,10 +1138,22 @@ void Disassembly::disassembleAt(int_t parVA, int_t parCIP, bool history, int_t n MessageBoxA(GuiGetWindowHandle(), strList.toUtf8().constData(), QString().sprintf("mCurrentVa=%d", mCurrentVa).toUtf8().constData(), MB_ICONINFORMATION); } */ - + emit disassembledAt(parVA, parCIP, history, newTableOffset); reloadData(); + } +QList* Disassembly::instructionsBuffer() +{ + return &mInstBuffer; +} + +const int_t Disassembly::currentEIP() const +{ + return mCipRva; +} + + void Disassembly::disassembleAt(int_t parVA, int_t parCIP) { disassembleAt(parVA, parCIP, true, -1); @@ -1160,7 +1178,7 @@ void Disassembly::debugStateChangedSlot(DBGSTATE state) } } -int_t Disassembly::getBase() +const int_t Disassembly::getBase() const { return mBase; } diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index fefb8a69..140336d3 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -73,7 +73,7 @@ public: // Public Methods uint_t rvaToVa(int_t rva); void disassembleClear(); - int_t getBase(); + const int_t getBase() const; int_t getSize(); // history management @@ -86,9 +86,15 @@ public: //disassemble void disassembleAt(int_t parVA, int_t parCIP, bool history, int_t newTableOffset); + QList *instructionsBuffer(); + const int_t baseAddress() const; + const int_t currentEIP() const; + signals: void selectionChanged(int_t parVA); - + void repainted(); + void disassembledAt(int_t parVA, int_t parCIP, bool history, int_t newTableOffset); + public slots: void disassembleAt(int_t parVA, int_t parCIP); void debugStateChangedSlot(DBGSTATE state); diff --git a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.h b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.h index abd37aa1..f8405161 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ReferenceView.h +++ b/x64_dbg_gui/Project/Src/BasicView/ReferenceView.h @@ -3,6 +3,7 @@ #include #include +#include #include "SearchListView.h" #include "Bridge.h" diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 15f6f4db..4b44b1ab 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -138,6 +138,7 @@ RegistersView::~RegistersView() void RegistersView::mousePressEvent(QMouseEvent* event) { + Q_UNUSED(event); int wI = 0; int wSelected = -1; QPalette wPalette; @@ -179,6 +180,7 @@ void RegistersView::mousePressEvent(QMouseEvent* event) void RegistersView::mouseDoubleClickEvent(QMouseEvent* event) { + Q_UNUSED(event); if(mSelected==-1) //no selection return; diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index a395805b..b31df9eb 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -254,6 +254,7 @@ void ScriptView::contextMenuEvent(QContextMenuEvent* event) void ScriptView::mouseDoubleClickEvent(QMouseEvent* event) { + Q_UNUSED(event); if(!getRowCount()) return; newIp(); diff --git a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp index 39f8fcdb..a983620c 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp @@ -22,6 +22,10 @@ QBeaEngine::QBeaEngine() */ ulong QBeaEngine::DisassembleBack(byte_t* data, uint_t base, uint_t size, uint_t ip, int n) { + + const unsigned int max_instructions = 128; + + Q_UNUSED(base); int i; uint_t abuf[131], addr, back, cmdsize; byte_t* pdata; @@ -41,8 +45,8 @@ ulong QBeaEngine::DisassembleBack(byte_t* data, uint_t base, uint_t size, uint_t // Round the number of back instructions to 127 if(n < 0) n = 0; - else if (n > 127) - n = 127; + else if (n >= max_instructions) + n = max_instructions-1; // Check if the instruction pointer ip is not outside the memory range if(ip >= size) @@ -66,7 +70,7 @@ ulong QBeaEngine::DisassembleBack(byte_t* data, uint_t base, uint_t size, uint_t for(i = 0; addr < ip; i++) { - abuf[i % 128] = addr; + abuf[i % max_instructions] = addr; mDisasmStruct.EIP = (UIntPtr)pdata; len = Disasm(&mDisasmStruct); @@ -80,7 +84,7 @@ ulong QBeaEngine::DisassembleBack(byte_t* data, uint_t base, uint_t size, uint_t if(i < n) return abuf[0]; else - return abuf[(i - n + 128) % 128]; + return abuf[(i - n + max_instructions) % max_instructions]; } @@ -98,6 +102,7 @@ ulong QBeaEngine::DisassembleBack(byte_t* data, uint_t base, uint_t size, uint_t */ ulong QBeaEngine::DisassembleNext(byte_t* data, uint_t base, uint_t size, uint_t ip, int n) { + Q_UNUSED(base); int i; uint_t cmdsize; byte_t* pdata; diff --git a/x64_dbg_gui/Project/Src/Gui/BreakpointsView.cpp b/x64_dbg_gui/Project/Src/Gui/BreakpointsView.cpp index d1744931..72ac2e12 100644 --- a/x64_dbg_gui/Project/Src/Gui/BreakpointsView.cpp +++ b/x64_dbg_gui/Project/Src/Gui/BreakpointsView.cpp @@ -228,7 +228,7 @@ void BreakpointsView::hardwareBPContextMenuSlot(const QPoint & pos) // Remove All wMenu->addAction(mHardBPRemoveAllAction); - QAction* wAction = wMenu->exec(mHardBPTable->mapToGlobal(pos)); + wMenu->exec(mHardBPTable->mapToGlobal(pos)); } } @@ -318,7 +318,7 @@ void BreakpointsView::softwareBPContextMenuSlot(const QPoint & pos) // Remove All wMenu->addAction(mSoftBPRemoveAllAction); - QAction* wAction = wMenu->exec(mSoftBPTable->mapToGlobal(pos)); + wMenu->exec(mSoftBPTable->mapToGlobal(pos)); } } @@ -407,7 +407,7 @@ void BreakpointsView::memoryBPContextMenuSlot(const QPoint & pos) // Remove All wMenu->addAction(mMemBPRemoveAllAction); - QAction* wAction = wMenu->exec(mMemBPTable->mapToGlobal(pos)); + wMenu->exec(mMemBPTable->mapToGlobal(pos)); } } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 364a50e5..51d647b9 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -632,6 +632,8 @@ void CPUDisassembly::assembleAt() msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint)); msg.exec(); } + + } void CPUDisassembly::gotoExpression() diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 606cb107..2315195a 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -29,10 +29,10 @@ public: void setupRightClickContextMenu(); void setHwBpAt(uint_t va, int slot); - + signals: void displayReferencesWidget(); - + public slots: void toggleInt3BPAction(); void toggleHwBpActionSlot(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h index a617d3c1..d0134292 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "NewTypes.h" #include "HexDump.h" #include "Bridge.h" diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp new file mode 100644 index 00000000..65b80f41 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp @@ -0,0 +1,230 @@ +#include "CPUJumps.h" + +CPUJumps::CPUJumps(CPUDisassembly *Ptr, QWidget *parent) : + QAbstractScrollArea(parent) +{ + + topVA = -1; + viewableRows = 0; + + CodePtr = Ptr; + + m_DefaultFont = QFont("Monospace", 8); + + const QFontMetrics metrics(m_DefaultFont); + fontWidth = metrics.width('W'); + fontHeight = metrics.height(); + + InstrBuffer = CodePtr->instructionsBuffer(); + + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); +} + +QSize CPUJumps::sizeHint() const +{ + return QSize(40,this->viewport()->height()); +} + + +void CPUJumps::disassembleAt(int_t parVA, int_t parCIP) +{ + repaint(); +} + +void CPUJumps::repaint(){ + + viewport()->repaint(); +} + +void CPUJumps::changeTopmostAddress(int i) +{ + if(i!=topVA){ + topVA = i; + } +} + +void CPUJumps::setViewableRows(int rows) +{ + viewableRows = rows; +} + +bool CPUJumps::isJump(int i) const{ + + int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; + if(BranchType && BranchType!=RetType && BranchType!=CallType){ + return true; + } + return false; +} + +void CPUJumps::paintEvent(QPaintEvent *event) +{ + painter = new QPainter(viewport()); + + int jumpoffset = 0; + + int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); + int_t first_va = InstrBuffer->first().rva + CodePtr->getBase(); + + for(int line=0;lineat(line).rva + CodePtr->getBase()) == bp_none); + + + if(isJump(line)){ + jumpoffset++; + + int_t destRVA = (int_t)InstrBuffer->at(line).disasm.Instruction.AddrValue; + + if( InstrBuffer->at(line).disasm.Instruction.Opcode == 0xFF) + continue; + + + bool cond = !((InstrBuffer->at(line).disasm.Instruction.Opcode == 0xEB) || InstrBuffer->at(line).disasm.Instruction.Opcode == 0xE9); + if(destRVA <= last_va && destRVA >= first_va){ + + int destLine = line+1; + + while(InstrBuffer->at(destLine).rva + CodePtr->getBase() != destRVA + && destLine at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva); + + + }else if(destRVA > last_va){ + drawJump(line,viewableRows+6,jumpoffset,cond,DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva); + } + + } + + if(InstrBuffer->at(line).rva == CodePtr->currentEIP()){ + drawLabel(line,"EIP"); + } + + } + + + //delete painter; +} + +void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute){ + painter->save(); + if(!conditional){ + painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp + }else{ + painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); + } + QPen tmp = painter->pen(); + if(isexecute){ + tmp.setWidth(2); + //tmp.setColor(Qt::red); + } + painter->setPen(tmp); + + const int JumpPadding = 15; + + const int x = viewport()->width()-jumpoffset*JumpPadding - 12; + const int x_right = viewport()->width()- 12; + const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; + const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; + + // vertical + painter->drawLine(x,y_start,x,y_end); + // start horizontal + painter->drawLine(x,y_start,x_right,y_start); + painter->drawLine(x,y_end,x_right,y_end); + + const int ArrowSizeX = 2; // width of arrow tip in pixel + const int ArrowSizeY = 3; // height of arrow tip in pixel + + + tmp = painter->pen(); + tmp.setStyle(Qt::SolidLine); + tmp.setWidth(2); + painter->setPen(tmp); + painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); + painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); + + + painter->restore(); +} + +void CPUJumps::drawBullets(int line, bool isbp){ + + + painter->save(); + + if( isbp) + painter->setBrush(QBrush("#808080")); + else + painter->setBrush(QBrush(Qt::red)); + + const int y = fontHeight*(1+line)-0.8*fontHeight ; + const int x = viewport()->width() - 10; + const int radius = 8; + + painter->setRenderHint(QPainter::Antialiasing, true); + painter->setPen(QPen("#ffffff")); + painter->drawEllipse(x,y,radius,radius); + + + + painter->restore(); +} + + + + +void CPUJumps::drawLabel(int Line, QString Text){ + + painter->save(); + const int LineCoordinate = fontHeight*(1+Line); + int length = Text.length(); + + painter->setBrush(QBrush(QColor("#4040ff"))); + painter->setPen(QPen(QColor("#4040ff"))); + int y = LineCoordinate-fontHeight; + + painter->drawRect(1,y,length*fontWidth,fontHeight); + painter->setPen(QPen(QColor("#ffffff"))); + painter->drawText(2,LineCoordinate-0.2*fontHeight,Text); + + y = fontHeight*(1+Line)-0.5*fontHeight; + painter->setPen(QPen(QColor("#4040ff"),2)); + painter->setBrush(QBrush(QColor("#4040ff"))); + + drawStraightArrow(painter,length*fontWidth,y,this->viewport()->width()-2-15,y); + painter->restore(); + +} + +void CPUJumps::drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2) +{ + + + painter->drawLine(x1,y1,x2,y2); + + + + /* + // this does not work + QPainterPath path; + + path.moveTo( QPointF(x2, x2)); + path.lineTo (QPointF(x2-ArrowSizeX,y2-ArrowSizeY)); + path.lineTo (QPointF(x2-ArrowSizeX,y2+ArrowSizeY)); + path.closeSubpath(); + + painter->setPen (Qt :: NoPen); + painter->fillPath (path, QBrush (color));*/ + const int ArrowSizeX = 4; // width of arrow tip in pixel + const int ArrowSizeY = 4; // height of arrow tip in pixel + + + painter->drawLine(x2,y2,x2-ArrowSizeX,y2-ArrowSizeY); + painter->drawLine(x2,y2,x2-ArrowSizeX,y2+ArrowSizeY); + +} + diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h new file mode 100644 index 00000000..e181bf87 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h @@ -0,0 +1,42 @@ +#ifndef CPUJUMPS_H +#define CPUJUMPS_H + +#include "NewTypes.h" +#include "Bridge.h" +#include "CPUDisassembly.h" +#include + +class CPUJumps : public QAbstractScrollArea +{ + Q_OBJECT + + int_t topVA; + QPainter *painter; + QFont m_DefaultFont; + int fontWidth, fontHeight; + int viewableRows; + + CPUDisassembly *CodePtr; + QList *InstrBuffer; +public: + explicit CPUJumps(CPUDisassembly *Ptr, QWidget *parent = 0); + QSize sizeHint() const; + + void drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2); +signals: + +public slots: + + void disassembleAt(int_t parVA, int_t parCIP); + void repaint(); + void changeTopmostAddress(int i); + void setViewableRows(int rows); +protected: + void paintEvent(QPaintEvent *event); + void drawLabel(int Line, QString Text); + void drawBullets(int line, bool ispb); + bool isJump(int i) const; + void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute); +}; + +#endif // CPUJUMPS_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index 5ba0f63f..53711f7a 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -7,7 +7,19 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) setDefaultDisposition(); mDisas = new CPUDisassembly(0); - ui->mTopLeftUpperFrameLayout->addWidget(mDisas); + mJumps = new CPUJumps(mDisas); + connect(mDisas,SIGNAL(tableOffsetChanged(int)),mJumps,SLOT(changeTopmostAddress(int))); + connect(mDisas,SIGNAL(viewableRows(int)),mJumps,SLOT(setViewableRows(int))); + connect(mDisas,SIGNAL(repainted()),mJumps,SLOT(repaint())); + + + QSplitter *splitter = new QSplitter(this); + + splitter->addWidget(mJumps); + splitter->addWidget(mDisas); + + + ui->mTopLeftUpperFrameLayout->addWidget(splitter); mInfo = new InfoBox(); ui->mTopLeftLowerFrameLayout->addWidget(mInfo); @@ -31,6 +43,8 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) CPUStack* st = new CPUStack(0); //stack widget ui->mBotRightFrameLayout->addWidget(st); + + //cw = new ColumnWidget(3, this); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h index e980d4fc..21c665a7 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h @@ -9,6 +9,7 @@ #include "CPUStack.h" #include "RegistersView.h" #include "InfoBox.h" +#include "CPUJumps.h" namespace Ui { class CPUWidget; @@ -29,6 +30,7 @@ public: QVBoxLayout* getBotRightWidget(void); public: + CPUJumps* mJumps; CPUDisassembly* mDisas; RegistersView* mGeneralRegs; InfoBox* mInfo; diff --git a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h index 44b7d824..a17a7772 100644 --- a/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h +++ b/x64_dbg_gui/Project/Src/Gui/CommandLineEdit.h @@ -3,6 +3,7 @@ #include "HistoryLineEdit.h" #include "Bridge.h" +#include class CommandLineEdit : public HistoryLineEdit { diff --git a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h index e3b1eef6..3d2a3b66 100644 --- a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h @@ -2,6 +2,7 @@ #define SETTINGSDIALOG_H #include +#include #include "Bridge.h" #include "ExceptionRangeDialog.h" diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.cpp b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp index 7898f74b..34c356fc 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp @@ -36,7 +36,8 @@ void MHTabBar::contextMenuEvent(QContextMenuEvent* event) wMenu.addAction(&wDetach); if(wMenu.exec(event->globalPos())==&wDetach) { - OnDetachTab(tabAt(event->pos()), QPoint(0, 0)); + QPoint p(0, 0); + OnDetachTab((int)tabAt(event->pos()), p); } } diff --git a/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp index fed6f634..bde42582 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp @@ -81,6 +81,7 @@ void MHTabWidget::MoveTab(int fromIndex, int toIndex) ////////////////////////////////////////////////////////////////////////////// void MHTabWidget::DetachTab(int index, QPoint& dropPoint) { + Q_UNUSED(dropPoint); // Create the window MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); detachedWidget->setWindowModality(Qt::NonModal); diff --git a/x64_dbg_gui/Project/Src/Memory/MemoryPage.cpp b/x64_dbg_gui/Project/Src/Memory/MemoryPage.cpp index 4f01b8b4..27b1e855 100644 --- a/x64_dbg_gui/Project/Src/Memory/MemoryPage.cpp +++ b/x64_dbg_gui/Project/Src/Memory/MemoryPage.cpp @@ -2,6 +2,8 @@ MemoryPage::MemoryPage(uint_t parBase, uint_t parSize, QObject *parent) : QObject(parent) { + Q_UNUSED(parBase); + Q_UNUSED(parSize); mBase = 0; mSize = 0; } diff --git a/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp b/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp index 353f846a..59212a4f 100644 --- a/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp +++ b/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp @@ -3,7 +3,7 @@ ProcessMemoryMap::ProcessMemoryMap(QString fileName, QObject *parent) : QObject(parent) { - + Q_UNUSED(fileName); STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(si); From e33e66466e5b14e9787728cfb47966deb27e28ab Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Mon, 9 Jun 2014 13:41:24 +0200 Subject: [PATCH 055/676] colors are noew defined in a config file (using JSON) JumpView has auto-refresh --- x64_dbg_gui/Project/DebuggerX64.pro | 6 +- .../Src/BasicView/AbstractTableView.cpp | 2 +- .../Project/Src/BasicView/Disassembly.cpp | 38 +++++++------ .../Project/Src/Gui/CPUDisassembly.cpp | 1 + x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp | 44 +++++++++++---- x64_dbg_gui/Project/Src/Gui/CPUJumps.h | 4 +- x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 1 + x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 56 +++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/Configuration.h | 30 ++++++++++ x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 5 ++ x64_dbg_gui/Project/Src/Gui/MainWindow.h | 3 + 11 files changed, 158 insertions(+), 32 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Gui/Configuration.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/Configuration.h diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 980baf87..ce80abbe 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -65,7 +65,8 @@ SOURCES += \ Src/Gui/TabWidget.cpp \ Src/BasicView/CommandHelpView.cpp \ Src/BasicView/HistoryLineEdit.cpp \ - Src/Gui/CPUJumps.cpp + Src/Gui/CPUJumps.cpp \ + Src/Gui/Configuration.cpp HEADERS += \ @@ -111,7 +112,8 @@ HEADERS += \ Src/Gui/TabWidget.h \ Src/BasicView/CommandHelpView.h \ Src/BasicView/HistoryLineEdit.h \ - Src/Gui/CPUJumps.h + Src/Gui/CPUJumps.h \ + Src/Gui/Configuration.h INCLUDEPATH += \ diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index 57cbaf52..c4724fc8 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -495,7 +495,7 @@ void AbstractTableView::vertSliderActionSlot(int action) wNewScrollBarValue = mTableOffset; #endif - qDebug() << mTableOffset; + emit repainted(); // Update scrollbar attributes verticalScrollBar()->setValue(wNewScrollBarValue); diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 1c9eb8c1..c721a773 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -1,4 +1,5 @@ #include "Disassembly.h" +#include "Configuration.h" Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) { @@ -117,21 +118,21 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->save(); if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); //DisassemblyCipColor + painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyCipColor"))); //DisassemblyCipColor if(!isbookmark) { if(bpxtype&bp_normal) //breakpoint { - painter->setPen(QPen(QColor("#FF0000"))); //DisassemblyMainBpColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyMainBpColor"))); //DisassemblyMainBpColor } else { - painter->setPen(QPen(QColor("#FFFBF0"))); //DisassemblyOtherBpColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor } } else { - painter->setPen(QPen(QColor("#FEE970"))); //DisassemblyBookmarkColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor } } else //other address @@ -141,16 +142,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(*label) //label { if(bpxtype==bp_none) //label only - painter->setPen(QPen(QColor("#FF0000"))); //red -> address + label text (DisassemblyMainLabelColor) + painter->setPen(QPen(Configuration::instance()->color("DisassemblyMainLabelColor"))); //red -> address + label text (DisassemblyMainLabelColor) else //label+breakpoint { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor) + painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) } else { - painter->setPen(QPen(QColor("#000000"))); //black address (???) + painter->setPen(QPen(Configuration::instance()->color("blackaddress"))); //black address (???) } } } @@ -159,33 +160,33 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(bpxtype==bp_none) //no label, no breakpoint { if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor } else //breakpoint only { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FF0000"))); //fill red (DisassemblyMainBpColor) + painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) } else { if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor } } } } else //bookmark { - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#FEE970"))); //DisassemblyBookmarkColor + painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor if(wIsSelected) - painter->setPen(QPen(QColor("#000000"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(QColor("#808080"))); //DisassemblyAddressColor + painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor } } painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText); @@ -223,7 +224,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse //draw bytes painter->save(); - painter->setPen(QColor("#000000")); //DisassemblyBytesColor + painter->setPen(Configuration::instance()->color("DisassemblyBytesColor")); //DisassemblyBytesColor QString wBytes = ""; for(int i = 0; i < mInstBuffer.at(rowOffset).dump.size(); i++) wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper()+" "; @@ -278,12 +279,12 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(DbgGetCommentAt(mInstBuffer.at(rowOffset).rva+mBase, comment)) { painter->save(); - painter->setPen(QColor("#000000")); //DisassemblyCommentColor + painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); painter->restore(); }else{ painter->save(); - painter->setPen(QColor("#000000")); //DisassemblyCommentColor + painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor //painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, "QString(comment)"); painter->restore(); } @@ -1004,6 +1005,7 @@ void Disassembly::prepareData() void Disassembly::reloadData() { emit selectionChanged(rvaToVa(mSelection.firstSelectedIndex)); + emit repainted(); AbstractTableView::reloadData(); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 51d647b9..8fad3fda 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -376,6 +376,7 @@ void CPUDisassembly::toggleInt3BPAction() } DbgCmdExec(wCmd.toUtf8().constData()); + emit repainted(); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp index 65b80f41..78a542b6 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp @@ -1,10 +1,11 @@ #include "CPUJumps.h" - +#include "Configuration.h" CPUJumps::CPUJumps(CPUDisassembly *Ptr, QWidget *parent) : QAbstractScrollArea(parent) { topVA = -1; + selectedVA = -1; viewableRows = 0; CodePtr = Ptr; @@ -28,7 +29,7 @@ QSize CPUJumps::sizeHint() const void CPUJumps::disassembleAt(int_t parVA, int_t parCIP) { - repaint(); + //repaint(); } void CPUJumps::repaint(){ @@ -40,6 +41,8 @@ void CPUJumps::changeTopmostAddress(int i) { if(i!=topVA){ topVA = i; + qDebug() << i; + repaint(); } } @@ -48,6 +51,14 @@ void CPUJumps::setViewableRows(int rows) viewableRows = rows; } +void CPUJumps::setSelection(int_t selVA) +{ + if(selVA != selectedVA){ + selectedVA = selVA; + repaint(); + } +} + bool CPUJumps::isJump(int i) const{ int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; @@ -59,6 +70,9 @@ bool CPUJumps::isJump(int i) const{ void CPUJumps::paintEvent(QPaintEvent *event) { + if(InstrBuffer->size() ==0) + return; + painter = new QPainter(viewport()); int jumpoffset = 0; @@ -90,11 +104,18 @@ void CPUJumps::paintEvent(QPaintEvent *event) destLine++; - drawJump(line,destLine,jumpoffset,cond,DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva); + drawJump(line,destLine,jumpoffset,cond, + DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); }else if(destRVA > last_va){ - drawJump(line,viewableRows+6,jumpoffset,cond,DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva); + drawJump(line, + viewableRows+6, + jumpoffset, + cond, + DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); } } @@ -109,7 +130,7 @@ void CPUJumps::paintEvent(QPaintEvent *event) //delete painter; } -void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute){ +void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute, bool isactive){ painter->save(); if(!conditional){ painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp @@ -121,6 +142,9 @@ void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool condition tmp.setWidth(2); //tmp.setColor(Qt::red); } + if(isactive){ + tmp.setColor(Qt::red); + } painter->setPen(tmp); const int JumpPadding = 15; @@ -183,17 +207,17 @@ void CPUJumps::drawLabel(int Line, QString Text){ const int LineCoordinate = fontHeight*(1+Line); int length = Text.length(); - painter->setBrush(QBrush(QColor("#4040ff"))); - painter->setPen(QPen(QColor("#4040ff"))); + painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); + painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"))); int y = LineCoordinate-fontHeight; painter->drawRect(1,y,length*fontWidth,fontHeight); - painter->setPen(QPen(QColor("#ffffff"))); + painter->setPen(QPen(Configuration::instance()->color("EIPLabel"))); painter->drawText(2,LineCoordinate-0.2*fontHeight,Text); y = fontHeight*(1+Line)-0.5*fontHeight; - painter->setPen(QPen(QColor("#4040ff"),2)); - painter->setBrush(QBrush(QColor("#4040ff"))); + painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"),2)); + painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); drawStraightArrow(painter,length*fontWidth,y,this->viewport()->width()-2-15,y); painter->restore(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h index e181bf87..ae2eeca6 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h @@ -11,6 +11,7 @@ class CPUJumps : public QAbstractScrollArea Q_OBJECT int_t topVA; + int_t selectedVA; QPainter *painter; QFont m_DefaultFont; int fontWidth, fontHeight; @@ -31,12 +32,13 @@ public slots: void repaint(); void changeTopmostAddress(int i); void setViewableRows(int rows); + void setSelection(int_t selVA); protected: void paintEvent(QPaintEvent *event); void drawLabel(int Line, QString Text); void drawBullets(int line, bool ispb); bool isJump(int i) const; - void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute); + void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); }; #endif // CPUJUMPS_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index 53711f7a..bf9cd00a 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -11,6 +11,7 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) connect(mDisas,SIGNAL(tableOffsetChanged(int)),mJumps,SLOT(changeTopmostAddress(int))); connect(mDisas,SIGNAL(viewableRows(int)),mJumps,SLOT(setViewableRows(int))); connect(mDisas,SIGNAL(repainted()),mJumps,SLOT(repaint())); + connect(mDisas,SIGNAL(selectionChanged(int_t)),mJumps,SLOT(setSelection(int_t))); QSplitter *splitter = new QSplitter(this); diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp new file mode 100644 index 00000000..99d83b2a --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -0,0 +1,56 @@ +#include "Configuration.h" + +Configuration* Configuration::mPtr = NULL; + + +Configuration::Configuration() +{ + load("config.json"); + //Colors = new QMap(); + //Colors = QMap(); + mPtr = this; +} + +Configuration *Configuration::instance() +{ + return mPtr; +} + +void Configuration::load(QString filename){ + // load configuration file + QFile configfile(filename); + + if (!configfile.open(QIODevice::ReadOnly)) { + qWarning("Couldn't open config file."); + return ; + }else{ + qDebug() << "load succ"; + } + QByteArray saveData = configfile.readAll(); + Config = QJsonDocument(QJsonDocument::fromJson(saveData)).object(); + + readColors(); +} + +void Configuration::readColors() { + Colors.clear(); + + QJsonArray ColorArray = Config["colors"].toArray(); + for (int idx = 0; idx < ColorArray.size(); ++idx) { + QJsonArray colorObj = ColorArray[idx].toArray(); + Colors.insert(colorObj.at(0).toString(),QColor( colorObj.at(1).toString())); + qDebug() << "read color "< +#include +#include +#include +#include +#include +#include +#include + +class Configuration +{ + QJsonObject Config; + + QMap Colors; + + static Configuration* mPtr; +public: + Configuration(); + + static Configuration* instance(); + + void readColors(); + const QColor color(QString id) const; + void load(QString filename); +}; + +#endif // CONFIGURATION_H diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 630d1b31..551346ba 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -21,6 +21,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi SendMessageA((HWND)MainWindow::winId(), WM_SETICON, ICON_BIG, (LPARAM)hIcon); DestroyIcon(hIcon); + // load config file + mConfiguration = new Configuration; + //Load recent files loadMRUList(16); @@ -98,6 +101,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi mLastLogLabel=new StatusLabel(); ui->statusBar->addPermanentWidget(mLastLogLabel, 1); + + // Setup Signals/Slots connect(mCmdLineEdit, SIGNAL(returnPressed()), this, SLOT(executeCommand())); connect(ui->actionStepOver,SIGNAL(triggered()),this,SLOT(execStepOver())); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index d2deb04a..3efec87b 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -18,6 +18,7 @@ #include "ThreadView.h" #include "SettingsDialog.h" #include "tabwidget.h" +#include "Configuration.h" namespace Ui { class MainWindow; @@ -87,6 +88,8 @@ private: StatusLabel* mStatusLabel; StatusLabel* mLastLogLabel; + Configuration* mConfiguration; + const char* mWindowMainTitle; std::vector mMRUList; From dfe18ccda57d3e5e274b8c6dfbe2679963198463 Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Mon, 9 Jun 2014 15:15:25 +0200 Subject: [PATCH 056/676] api fingerprints can be used to obtain informations about common api calls like "messageboxa" added informations for "gdi32, kernel32, shell32, stdio, user32" --- x64_dbg_gui/Project/Data/gdi32.txt | 337 ++++++ x64_dbg_gui/Project/Data/kernel32.txt | 1047 +++++++++++++++++ x64_dbg_gui/Project/Data/shell32.txt | 246 ++++ x64_dbg_gui/Project/Data/stdio.txt | 61 + x64_dbg_gui/Project/Data/user32.txt | 719 +++++++++++ x64_dbg_gui/Project/DebuggerX64.pro | 6 +- x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp | 7 + x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 18 +- x64_dbg_gui/Project/Src/Gui/Configuration.h | 1 + x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 2 + x64_dbg_gui/Project/Src/Gui/MainWindow.h | 2 + .../Project/Src/Utils/ApiFingerprints.cpp | 110 ++ .../Project/Src/Utils/ApiFingerprints.h | 28 + x64_dbg_gui/Project/Src/config.json | 18 + 14 files changed, 2596 insertions(+), 6 deletions(-) create mode 100644 x64_dbg_gui/Project/Data/gdi32.txt create mode 100644 x64_dbg_gui/Project/Data/kernel32.txt create mode 100644 x64_dbg_gui/Project/Data/shell32.txt create mode 100644 x64_dbg_gui/Project/Data/stdio.txt create mode 100644 x64_dbg_gui/Project/Data/user32.txt create mode 100644 x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp create mode 100644 x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h create mode 100644 x64_dbg_gui/Project/Src/config.json diff --git a/x64_dbg_gui/Project/Data/gdi32.txt b/x64_dbg_gui/Project/Data/gdi32.txt new file mode 100644 index 00000000..0c000486 --- /dev/null +++ b/x64_dbg_gui/Project/Data/gdi32.txt @@ -0,0 +1,337 @@ +int AbortDoc(HDC hDC); +int AbortPath(HDC hDC); +int AddFontMemResourceEx(PVOID pbFont,DWORD cbFont,PVOID pdv,DWORD* pcFonts); +int AddFontResource(LPCTSTR lpszFilename); +int AddFontResourceA(LPCTSTR lpszFilename); +int AddFontResourceEx(LPCTSTR lpszFilename,DWORD fl,PVOID pdv); +int AddFontResourceW(LPCTSTR lpszFilename); +int AngleArc(HDC hDC,int x,int y,DWORD dwRadius,FLOAT eStartAngle,FLOAT eSweepAngle); +int AnimatePalette(HPALETTE hpal,UINT iStartindex,UINT cEntries,const PALETTEENTRY* ppe); +int Arc(HDC hDC,int nLeftRect,int nTopRect,int nTopRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc); +int ArcTo(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); +int BeginPath(HDC hDC); +int BitBlt(HDC hDCDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); +int CancelDC(HDC hDC); +int ChoosePixelFormat(HDC hdc,const PIXELFORMATDESCRIPTOR* ppfd); +int Chord(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); +int CloseEnhMetaFile(HDC hDC); +int CloseFigure(HDC hDC); +int CloseMetaFile(HDC hDC); +int CombineRgn(HRGN hrgnDest,HRGN hrgnSrc1,HRGN hrgnSrc2,DWORD fnCombineMode); +int CombineTransform(LPXFORM lpxformResult,const XFORM* lpxform1,const XFORM* lpxform2); +int CopyEnhMetaFile(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); +int CopyEnhMetaFileA(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); +int CopyEnhMetaFileW(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); +int CopyMetaFile(HMETAFILE hmfSrc,LPCTSTR lpszFile); +int CopyMetaFileA(HMETAFILE hmfSrc,LPCTSTR lpszFile); +int CopyMetaFileW(HMETAFILE hmfSrc,LPCTSTR lpszFile); +int CreateBitmap(int nWidth,int nHeight,UINT cPlanes,UINT cBitsPerPel,const VOID* lpvBits); +int CreateBitmapIndirect(const BITMAP* lpbm); +int CreateBrushIndirect(const LOGBRUSH* lplb); +int CreateCompatibleBitmap(HDC hDC,int nWidth,int nHeight); +int CreateCompatibleDC(HDC hDC); +int CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); +int CreateDCA(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); +int CreateDCW(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); +int CreateDIBPatternBrush(HGLOBAL hglbDIBPacked,UINT fuColorSpec); +int CreateDIBPatternBrushPt(const VOID* lpPackedDIB,DWORD iUsage); +int CreateDIBSection(HDC hDC,const BITMAPINFO* pbmi,DWORD iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset); +int CreateDIBitmap(HDC hDC,const BITMAPINFOHEADER* lpbmih,DWORD lpbmih,const VOID* lpbInit,const BITMAPINFO* lpbmi,DWORD fuUsage); +int CreateDiscardableBitmap(HDC hdc,int nWidth,int nHeight); +int CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int CreateEllipticRgnIndirect(const RECT* lprc); +int CreateEnhMetaFile(HDC hdcRef,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); +int CreateEnhMetaFileA(HDC hDC,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); +int CreateEnhMetaFileW(HDC hDC,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); +int CreateFont(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); +int CreateFontA(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); +int CreateFontIndirect(const LOGFONT* lplf); +int CreateFontIndirectA(const LOGFONT* lplf); +int CreateFontIndirectEx(const ENUMLOGFONTEXDV* penumlfex); +int CreateFontIndirectW(const LOGFONT* lplf); +int CreateFontW(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); +int CreateHalftonePalette(HDC hDC); +int CreateHatchBrush(DWORD fnStyle,COLORREF clrref); +int CreateIC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpdvmInit); +int CreateICA(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpdvmInit); +int CreateMetaFile(LPCTSTR lpszFile); +int CreateMetaFileA(LPCTSTR lpszFile); +int CreateMetaFileW(LPCTSTR lpszFile); +int CreatePalette(const LOGPALETTE* lplgpl); +int CreatePatternBrush(HBITMAP hbmp); +int CreatePolyPolygonRgn(const POINT* lppt,const INT* lpPolyCounts,int nCount,DWORD fnPolyFillMode); +int CreatePolygonRgn(const POINT* lppt,int cPoints,DWORD fnPolyFillMode); +int CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int CreateRectRgnIndirect(const RECT* lprc); +int CreateRoundRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidthEllipse,int nHeightEllipse); +int CreateScalableFontResource(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); +int CreateScalableFontResourceA(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); +int CreateScalableFontResourceW(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); +int CreateSolidBrush(COLORREF crColor); +int DPtoLP(HDC hDC,LPPOINT lpPoints,int nCount); +int DeleteDC(HDC hDC); +int DeleteEnhMetaFile(HENHMETAFILE hemf); +int DeleteMetaFile(HMETAFILE hmf); +int DeleteObject(HGDIOBJ hObject); +int DescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes,LPPIXELFORMATDESCRIPTOR ppfd); +int DrawEscape(HDC hDC,int nEscape,int cbInput,LPCSTR lpszInData); +int Ellipse(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int EndDoc(HDC hDC); +int EndPage(HDC hDC); +int EndPath(HDC hDC); +int EnumEnhMetaFile(HDC hDC,HENHMETAFILE hemf,ENHMFENUMPROC lpEnhMetaFunc,LPVOID lpData,const RECT* lpRect); +int EnumFontFamilies(HDC hdc,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); +int EnumFontFamiliesA(HDC hDC,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); +int EnumFontFamiliesEx(HDC hdc,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); +int EnumFontFamiliesExA(HDC hDC,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); +int EnumFontFamiliesExW(HDC hDC,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); +int EnumFontFamiliesW(HDC hDC,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); +int EnumFonts(HDC hdc,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); +int EnumFontsA(HDC hDC,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); +int EnumFontsW(HDC hDC,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); +int EnumMetaFile(HDC hDC,HMETAFILE hmf,MFENUMPROC lpMetaFunc,LPARAM lParam); +int EnumObjects(HDC hDC,int nObjectType,GOBJENUMPROC lpObjectFunc,LPARAM lParam); +int EqualRgn(HRGN hSrcRgn1,HRGN hSrcRgn2); +int Escape(HDC hDC,DWORD nEscape,int cbInput,LPCSTR lpvInData,LPVOID lpvOutData ); +int ExcludeClipRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int ExtCreateRegion(const XFORM* lpXform,DWORD nCount,const RGNDATA* lpRgnData); +int ExtEscape(HDC hdc,int nEscape,int cbInput,LPCSTR lpszInData,int cbOutput,LPSTR lpszOutData); +int ExtFloodFill(HDC hDC,int nXStart,int nYStart,COLORREF crColor,UINT fuFillType); +int ExtSelectClipRgn(HDC hDC,HRGN hrgn,DWORD fnMode); +int ExtTextOut(HDC hdc,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); +int ExtTextOutA(HDC hDC,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); +int ExtTextOutW(HDC hDC,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); +int FillPath(HDC hDC); +int FillRgn(HDC hDc,HRGN hrgn,HBRUSH hbr); +int FlattenPath(HDC hDC); +int FloodFill(HDC hDc,int nXStart,int nYStart,COLORREF crFill); +int FrameRgn(HDC hDc,HRGN hrgn,HBRUSH hbr,int nWidth,int nHeight); +int GdiComment(HDC hDC,UINT cbSize,const BYTE* lpData); +int GdiFlush(); +int GdiGetBatchLimit(); +int GdiSetBatchLimit(DWORD dwLimit); +int GetArcDirection(HDC hDC); +int GetAspectRatioFilterEx(HDC hDC); +int GetBitmapBits(HBITMAP hBitmap,LONG dwCount,LPVOID lpBits); +int GetBitmapDimensionEx(HBITMAP hBitmap,LPSIZE lpDimension); +int GetBkColor(HDC hDC); +int GetBkMode(HDC hDC); +int GetBoundsRect(HDC hDC,LPRECT lprcBounds,DWORD flags); +int GetBrushOrgEx(HDC hDC,LPPOINT lppt); +int GetCharABCWidths(HDC hdc,UINT uFirstChar,UINT uLastChar,LPABC lpabc); +int GetCharABCWidthsA(HDC hDC,UINT uFirstChar,UINT uLastChar,LPABC lpabc); +int GetCharABCWidthsFloat(HDC hdc,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); +int GetCharABCWidthsFloatA(HDC hDC,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); +int GetCharABCWidthsFloatW(HDC hDC,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); +int GetCharABCWidthsI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPABC lpabc); +int GetCharABCWidthsW(HDC hDC,UINT uFirstChar,UINT uLastChar,LPABC lpabc); +int GetCharWidth(HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer); +int GetCharWidth32(HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer); +int GetCharWidthA(HDC hDC,UINT iFirstChar,UINT iLastChar,LPINT lpStockBuffer); +int GetCharWidthFloat(HDC hdc,UINT iFirstChar,UINT iLastChar,PFLOAT pxBuffer); +int GetCharWidthI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPINT lpBuffer); +int GetCharWidthW(HDC hDC,UINT iFirstChar,UINT iLastChar,LPINT lpStockBuffer); +int GetCharacterPlacement(HDC hdc,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); +int GetCharacterPlacementA(HDC hDC,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); +int GetCharacterPlacementW(HDC hDC,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); +int GetClipBox(HDC hDC,LPRECT lprc); +int GetClipRgn(HDC hdc,HRGN hrgn); +int GetColorAdjustment(HDC hdc,LPCOLORADJUSTMENT lpca); +int GetCurrentObject(HDC hDC,DWORD uObjectType); +int GetCurrentPositionEx(HDC hDC,LPPOINT lpPoint); +int GetDCBrushColor(HDC hdc); +int GetDCOrgEx(HDC hDC,LPPOINT lpPoint); +int GetDCPenColor(HDC hdc); +int GetDIBColorTable(HDC hDC,UINT uStartIndex,UINT cEntries,RGBQUAD* pColors); +int GetDIBits(HDC hDC,HBITMAP hbmp,UINT uStartScan,UINT cScanLines,LPVOID lpvBits,LPBITMAPINFO lpbi,DWORD uUsage); +int GetDeviceCaps(HDC hDC,DWORD nIndex); +int GetEnhMetaFile(LPCTSTR lpszMetaFile); +int GetEnhMetaFileA(LPCTSTR lpszMetaFile); +int GetEnhMetaFileBits(HENHMETAFILE hemf,UINT cbBuffer,LPBYTE lpbBuffer); +int GetEnhMetaFileDescription(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); +int GetEnhMetaFileDescriptionA(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); +int GetEnhMetaFileDescriptionW(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); +int GetEnhMetaFileHeader(HENHMETAFILE hemf,UINT cbBuffer,LPENHMETAHEADER lpemh); +int GetEnhMetaFilePaletteEntries(HENHMETAFILE hemf,UINT cEntries,LPPALETTEENTRY lppe); +int GetEnhMetaFilePixelFormat(HENHMETAFILE hemf,DWORD cbBuffer,const PIXELFORMATDESCRIPTOR* ppfd); +int GetEnhMetaFileW(LPCTSTR lpszMetaFile); +int GetFontData(HDC hDC,DWORD dwTable,DWORD dwOffset,LPVOID lpvBuffer,DWORD cbData); +int GetFontLanguageInfo(HDC hDC); +int GetFontUnicodeRanges(HDC hdc,LPGLYPHSET lpgs); +int GetGlyphIndices(HDC hdc,LPCTSTR lpstr,int c,LPWORD pgi,DWORD fl); +int GetGlyphOutline(HDC hDC,UINT uChar,DWORD uFormat,LPGLYPHMETRICS lpgm,DWORD cbBuffer,LPVOID lpvBuffer,const MAT2* lpmat2); +int GetGlyphOutlineW(HDC hDC,UINT uChar,DWORD uFormat,LPGLYPHMETRICS lpgm,DWORD cbBuffer,LPVOID lpvBuffer,const MAT2* lpmat2); +int GetGraphicsMode(HDC hDC); +int GetKerningPairs(HDC hDC,DWORD nNumPairs,LPKERNINGPAIR lpkrnpair); +int GetKerningPairsW(HDC hDC,DWORD nNumPairs,LPKERNINGPAIR lpkrnpair); +int GetLayout(HDC hdc); +int GetMapMode(HDC hDC); +int GetMetaFileBitsEx(HMETAFILE hmf,UINT nSize,LPVOID lpvData); +int GetMetaRgn(HDC hdc,HRGN hrgn); +int GetMiterLimit(HDC hDC,PFLOAT peLimit); +int GetNearestColor(HDC hDC,COLORREF crColor); +int GetNearestPaletteIndex(HPALETTE hpal,COLORREF crColor); +int GetObject(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); +int GetObjectA(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); +int GetObjectType(HGDIOBJ hgdiobj); +int GetObjectW(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); +int GetOutlineTextMetrics(HDC hdc,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); +int GetOutlineTextMetricsA(HDC hDC,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); +int GetOutlineTextMetricsW(HDC hDC,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); +int GetPaletteEntries(HPALETTE hpal,UINT iStartIndex,UINT nEntries,LPPALETTEENTRY lppe); +int GetPath(HDC hDC,LPPOINT lpPoints,LPBYTE lpTypes,int nSize); +int GetPixel(HDC hDC,int XPos,int YPos); +int GetPixelFormat(HDC hdc); +int GetPolyFillMode(HDC hDC); +int GetROP2(HDC hDC); +int GetRandomRgn(HDC hdc,HRGN hrgn,DWORD iNum); +int GetRasterizerCaps(LPRASTERIZER_STATUS lprs,UINT cb); +int GetRegionData(HRGN hRgn,DWORD dwCount,LPRGNDATA lpRgnData); +int GetRgnBox(HRGN hrgn,LPRECT lprc); +int GetStockObject(int fnIndex); +int GetStretchBltMode(HDC hDC); +int GetSystemPaletteEntries(HDC hDC,UINT wStartIndex,UINT wNumEntries,LPPALETTEENTRY lpPaletteEntries); +int GetSystemPaletteUse(HDC hdc); +int GetTextAlign(HDC hDC); +int GetTextCharacterExtra(HDC hDC); +int GetTextCharset(HDC hDC); +int GetTextCharsetInfo(HDC hDC); +int GetTextColor(HDC hDC); +int GetTextExtentExPoint(HDC hdc,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); +int GetTextExtentExPointA(HDC hDC,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); +int GetTextExtentExPointI(HDC hdc,LPWORD pgiIn,int cgi,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); +int GetTextExtentExPointW(HDC hDC,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); +int GetTextExtentPoint(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize); +int GetTextExtentPoint32(HDC hdc,LPCTSTR lpString,int c,LPSIZE lpSize); +int GetTextExtentPoint32A(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); +int GetTextExtentPoint32W(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize); +int GetTextExtentPointA(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); +int GetTextExtentPointI(HDC hdc,LPWORD pgiIn,int cgi,LPSIZE lpSize); +int GetTextExtentPointW(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); +int GetTextFace(HDC hdc,int nCount,LPTSTR lpFaceName); +int GetTextFaceA(HDC hDC,int nCount,LPTSTR lpFaceName); +int GetTextFaceW(HDC hDC,int nCount,LPTSTR lpFaceName); +int GetTextMetrics(HDC hdc,LPTEXTMETRIC lptm); +int GetTextMetricsA(HDC hDC,LPTEXTMETRIC lptm); +int GetTextMetricsW(HDC hDC,LPTEXTMETRIC lptm); +int GetViewportExtEx(HDC hDC,LPSIZE lpSize); +int GetViewportOrgEx(HDC hDC,LPPOINT lpPoint); +int GetWinMetaFileBits(HENHMETAFILE hemf,UINT cbBuffer,LPBYTE lpbBuffer,DWORD fnMapMode,HDC hdcRef); +int GetWindowExtEx(HDC hWnd,LPSIZE lpSize); +int GetWindowOrgEx(HDC hWnd,LPPOINT lpPoint); +int GetWorldTransform(HDC hDC,LPXFORM lpXform); +int IntersectClipRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int InvertRgn(HDC hDC,HRGN hrgn); +int LPtoDP(HDC hDC,LPPOINT lpPoints,int nCount); +int LineDDA(int nXStart,int nYStart,int nXEnd,int nYEnd,LINEDDAPROC lpLineFunc,LPARAM lpData); +int LineTo(HDC hDC,int nXEnd,int nYEnd); +int MaskBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,HBITMAP hbmMask,int xMask,int yMask,DWORD dwRop); +int ModifyWorldTransform(HDC hDC,const XFORM* lpXform,DWORD iMode); +int MoveToEx(HDC hDC,int X,int Y,LPPOINT lpPoint); +int OffsetClipRgn(HDC hDC,int nXOffset,int nYOffset); +int OffsetRgn(HRGN hrgn,int nXOffset,int nYOffset); +int OffsetViewportOrgEx(HDC hDC,int nXOffset,int nYOffset,LPPOINT lpPoint); +int OffsetWindowOrgEx(HDC hDC,int nXOffset,int nYOffset,LPPOINT lpPoint); +int PaintRgn(HDC hDC,HRGN hrgn); +int PatBlt(HDC hDC,int nXLeft,int nYLeft,int nWidth,int nHeight,DWORD dwRop); +int PathToRegion(HDC hDC); +int Pie(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); +int PlayEnhMetaFile(HDC hDC,HENHMETAFILE hemf,const RECT* lpRect); +int PlayEnhMetaFileRecord(HDC hDC,LPHANDLETABLE lpHandletable,const ENHMETARECORD* lpEnhMetaRecord,UINT nHandles); +int PlayMetaFile(HDC hDC,HMETAFILE hmf); +int PlayMetaFileRecord(HDC hDC,LPHANDLETABLE lpHandletable,LPMETARECORD lpMetaRecord,UINT nHandles); +int PlgBlt(HDC hdcDest,const POINT* lpPoint,HDC hdcSrc,int nXSrc,int nYSrc,int nWidth,int nHeight,HBITMAP hbmMask,int xMask,int yMask); +int PolyBezier(HDC hDC,const POINT* lppt,DWORD lppt); +int PolyBezierTo(HDC hdc,const POINT* lppt,DWORD cCount); +int PolyDraw(HDC hDC,const POINT* lppt,const BYTE* lpbTypes,int cCount); +int PolyPolygon(HDC hDC,const POINT* lpPoints,const INT* lpPolyCounts,int nCount); +int PolyPolyline(HDC hDC,const POINT* lppt,const DWORD* lpdwPolyPoints,DWORD cCount); +int PolyTextOut(HDC hdc,const POLYTEXT* pptxt,int cStrings); +int PolyTextOutA(HDC hDC,const POLYTEXT* pptxt,int cStrings); +int PolyTextOutW(HDC hDC,const POLYTEXT* pptxt,int cStrings); +int Polygon(HDC hDC,const POINT* lpPoints,int nCount); +int Polyline(HDC hDC,const POINT* lppt,int cPoints); +int PolylineTo(HDC hdc,const POINT* lppt,DWORD cCount); +int PtInRegion(HRGN hrgn,int X,int Y); +int PtVisible(HDC hDC,int X,int Y); +int RealizePalette(DWORD hDC); +int RealizePalette(HDC hDC); +int RectInRegion(HRGN hrgn,const RECT* lprc); +int RectVisible(HDC hDC,const RECT* lprc); +int Rectangle(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int RemoveFontMemResourceEx(HANDLE fh); +int RemoveFontResource(LPCTSTR lpFileName); +int RemoveFontResourceA(LPCTSTR lpFileName); +int RemoveFontResourceEx(LPCTSTR lpFileName,DWORD fl,PVOID pdv); +int RemoveFontResourceW(LPCTSTR lpFileName); +int ResetDC(HDC hdc,const DEVMODE* lpInitData); +int ResetDCA(HDC hDc,const DEVMODE* lpInitData); +int ResetDCW(HDC hDc,const DEVMODE* lpInitData); +int ResizePalette(HPALETTE hpal,UINT nEntries); +int RestoreDC(HDC hDC,int nSavedDC); +int RoundRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidth,int nHeight); +int SaveDC(HDC hDC); +int ScaleViewportExtEx(HDC hDC,int Xnum,int Xdenom,int Ynum,int Ydenom,LPSIZE lpSize); +int ScaleWindowExtEx(HDC hDC,int Xnum,int Xdenom,int Ynum,int Ydenom,LPSIZE lpSize); +int SelectClipPath(HDC hDC,int iMode); +int SelectClipRgn(HDC hDC,HRGN hrgn); +int SelectObject(HDC hDC,HGDIOBJ hObjec); +int SelectPalette(HDC hDC,HPALETTE hpal,BOOL bForceBackground); +int SetAbortProc(HDC hDC,ABORTPROC lpAbortProc); +int SetArcDirection(HDC hDC,int ArcDirection); +int SetBitmapBits(HBITMAP hbmp,DWORD cBytes,const VOID* lpBits); +int SetBitmapDimensionEx(HBITMAP hBitmap,int nWidth,int nHeight,LPSIZE lpSize); +int SetBkColor(HDC hDC,COLORREF crColor); +int SetBkMode(HDC hDC,DWORD iBkMode); +int SetBoundsRect(HDC hDC,const RECT* lprcBounds,DWORD flags); +int SetBrushOrgEx(HDC hDC,int nXOrg,int nYOrg,LPPOINT lppt); +int SetColorAdjustment(HDC hdc,const COLORADJUSTMENT* lpca); +int SetDCBrushColor(HDC hdc,COLORREF crColor); +int SetDCPenColor(HDC hdc,COLORREF crColor); +int SetDIBColorTable(HDC hDC,UINT un1,UINT un2,const RGBQUAD* pcRGBQuad); +int SetDIBits(HDC hDC,HBITMAP hbmp,UINT uStartScan,UINT cScanLines,const VOID* lpvBits,const BITMAPINFO* lpbmi,DWORD fuColorUse); +int SetDIBitsToDevice(HDC hDC,int XDest,int YDest,DWORD dwWidth,DWORD dwHeight,int XSrc,int YSrc,UINT uStartScan,UINT cScanLines,const VOID* lpvBits,const BITMAPINFO* lpbmi,DWORD fuColorUse); +int SetEnhMetaFileBits(UINT cbBuffer,const BYTE* lpData); +int SetGraphicsMode(HDC hDC,DWORD iMode); +int SetLayout(HDC hdc,DWORD dwLayout); +int SetMapMode(HDC hDC,DWORD fnMapMode); +int SetMapperFlags(HDC hDC,DWORD dwFlag); +int SetMetaFileBitsEx(UINT nSize,const BYTE* lpData); +int SetMetaRgn(HDC hdc); +int SetMiterLimit(HDC hDC,FLOAT eNewLimit,PFLOAT peOldLimit); +int SetPaletteEntries(HPALETTE hpal,UINT iStart,UINT cEntries,const PALETTEENTRY* lppe); +int SetPixel(HDC hDC,int X,int Y,COLORREF crColor); +int SetPixelFormat(HDC hdc,int iPixelFormat,const PIXELFORMATDESCRIPTOR* ppfd); +int SetPixelV(HDC hDC,int X,int Y,COLORREF crColor); +int SetPolyFillMode(HDC hDC,DWORD iPolyFillMode); +int SetROP2(HDC hDC,DWORD fnDrawMode2); +int SetRectRgn(HRGN hrgn,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); +int SetStretchBltMode(HDC hDC,DWORD iStretchMode); +int SetSystemPaletteUse(HDC hdc,UINT uUsage); +int SetTextAlign(HDC hDC,DWORD fMode); +int SetTextCharacterExtra(HDC hDC,int nCharExtra); +int SetTextColor(HDC hDC,COLORREF crColor); +int SetTextJustification(HDC hDC,int nBreakExtra,int nBreakCount); +int SetViewportExtEx(HDC hDc,int nXExtent,int nYExtent,LPSIZE lpSize); +int SetViewportOrgEx(HDC hDC,int X,int Y,LPPOINT lpPoint); +int SetWinMetaFileBits(UINT nBufferSize,const BYTE* lpbBuffer,HDC hdcRef,const METAFILEPICT* lpmfp); +int SetWindowExtEx(HDC hDC,int nXExtent,int nYExtent,LPSIZE lpSize); +int SetWindowOrgEx(HDC hDC,int X,int Y,LPPOINT lpPoint); +int SetWorldTransform(HDC hDC,const XFORM* lpXform); +int StartDoc(HDC hdc,const DOCINFO* lpdi); +int StartDocA(HDC hDC,const DOCINFO* lpdi); +int StartDocW(HDC hDC,const DOCINFO* lpdi); +int StartPage(HDC hDC); +int StretchBlt(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,DWORD dwRop); +int StretchDIBits(HDC hDC,int XDest,int YDest,int nDestWidth,int nDestHeight,int XSrc,int YSrc,int nSrcWidth,int nSrcHeight,const VOID* lpBits,const BITMAPINFO* lpBitsInf,DWORD iUsage,DWORD dwRop); +int StrokeAndFillPath(HDC hDC); +int StrokePath(HDC hDC); +int SwapBuffers(HDC hdc); +int TextOut(HDC hdc,int nXStart,int nYStart,LPCTSTR lpString,int cbString); +int TextOutA(HDC hDC,int nXStart,int nYStart,LPCTSTR lpString,int cbString); +int TextOutW(HDC hDC,int nXStart,int nYStart,LPCTSTR lpString,int cbString); +int TranslateCharsetInfo(DWORD* lpSrc,LPCHARSETINFO lpCharsetInfo,DWORD dwFlags); +int UnrealizeObject(HGDIOBJ hgdiobj); +int UpdateColors(HDC hdc); +int WidenPath(HDC hDC); +HPEN CreatePen(int fnPenStyle,int nWidth,COLORREF crColor); \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/kernel32.txt b/x64_dbg_gui/Project/Data/kernel32.txt new file mode 100644 index 00000000..94731120 --- /dev/null +++ b/x64_dbg_gui/Project/Data/kernel32.txt @@ -0,0 +1,1047 @@ +int AcquireSRWLockExclusive(PSRWLOCK SRWLock); +int AcquireSRWLockShared(PSRWLOCK SRWLock); +int ActivateActCtx(HANDLE hActCtx,ULONG_PTR* lpCookie); +int AddAtom(LPCTSTR lpString); +int AddAtomA(LPCTSTR lpString); +int AddAtomW(LPCTSTR lpString); +int AddConsoleAlias(LPCTSTR Source,LPCTSTR Target,LPCTSTR ExeName); +int AddRefActCtx(HANDLE hActCtx); +int AddSIDToBoundaryDescriptor(HANDLE* BoundaryDescriptor,PSID RequiredSid); +int AddSecureMemoryCacheCallback(PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack); +int AddVectoredContinueHandler(ULONG FirstHandler,PVECTORED_EXCEPTION_HANDLER VectoredHandler); +int AddVectoredExceptionHandler(ULONG FirstHandler,PVECTORED_EXCEPTION_HANDLER VectoredHandler); +int AdjustCalendarDate(LPCALDATETIME lpCalDateTime,CALDATETIME_DATEUNIT calUnit,INT amount); +int AllocConsole(); +int AllocateUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); +int AllocateUserPhysicalPagesNuma(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR PageArray,DWORD nndPreferred); +int ApplicationRecoveryFinished(BOOL bSuccess); +int ApplicationRecoveryInProgress(PBOOL pbCanceled); +int AreFileApisANSI(); +int AssignProcessToJobObject(HANDLE hJob,HANDLE hProcess); +int AttachConsole(DWORD dwProcessId); +int BackupRead(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,BOOL bAbort,BOOL bProcessSecurity,LPVOID* lpContext); +int BackupSeek(HANDLE hFile,DWORD dwLowBytesToSeek,DWORD dwHighBytesToSeek,LPDWORD lpdwLowByteSeeked,LPDWORD lpdwHighByteSeeked,LPVOID* lpContext); +int BackupWrite(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,BOOL bAbort,BOOL bProcessSecurity,LPVOID* lpContext); +int Beep(DWORD dwFreq,DWORD dwDuration); +int BeginUpdateResource(LPCTSTR pFileName,BOOL bDeleteExistingResources); +int BindIoCompletionCallback(HANDLE FileHandle,LPOVERLAPPED_COMPLETION_ROUTINE Function,ULONG Flags); +int BuildCommDCB(LPCTSTR lpDef,LPDCB lpDCB); +int BuildCommDCBAndTimeouts(LPCTSTR lpDef,LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts); +int CallbackMayRunLong(PTP_CALLBACK_INSTANCE pci); +int CancelIo(HANDLE hFile); +int CancelIoEx(HANDLE hFile,LPOVERLAPPED lpOverlapped); +int CancelSynchronousIo(HANDLE hThread); +int CancelThreadpoolIo(PTP_IO pio); +int CancelWaitableTimer(HANDLE hTimer); +int ChangeTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); +int CheckNameLegalDOS8Dot3(LPCTSTR lpName,LPSTR lpOemName,DWORD OemNameSize,PBOOL pbNameContainsSpaces,PBOOL pbNameLegal); +int CheckRemoteDebuggerPresent(HANDLE hProcess,PBOOL pbDebuggerPresent); +int ClearCommBreak(HANDLE hFile); +int ClearCommError(HANDLE hFile,LPDWORD lpErrors,LPCOMSTAT lpStat); +int CloseHandle(HANDLE hObject); +int ClosePrivateNamespace(HANDLE Handle,DWORD Flags); +int CloseThreadpool(PTP_POOL ptpp); +int CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg); +int CloseThreadpoolCleanupGroupMembers(PTP_CLEANUP_GROUP ptpcg,BOOL fCancelPendingCallbacks,PVOID pvCleanupContext); +int CloseThreadpoolIo(PTP_IO pio); +int CloseThreadpoolTimer(PTP_TIMER pti); +int CloseThreadpoolWait(PTP_WAIT pwa); +int CloseThreadpoolWork(PTP_WORK pwk); +int CommConfigDialog(LPCTSTR lpszName,HWND hWnd,LPCOMMCONFIG lpCC); +int CompareFileTime(const FILETIME* lpFileTime1,const FILETIME* lpFileTime2); +int CompareString(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); +int CompareStringA(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); +int CompareStringEx(LPCWSTR lpLocaleName,DWORD dwCmpFlags,LPCWSTR lpString1,int cchCount1,LPCWSTR lpString2,int cchCount2,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); +int CompareStringOrdinal(LPCWSTR lpString1,int cchCount1,LPCWSTR lpString2,int cchCount2,BOOL bIgnoreCase); +int CompareStringW(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); +int ContinueDebugEvent(DWORD dwProcessId,DWORD dwThreadId,DWORD dwContinueStatus); +int ConvertCalDateTimeToSystemTime(const LPCALDATETIME lpCalDateTime,SYSTEMTIME* lpSysTime); +int ConvertDefaultLocale(LCID Locale); +int ConvertFiberToThread(); +int ConvertSystemTimeToCalDateTime(const SYSTEMTIME lpSysTime,CALID calId,LPCALDATETIME lpCalDateTime); +int ConvertThreadToFiber(LPVOID lpParameter); +int ConvertThreadToFiberEx(LPVOID lpParameter,DWORD dwFlags); +int CopyExtendedContext(PCONTEXT_EX Destination,DWORD ContextFlags,PCONTEXT_EX Source); +int CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); +int CopyFileA(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); +int CopyFileEx(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags); +int CopyFileTransacted(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags,HANDLE hTransaction); +int CopyFileW(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); +int CreateActCtx(PACTCTX pActCtx); +int CreateActCtxA(PACTCTX actctx); +int CreateActCtxW(PACTCTX actctx); +int CreateBoundaryDescriptor(LPCTSTR Name,ULONG Flags); +int CreateConsoleScreenBuffer(DWORD dwDesiredAccess,DWORD dwShareMode,const SECURITY_ATTRIBUTES* lpSecurityAttributes,DWORD dwFlags,LPVOID lpScreenBufferData); +int CreateDirectory(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateDirectoryA(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES pSecurityAttributes); +int CreateDirectoryEx(LPCTSTR lpTemplateDirectory,LPCTSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateDirectoryTransacted(LPCTSTR lpTemplateDirectory,LPCTSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes,HANDLE hTransaction); +int CreateDirectoryW(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES pSecurityAttributes); +int CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); +int CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); +int CreateEventEx(LPSECURITY_ATTRIBUTES lpEventAttributes,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); +int CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); +int CreateFiber(SIZE_T dwStackSize,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter); +int CreateFiberEx(SIZE_T dwStackCommitSize,SIZE_T dwStackReserveSize,DWORD dwFlags,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter); +int CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); +int CreateFileA(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); +int CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); +int CreateFileMappingA(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); +int CreateFileMappingNuma(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName,DWORD nndPreferred); +int CreateFileMappingW(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); +int CreateFileTransacted(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile,HANDLE hTransaction,PUSHORT pusMiniVersion,PVOID pExtendedParameter); +int CreateFileW(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); +int CreateHardLink(LPCTSTR lpFileName,LPCTSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateHardLinkTransacted(LPCTSTR lpFileName,LPCTSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes,HANDLE hTransaction); +int CreateIoCompletionPort(HANDLE FileHandle,HANDLE ExistingCompletionPort,ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThreads); +int CreateJobObject(LPSECURITY_ATTRIBUTES lpJobAttributes,LPCTSTR lpName); +int CreateMailslot(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateMailslotA(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateMailslotW(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); +int CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType); +int CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); +int CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); +int CreateMutexEx(LPSECURITY_ATTRIBUTES lpMutexAttributes,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); +int CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); +int CreatePrivateNamespace(LPSECURITY_ATTRIBUTES lpPrivateNamespaceAttributes,LPVOID lpBoundaryDescriptor,LPCTSTR lpAliasPrefix); +bool CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); +bool CreateProcessA(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); +bool CreateProcessW(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); +int CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId); +int CreateRemoteThreadEx(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,LPDWORD lpThreadId); +int CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); +int CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); +int CreateSemaphoreEx(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); +int CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); +int CreateSymbolicLink(LPTSTR lpSymlinkFileName,LPTSTR lpTargetFileName,DWORD dwFlags); +int CreateSymbolicLinkTransacted(LPTSTR lpSymlinkFileName,LPTSTR lpTargetFileName,DWORD dwFlags,HANDLE hTransaction); +int CreateTapePartition(HANDLE hDevice,DWORD dwPartitionMethod,DWORD dwCount,DWORD dwSize); +HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE dwThreadFunction,LPVOID pThreadParm,DWORD dwCreationFlags,LPDWORD lpThreadId); +int CreateThreadpool(PVOID reserved); +int CreateThreadpoolCleanupGroup(); +int CreateThreadpoolIo(HANDLE fl,PTP_WIN32_IO_CALLBACK pfnio,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); +int CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnti,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); +int CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); +int CreateThreadpoolWork(PTP_WORK_CALLBACK pfnwk,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); +int CreateTimerQueue(); +int CreateTimerQueueTimer(PHANDLE phNewTimer,HANDLE TimerQueue,WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,DWORD Flags); +int CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID); +int CreateUmsCompletionList(PUMS_COMPLETION_LIST* UmsCompletionList); +int CreateUmsThreadContext(PUMS_CONTEXT* lpUmsThread); +int CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); +int CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); +int CreateWaitableTimerEx(LPSECURITY_ATTRIBUTES lpTimerAttributes,LPCTSTR lpTimerName,DWORD dwFlags,DWORD dwDesiredAccess); +int CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); +int DeactivateActCtx(DWORD dwFlags,ULONG_PTR ulCookie); +int DebugActiveProcess(DWORD dwProcessId); +int DebugActiveProcessStop(DWORD dwProcessId); +int DebugBreak(); +int DebugBreakProcess(HANDLE Process); +int DebugSetProcessKillOnExit(BOOL KillOnExit); +int DeleteAtom(ATOM nAtom); +int DeleteBoundaryDescriptor(HANDLE BoundaryDescriptor); +int DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +int DeleteFiber(LPVOID lpFiber); +int DeleteFile(LPCTSTR lpFileName); +int DeleteFileA(LPCTSTR lpFileName); +int DeleteFileTransacted(LPCTSTR lpFileName,HANDLE hTransaction); +int DeleteFileW(LPCTSTR lpFileName); +int DeleteProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList); +int DeleteTimerQueue(HANDLE TimerQueue); +int DeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); +int DeleteTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); +int DeleteUmsCompletionList(PUMS_COMPLETION_LIST UmsCompletionList); +int DeleteUmsThreadContext(PUMS_CONTEXT UmsThread); +int DequeueUmsCompletionListItems(PUMS_COMPLETION_LIST UmsCompletionList,DWORD WaitTimeOut,PUMS_CONTEXT* UmsThreadList); +int DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID pOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped); +int DisableThreadLibraryCalls(HMODULE hModule); +int DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci); +int DnsHostnameToComputerName(LPCTSTR Hostname,LPTSTR ComputerName,LPDWORD nSize); +int DosDateTimeToFileTime(WORD wFatDate,WORD wFatTime,LPFILETIME lpFileTime); +int DuplicateHandle(HANDLE hSourceProcessHandle,HANDLE hSourceHandle,HANDLE hTargetProcessHandle,LPHANDLE pTargetHandle,DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwOptions); +int EmptyWorkingSet(HANDLE hProcess); +int EndUpdateResource(HANDLE hUpdate,BOOL fDiscard); +int EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +int EnterUmsSchedulingMode(PUMS_SCHEDULER_STARTUP_INFO SchedulerStartupInfo); +int EnumCalendarInfo(CALINFO_ENUMPROC pCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); +int EnumCalendarInfoA(CALINFO_ENUMPROC lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); +int EnumCalendarInfoEx(CALINFO_ENUMPROCEX pCalInfoEnumProcEx,LCID Locale,CALID Calendar,CALTYPE CalType); +int EnumCalendarInfoExEx(CALINFO_ENUMPROCEXEX pCalInfoEnumProcExEx,LPCWSTR lpLocaleName,CALID Calendar,LPCWSTR lpReserved,CALTYPE CalType,LPARAM lParam); +int EnumCalendarInfoW(CALINFO_ENUMPROC lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); +int EnumDateFormats(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); +int EnumDateFormatsA(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); +int EnumDateFormatsEx(DATEFMT_ENUMPROCEX lpDateFmtEnumProcEx,LCID Locale,DWORD dwFlags); +int EnumDateFormatsExEx(DATEFMT_ENUMPROCEXEX lpDateFmtEnumProcExEx,LPCWSTR lpLocaleName,DWORD dwFlags,LPARAM lParam); +int EnumDateFormatsW(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); +int EnumDeviceDrivers(LPVOID* lpImageBase,DWORD cb,LPDWORD lpcbNeeded); +int EnumLanguageGroupLocales(LANGGROUPLOCALE_ENUMPROC lpLangGroupLocaleEnumProc,LGRPID LanguageGroup,DWORD dwFlags,LONG_PTR lParam); +int EnumPageFiles(PENUM_PAGE_CALLBACK pCallbackRoutine,LPVOID lpContext); +int EnumProcessModules(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded); +int EnumProcessModulesEx(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded,DWORD dwFilterFlag); +int EnumProcesses(LPVOID pProcessIds,DWORD cb,DWORD* pBytesReturned); +int EnumResourceLanguages(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,ENUMRESLANGPROC lpEnumFunc,LONG_PTR lParam); +int EnumResourceLanguagesEx(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,ENUMRESLANGPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); +int EnumResourceNames(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR lParam); +int EnumResourceNamesA(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR IParam); +int EnumResourceNamesEx(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); +int EnumResourceNamesW(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR IParam); +int EnumResourceTypes(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR lParam); +int EnumResourceTypesA(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR IParam); +int EnumResourceTypesEx(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); +int EnumSystemCodePages(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); +int EnumSystemCodePagesA(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); +int EnumSystemCodePagesW(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); +int EnumSystemFirmwareTables(DWORD FirmwareTableProviderSignature,PVOID pFirmwareTableBuffer,DWORD BufferSize); +int EnumSystemGeoID(GEOCLASS GeoClass,GEOID ParentGeoId,GEO_ENUMPROC lpGeoEnumProc); +int EnumSystemLanguageGroups(LANGUAGEGROUP_ENUMPROC lpLanguageGroupEnumProc,DWORD dwFlags,LONG_PTR lParam); +int EnumSystemLocales(LOCALE_ENUMPROC lpLocaleEnumProc,DWORD dwFlags); +int EnumSystemLocalesA(LOCALE_ENUMPROC pLocaleEnumProc,DWORD dwFlags); +int EnumSystemLocalesEx(LOCALE_ENUMPROCEX lpLocaleEnumProcEx,DWORD dwFlags,LPARAM lParam,LPVOID lpReserved); +int EnumSystemLocalesW(LOCALE_ENUMPROC pLocaleEnumProc,DWORD dwFlags); +int EnumTimeFormats(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); +int EnumTimeFormatsA(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); +int EnumTimeFormatsEx(TIMEFMT_ENUMPROCEX lpTimeFmtEnumProcEx,LPCWSTR lpLocaleName,DWORD dwFlags,LPARAM lParam); +int EnumTimeFormatsW(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); +int EraseTape(HANDLE hDevice,DWORD dwEraseType,BOOL bImmediate); +int EscapeCommFunction(HANDLE hFile,DWORD dwFunc); +int ExecuteUmsThread(PUMS_CONTEXT UmsThread); +VOID ExitProcess(UINT uExitCode); +int ExitThread(DWORD uExitCode); +int ExpandEnvironmentStrings(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); +int ExpandEnvironmentStringsA(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); +int ExpandEnvironmentStringsW(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); +int FatalAppExit(UINT uAction,LPCTSTR lpMessageText); +int FatalExit(int ExitCode); +int FileTimeToDosDateTime(const FILETIME* lpFileTime,LPWORD lpFatDate,LPWORD lpFatTime); +int FileTimeToLocalFileTime(const FILETIME* lpFileTime,LPFILETIME lpLocalFileTime); +int FileTimeToSystemTime(const FILETIME* lpFileTime,LPSYSTEMTIME lpSystemTime); +int FillConsoleOutputAttribute(HANDLE hConsoleOutput,WORD wAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten); +int FillConsoleOutputCharacter(HANDLE hConsoleOutput,TCHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); +int FillConsoleOutputCharacterA(HANDLE hConsoleOutput,TCHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); +int FindActCtxSectionGuid(DWORD dwFlags,const GUID* lpExtensionGuid,DWORD ulSectionId,const GUID* lpGuidToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData); +int FindActCtxSectionString(DWORD dwFlags,const GUID* lpExtensionGuid,DWORD ulSectionId,LPCTSTR lpStringToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData); +int FindAtom(LPCTSTR lpString); +int FindAtomA(LPCTSTR lpString); +int FindAtomW(LPCTSTR lpString); +int FindClose(HANDLE hFindFile); +int FindCloseChangeNotification(HANDLE hChangeHandle); +int FindCloseChangeNotificationA(HANDLE hChangeHandle); +int FindCloseChangeNotificationW(HANDLE hChangeHandle); +int FindFirstChangeNotification(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); +int FindFirstChangeNotificationA(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); +int FindFirstChangeNotificationW(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); +int FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); +int FindFirstFileA(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); +int FindFirstFileEx(LPCTSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags); +int FindFirstFileNameTransactedW(LPCWSTR lpFileName,DWORD dwFlags,LPDWORD StringLength,PWCHAR LinkName,HANDLE hTransaction); +int FindFirstFileNameW(LPCWSTR lpFileName,DWORD dwFlags,LPDWORD StringLength,PWCHAR LinkName); +int FindFirstFileTransacted(LPCTSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags,HANDLE hTransaction); +int FindFirstFileW(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); +int FindFirstStreamTransactedW(LPCWSTR lpFileName,STREAM_INFO_LEVELS InfoLevel,LPVOID lpFindStreamData,DWORD dwFlags,HANDLE hTransaction); +int FindFirstStreamW(LPCWSTR lpFileName,STREAM_INFO_LEVELS InfoLevel,LPVOID lpFindStreamData,DWORD dwFlags); +int FindNLSString(LCID Locale,DWORD dwFindNLSStringFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,LPINT pcchFound); +int FindNLSStringEx(LPCWSTR lpLocaleName,DWORD dwFindNLSStringFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,LPINT pcchFound,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); +int FindNextChangeNotification(HANDLE hChangeHandle ); +int FindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); +int FindNextFileA(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); +int FindNextFileNameW(HANDLE hFindStream,LPDWORD StringLength,PWCHAR LinkName); +int FindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); +int FindNextStreamW(HANDLE hFindStream,LPVOID lpFindStreamData); +int FindResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); +int FindResourceA(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); +int FindResourceEx(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); +int FindResourceExA(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); +int FindResourceExW(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); +int FindResourceW(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); +int FindStringOrdinal(DWORD dwFindStringOrdinalFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,BOOL bIgnoreCase); +int FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +int FlsFree(DWORD dwFlsIndex); +int FlsGetValue(DWORD dwFlsIndex); +int FlsSetValue(DWORD dwFlsIndex,PVOID lpFlsData); +int FlushConsoleInputBuffer(HANDLE hConsoleInput); +int FlushFileBuffers(HANDLE hFile); +int FlushInstructionCache(HANDLE hProcess,LPCVOID lpBaseAddress,SIZE_T dwSize); +int FlushProcessWriteBuffers(); +int FlushViewOfFile(LPCVOID lpBaseAddress,SIZE_T dwNumberOfBytesToFlush); +int FoldString(DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); +int FormatMessage(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPTSTR lpBuffer,DWORD nSize,va_list* Arguments); +int FormatMessageA(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPTSTR lpBuffer,DWORD nSize,va_list* Arguments); +int FreeConsole(); +int FreeEnvironmentStrings(LPTCH lpszEnvironmentBlock); +int FreeEnvironmentStringsA(LPTCH lpszEnvironmentBlock); +int FreeEnvironmentStringsW(LPTCH lpszEnvironmentBlock); +int FreeLibrary(HMODULE hLibModule); +int FreeLibraryAndExitThread(HMODULE hModule,DWORD dwExitCode); +int FreeLibraryWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HMODULE mod); +int FreeResource(HGLOBAL HretResource); +int FreeUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); +int GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,DWORD dwProcessGroupId); +int GetACP(); +int GetActiveProcessorCount(WORD GroupNumber); +int GetActiveProcessorGroupCount(); +int GetApplicationRecoveryCallback(HANDLE hProcess,APPLICATION_RECOVERY_CALLBACK* pRecoveryCallback,PVOID* ppvParameter,DWORD dwPingInterval,DWORD dwFlags); +int GetApplicationRestartSettings(HANDLE hProcess,PWSTR pwzCommandline,PDWORD pcchSize,PDWORD pdwFlags); +int GetAtomName(ATOM nAtom,LPTSTR lpBuffer,int nSize); +int GetAtomNameA(ATOM nAtom,LPTSTR lpBuffer,int nSize); +int GetAtomNameW(ATOM nAtom,LPTSTR lpBuffer,int nSize); +int GetBinaryType(LPCTSTR lpApplicationName,DWORD lpBinaryType); +int GetBinaryTypeA(LPCTSTR lpApplicationName,DWORD lpBinaryType); +int GetBinaryTypeW(LPCTSTR lpApplicationName,DWORD lpBinaryType); +int GetCPInfo(UINT CodePage,LPCPINFO lpCPInfo); +int GetCPInfoEx(UINT CodePage,DWORD dwFlags,LPCPINFOEX lpCPInfoEx); +int GetCalendarDateFormatEx(LPCWSTR lpszLocale,DWORD dwFlags,const LPCALDATETIME lpCalDateTime,LPCWSTR lpFormat,LPWSTR lpDateStr,int cchDate); +int GetCalendarInfo(LCID Locale,CALID Calendar,CALTYPE CalType,LPTSTR lpCalData,int cchData,LPDWORD lpValue); +int GetCalendarInfoEx(LPCWSTR lpLocaleName,CALID Calendar,LPCWSTR lpReserved,CALTYPE CalType,LPWSTR lpCalData,int cchData,LPDWORD lpValue); +int GetCalendarSupportedDateRange(CALID Calendar,LPCALDATETIME lpCalMinDateTime,LPCALDATETIME lpCalMaxDateTime); +int GetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,LPDWORD lpdwSize); +int GetCommMask(HANDLE hFile,LPDWORD lpEvtMask); +int GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat); +int GetCommProperties(HANDLE hFile,LPCOMMPROP lpCommProp); +int GetCommState(HANDLE hFile,LPDCB lpDCB); +int GetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts); +int GetCommandLine(); +int GetCommandLineA(); +int GetCommandLineW(); +int GetCompressedFileSize(LPCTSTR lpFileName,LPDWORD lpFileSizeHigh); +int GetCompressedFileSizeTransacted(LPCTSTR lpFileName,LPDWORD lpFileSizeHigh,HANDLE hTransaction); +int GetComputerName(LPTSTR lpBuffer,LPDWORD lpnSize); +int GetComputerNameA(LPTSTR lpBuffer,LPDWORD nBufferSize); +int GetComputerNameEx(COMPUTER_NAME_FORMAT NameType,LPTSTR lpBuffer,LPDWORD lpnSize); +int GetComputerNameW(LPTSTR lpBuffer,LPDWORD nBufferSize); +int GetConsoleAlias(LPTSTR lpSource,LPTSTR lpTargetBuffer,DWORD TargetBufferLength,LPTSTR lpExeName); +int GetConsoleAliasExes(LPTSTR lpExeNameBuffer,DWORD ExeNameBufferLength); +int GetConsoleAliasExesLength(); +int GetConsoleAliases(LPTSTR lpAliasBuffer,DWORD AliasBufferLength,LPTSTR lpExeName); +int GetConsoleAliasesLength(LPTSTR lpExeName); +int GetConsoleCP(); +int GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo); +int GetConsoleDisplayMode(LPDWORD lpdwMode); +int GetConsoleFontSize(HANDLE hConsoleOutput,DWORD nFont); +int GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); +int GetConsoleMode(HANDLE hConsoleHandle,DWORD lpMode); +int GetConsoleOriginalTitle(LPTSTR lpConsoleTitle,DWORD nSize); +int GetConsoleOutputCP(); +int GetConsoleProcessList(LPDWORD lpdwProcessList,DWORD dwProcessCount); +int GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); +int GetConsoleScreenBufferInfoEx(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); +int GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo); +int GetConsoleTitle(LPTSTR lpConsoleTitle,DWORD nSize); +int GetConsoleWindow(); +int GetCurrencyFormat(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); +int GetCurrencyFormatA(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); +int GetCurrencyFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,LPCWSTR lpValue,const CURRENCYFMT* lpFormat,LPWSTR lpCurrencyStr,int cchCurrency); +int GetCurrencyFormatW(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); +int GetCurrentActCtx(HANDLE* lphActCtx); +int GetCurrentConsoleFont(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFO lpConsoleCurrentFont); +int GetCurrentConsoleFontEx(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); +int GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer); +int GetCurrentDirectoryA(DWORD nBufferSize,LPTSTR lpBuffer); +int GetCurrentDirectoryW(DWORD nBufferSize,LPTSTR lpBuffer); +int GetCurrentProcess(); +int GetCurrentProcessId(); +int GetCurrentProcessorNumber(); +int GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); +int GetCurrentThread(); +int GetCurrentThreadId(); +int GetCurrentUmsThread(); +int GetDateFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); +int GetDateFormatA(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); +int GetDateFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCWSTR lpFormat,LPWSTR lpDateStr,int cchDate,LPCWSTR lpCalendar); +int GetDateFormatW(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); +int GetDefaultCommConfig(LPCTSTR lpszName,LPCOMMCONFIG lpCC,LPDWORD lpdwSize); +int GetDeviceDriverBaseName(LPVOID ImageBase,LPTSTR lpBaseName,DWORD nSize); +int GetDeviceDriverFileName(LPVOID ImageBase,LPTSTR lpFilename,DWORD nSize); +int GetDevicePowerState(HANDLE hDevice,BOOL* pfOn); +int GetDiskFreeSpace(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); +int GetDiskFreeSpaceA(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); +int GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); +int GetDiskFreeSpaceExA(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); +int GetDiskFreeSpaceExW(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); +int GetDiskFreeSpaceW(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); +int GetDllDirectory(DWORD nBufferLength,LPTSTR lpBuffer); +int GetDurationFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDuration,ULONGLONG ullDuration,LPCWSTR lpFormat,LPWSTR lpDurationStr,int cchDuration); +int GetDurationFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpDuration,ULONGLONG ullDuration,LPCWSTR lpFormat,LPWSTR lpDurationStr,int cchDuration); +int GetDynamicTimeZoneInformation(PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation); +int GetEnabledExtendedFeatures(DWORD64 FeatureMask); +int GetEnvironmentStrings(); +int GetEnvironmentStringsW(); +int GetEnvironmentVariable(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nSize); +int GetEnvironmentVariableA(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nBufferSize); +int GetEnvironmentVariableW(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nBufferSize); +int GetErrorMode(); +int GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode); +int GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode); +int GetExtendedContextLength(DWORD ContextFlags,PDWORD ContextLength); +int GetExtendedFeaturesMask(PCONTEXT_EX ContextEx); +int GetFileAttributes(LPCTSTR lpFileName); +int GetFileAttributesA(LPCTSTR lpFileName); +int GetFileAttributesEx(LPCTSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation); +int GetFileAttributesTransacted(LPCTSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation,HANDLE hTransaction); +int GetFileAttributesW(LPCTSTR lpFileName); +int GetFileBandwidthReservation(HANDLE hFile,LPDWORD lpPeriodMilliseconds,LPDWORD lpBytesPerPeriod,LPBOOL pDiscardable,LPDWORD lpTransferSize,LPDWORD lpNumOutstandingRequests); +int GetFileInformationByHandle(HANDLE hFile,LPBY_HANDLE_FILE_INFORMATION lpFileInformation); +int GetFileInformationByHandleEx(HANDLE hFile,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,LPVOID lpFileInformation,DWORD dwBufferSize); +int GetFileSize(HANDLE hFile,LPDWORD lpFileSizeHigh); +int GetFileSizeEx(HANDLE hFile,PLARGE_INTEGER lpFileSize); +int GetFileTime(HANDLE hFile,LPFILETIME lpCreationTime,LPFILETIME lpLastAccessTime,LPFILETIME lpLastWriteTime); +int GetFileType(HANDLE hFile); +int GetFinalPathNameByHandle(HANDLE hFile,LPTSTR lpszFilePath,DWORD cchFilePath,DWORD dwFlags); +int GetFirmwareEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpGuid,PVOID pBuffer,DWORD nSize); +int GetFullPathName(LPCTSTR lpFileName,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart); +int GetFullPathNameA(LPCTSTR lpFileName,DWORD nBufferSize,LPTSTR lpBuffer,LPTSTR* lpFilePart); +int GetFullPathNameTransacted(LPCTSTR lpFileName,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart,HANDLE hTransaction); +int GetFullPathNameW(LPCTSTR lpFileName,DWORD nBufferSize,LPTSTR lpBuffer,LPTSTR* lpFilePart); +int GetGeoInfo(GEOID Location,GEOTYPE GeoType,LPTSTR lpGeoData,int cchData,LANGID LangId); +int GetHandleInformation(HANDLE hObject,LPDWORD lpdwFlags); +int GetLargePageMinimum(); +int GetLargestConsoleWindowSize(HANDLE hConsoleOutput); +int GetLastError(); +int GetLocalTime(LPSYSTEMTIME lpSystemTime); +int GetLocaleInfo(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); +int GetLocaleInfoA(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); +int GetLocaleInfoEx(LPCWSTR lpLocaleName,LCTYPE LCType,LPWSTR lpLCData,int cchData); +int GetLocaleInfoW(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); +int GetLogicalProcessorInformation(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,PDWORD ReturnLength); +int GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer,PDWORD ReturnedLength); +int GetLongPathName(LPCTSTR lpszShortPath,LPTSTR lpszLongPath,DWORD cchBuffer); +int GetLongPathNameA(LPCTSTR lpszShortPath,LPTSTR lpBuffer,DWORD nBuffer); +int GetLongPathNameTransacted(LPCTSTR lpszShortPath,LPTSTR lpszLongPath,DWORD cchBuffer,HANDLE hTransaction); +int GetLongPathNameW(LPCTSTR lpszShortPath,LPTSTR lpBuffer,DWORD nBuffer); +int GetMailslotInfo(HANDLE hMailslot,LPDWORD lpMaxMessageSize,LPDWORD lpNextSize,LPDWORD lpMessageCount,LPDWORD lpReadTimeout); +int GetMappedFileName(HANDLE hProcess,LPVOID lpv,LPTSTR lpFilename,DWORD nSize); +int GetMaximumProcessorCount(WORD GroupNumber); +int GetMaximumProcessorGroupCount(); +int GetModuleBaseName(HANDLE hProcess,HMODULE hModule,LPTSTR lpBaseName,DWORD nSize); +int GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize); +int GetModuleFileNameA(HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); +int GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize); +int GetModuleFileNameExA(HANDLE hProcess,HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); +int GetModuleFileNameExW(HANDLE hProcess,HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); +int GetModuleFileNameW(HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); +int GetModuleHandle(LPCTSTR lpModuleName); +int GetModuleHandleA(LPCTSTR lpModuleName); +int GetModuleHandleEx(DWORD dwFlags,LPCTSTR lpModuleName,HMODULE* phModule); +int GetModuleHandleW(LPCTSTR lpModuleName); +int GetModuleInformation(HANDLE hProcess,HMODULE hModule,LPMODULEINFO lpmodinfo,DWORD dwSizemodinfo); +int GetNLSVersion(NLS_FUNCTION Function,LCID Locale,LPNLSVERSIONINFO lpVersionInformation); +int GetNLSVersionEx(NLS_FUNCTION function,LPCWSTR lpLocaleName,LPNLSVERSIONINFOEX lpVersionInformation); +int GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo); +int GetNextUmsListItem(PUMS_CONTEXT UmsContext); +int GetNumaAvailableMemoryNode(UCHAR Node,PULONGLONG AvailableBytes); +int GetNumaAvailableMemoryNodeEx(USHORT Node,PULONGLONG AvailableBytes); +int GetNumaHighestNodeNumber(PULONG HighestNodeNumber); +int GetNumaNodeNumberFromHandle(HANDLE hFile,PUSHORT NodeNumber); +int GetNumaNodeProcessorMask(UCHAR Node,PULONGLONG ProcessorMask); +int GetNumaNodeProcessorMaskEx(USHORT Node,PGROUP_AFFINITY ProcessorMask); +int GetNumaProcessorNode(UCHAR Processor,PUCHAR NodeNumber); +int GetNumaProcessorNodeEx(PPROCESSOR_NUMBER Processor,PUSHORT NodeNumber); +int GetNumaProximityNode(ULONG ProximityId,PUCHAR NodeNumber); +int GetNumaProximityNodeEx(ULONG ProximityId,PUSHORT NodeNumber); +int GetNumberFormat(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); +int GetNumberFormatA(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); +int GetNumberFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,LPCWSTR lpValue,const NUMBERFMT* lpFormat,LPWSTR lpNumberStr,int cchNumber); +int GetNumberFormatW(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); +int GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,LPDWORD lpcNumberOfEvents); +int GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons); +int GetOEMCP(); +int GetOverlappedResult(HANDLE hFile,LPOVERLAPPED lpOverlapped,LPDWORD lpNumberOfBytesTransferred,BOOL bWait); +int GetPerformanceInfo(PPERFORMANCE_INFORMATION pPerformanceInformation,DWORD cb); +int GetPhysicallyInstalledSystemMemory(PULONGLONG TotalMemoryInKilobytes); +int GetPriorityClass(HANDLE hProcess); +int GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); +int GetPrivateProfileIntA(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); +int GetPrivateProfileIntW(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); +int GetPrivateProfileSection(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileSectionA(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileSectionW(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpBuffer,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpBuffer,DWORD nSize,LPCTSTR lpFileName); +int GetPrivateProfileStruct(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); +int GetPrivateProfileStructA(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); +int GetProcAddress(HMODULE hModule,LPCSTR lpProcName); +int GetProcessAffinityMask(HANDLE hProcess,PDWORD_PTR lpProcessAffinityMask,PDWORD_PTR lpSystemAffinityMask); +int GetProcessDEPPolicy(HANDLE hProcess,LPDWORD lpFlags,PBOOL lpPermanent); +int GetProcessGroupAffinity(HANDLE hProcess,PUSHORT GroupCount,PUSHORT GroupArray); +int GetProcessHandleCount(HANDLE hProcess,PDWORD pdwHandleCount); +int GetProcessHeap(); +int GetProcessHeaps(DWORD NumberOfHeaps,PHANDLE ProcessHeaps); +int GetProcessId(HANDLE Process); +int GetProcessIdOfThread(HANDLE Thread); +int GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize); +int GetProcessIoCounters(HANDLE hProcess,PIO_COUNTERS lpIoCounters); +int GetProcessMemoryInfo(HANDLE Process,PPROCESS_MEMORY_COUNTERS ppsmemCounters,DWORD cb); +int GetProcessPriorityBoost(HANDLE hProcess,PBOOL pDisablePriorityBoost); +int GetProcessShutdownParameters(LPDWORD lpdwLevel,LPDWORD lpdwFlags); +int GetProcessTimes(HANDLE hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); +int GetProcessVersion(DWORD ProcessId); +int GetProcessWorkingSetSize(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize); +int GetProcessWorkingSetSizeEx(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize,PDWORD Flags); +int GetProcessorSystemCycleTime(USHORT Group,PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION Buffer,PDWORD ReturnedLength); +int GetProductInfo(DWORD dwOSMajorVersion,DWORD dwOSMinorVersion,DWORD dwSpMajorVersion,DWORD dwSpMinorVersion,DWORD pdwReturnedProductType); +UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); +UINT GetProfileIntA(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); +UINT GetProfileIntW(LPCTSTR lpAppName,LPCWSTR lpKeyName,INT nDefault); +int GetProfileSection(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); +int GetProfileSectionA(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); +int GetProfileSectionW(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); +int GetProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); +int GetProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); +int GetProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); +int GetQueuedCompletionStatus(HANDLE CompletionPort,LPDWORD lpNumberOfBytes,PULONG_PTR lpCompletionKey,LPOVERLAPPED* lpOverlapped,DWORD dwMilliseconds); +int GetQueuedCompletionStatusEx(HANDLE CompletionPort,LPOVERLAPPED_ENTRY lpCompletionPortEntries,ULONG ulCount,PULONG ulNumEntriesRemoved,DWORD dwMilliseconds,BOOL fAlertable); +int GetShortPathName(LPCTSTR lpszLongPath,LPTSTR lpszShortPath,DWORD cchBuffer); +int GetShortPathNameA(LPCTSTR lpszLongPath,LPTSTR lpBuffer,DWORD cchBuffer); +int GetShortPathNameW(LPCTSTR lpszLongPath,LPTSTR lpBuffer,DWORD cchBuffer); +int GetStartupInfo(LPSTARTUPINFO lpStartupInfo); +int GetStartupInfoA(LPSTARTUPINFO lpStartupInfo); +int GetStartupInfoW(LPSTARTUPINFO lpStartupInfo); +int GetStdHandle(DWORD nStdHandle); +int GetStringScripts(DWORD dwFlags,LPCWSTR lpString,int cchString,LPWSTR lpScripts,int cchScripts); +int GetStringTypeA(LCID Locale,DWORD dwInfoType,LPCSTR lpSrcStr,int cchSrc,LPWORD lpCharType); +int GetStringTypeEx(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); +int GetStringTypeExA(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); +int GetStringTypeExW(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); +int GetStringTypeW(DWORD Locale,LPCWSTR dwInfoType,int lpSrcStr,LPWORD cchSrc,LPWORD lpCharType); +int GetSystemDEPPolicy(); +int GetSystemDefaultLCID(); +int GetSystemDefaultLangID(); +int GetSystemDefaultLocaleName(LPWSTR lpLocaleName,int cchLocaleName); +int GetSystemDirectory(LPTSTR lpBuffer,UINT uSize); +int GetSystemDirectoryA(LPTSTR lpBuffer,UINT nBufferSize); +int GetSystemDirectoryW(LPTSTR lpBuffer,UINT nBufferSize); +int GetSystemFileCacheSize(PSIZE_T lpMinimumFileCacheSize,PSIZE_T lpMaximumFileCacheSize,PDWORD lpFlags); +int GetSystemFirmwareTable(DWORD FirmwareTableProviderSignature,DWORD FirmwareTableID,PVOID pFirmwareTableBuffer,DWORD BufferSize); +int GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); +int GetSystemPowerStatus(LPSYSTEM_POWER_STATUS lpSystemPowerStatus); +int GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,PDWORD pdwQuotaUsed); +int GetSystemTime(LPSYSTEMTIME lpSystemTime); +int GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,PDWORD lpTimeIncrement,PBOOL lpTimeAdjustmentDisabled); +int GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); +int GetSystemTimes(LPFILETIME lpIdleTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); +int GetSystemWindowsDirectory(LPTSTR lpBuffer,UINT uSize); +int GetSystemWow64Directory(LPTSTR lpBuffer,UINT uSize); +int GetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPDWORD lpdwSize,LPVOID lpTapeInformation); +int GetTapePosition(HANDLE hDevice,DWORD dwPositionType,LPDWORD lpdwPartition,LPDWORD lpdwOffsetLow,LPDWORD lpdwOffsetHigh); +int GetTapeStatus(HANDLE hDevice); +int GetTempFileName(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); +int GetTempFileNameA(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); +int GetTempFileNameW(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); +int GetTempPath(DWORD nBufferLength,LPTSTR lpBuffer); +int GetTempPathA(DWORD nBufferSize,LPTSTR lpBuffer); +int GetTempPathW(DWORD nBufferSize,LPTSTR lpBuffer); +int GetThreadContext(HANDLE hThread,LPCONTEXT lpContext); +int GetThreadErrorMode(); +int GetThreadGroupAffinity(HANDLE hThread,PGROUP_AFFINITY GroupAffinity); +int GetThreadIOPendingFlag(HANDLE hThread,PBOOL lpIOIsPending); +int GetThreadId(HANDLE Thread); +int GetThreadIdealProcessorEx(HANDLE hThread,PPROCESSOR_NUMBER lpIdealProcessor); +int GetThreadLocale(); +int GetThreadPriority(HANDLE hThread); +int GetThreadPriorityBoost(HANDLE hThread,PBOOL pDisablePriorityBoost); +int GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,LPLDT_ENTRY lpSelectorEntry); +int GetThreadTimes(HANDLE hThread,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); +int GetTickCount(); +int GetTickCount64(); +int GetTimeFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); +int GetTimeFormatA(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); +int GetTimeFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCWSTR lpFormat,LPWSTR lpTimeStr,int cchTime); +int GetTimeFormatW(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); +int GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation); +int GetTimeZoneInformationForYear(USHORT wYear,PDYNAMIC_TIME_ZONE_INFORMATION pdtzi,LPTIME_ZONE_INFORMATION ptzi); +int GetUmsCompletionListEvent(PUMS_COMPLETION_LIST UmsCompletionList,PHANDLE UmsCompletionEvent); +int GetUserDefaultLCID(); +int GetUserDefaultLangID(); +int GetUserDefaultLocaleName(LPWSTR lpLocaleName,int cchLocaleName); +int GetUserGeoID(GEOCLASS GeoClass); +int GetVersion(); +bool GetVersionEx(LPOSVERSIONINFO lpVersionInfo); +bool GetVersionExA(LPOSVERSIONINFO lpVersionInformation); +bool GetVersionExW(LPOSVERSIONINFO lpVersionInformation); +int GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize); +int GetWindowsDirectoryA(LPTSTR lpBuffer,UINT nBufferSize); +int GetWindowsDirectoryW(LPTSTR lpBuffer,UINT nBufferSize); +int GetWriteWatch(DWORD dwFlags,PVOID lpBaseAddress,SIZE_T dwRegionSize,PVOID* lpAddresses,PULONG_PTR lpdwCount,PULONG lpdwGranularity); +int GetWsChanges(HANDLE hProcess,PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,DWORD cb); +int GetWsChangesEx(HANDLE hProcess,PPSAPI_WS_WATCH_INFORMATION_EX lpWatchInfoEx,DWORD cb); +int GlobalAddAtom(LPCTSTR lpString); +int GlobalAddAtomA(LPCTSTR lpString); +int GlobalAddAtomW(LPCTSTR lpString); +int GlobalAlloc(UINT uFlags,SIZE_T dwBytes); +int GlobalDeleteAtom(ATOM nAtom); +int GlobalFindAtom(LPCTSTR lpString); +int GlobalFindAtomA(LPCTSTR AtomName); +int GlobalFindAtomW(LPCTSTR AtomName); +int GlobalFlags(HGLOBAL hMem); +int GlobalFree(HGLOBAL hMem); +int GlobalGetAtomName(ATOM nAtom,LPTSTR lpBuffer,int nSize); +int GlobalGetAtomNameA(ATOM nAtom,LPTSTR lpBuffer,int nBufferSize); +int GlobalGetAtomNameW(ATOM nAtom,LPTSTR lpBuffer,int nBufferSize); +int GlobalHandle(LPCVOID hMem); +int GlobalLock(HGLOBAL hMem); +int GlobalMemoryStatus(LPMEMORYSTATUS lpMemBuffer); +int GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); +int GlobalReAlloc(HGLOBAL hMem,SIZE_T dwBytes,UINT uFlags); +int GlobalSize(HGLOBAL hMem); +int GlobalUnlock(HGLOBAL hMem); +int Heap32First(LPHEAPENTRY32 lphe,DWORD th32ProcessID,ULONG_PTR th32HeapID); +int Heap32ListFirst(HANDLE hSnapshot,LPHEAPLIST32 lphl); +int Heap32ListNext(HANDLE hSnapshot,LPHEAPLIST32 lphl); +int Heap32Next(LPHEAPENTRY32 lphe); +int HeapAlloc(HANDLE hHeap,DWORD Flags,SIZE_T HeapSize); +int HeapCompact(HANDLE hHeap,DWORD dwFlags); +int HeapCreate(DWORD flOptions,SIZE_T dwInitialSize,SIZE_T dwMaximumSize); +int HeapDestroy(HANDLE hHeap); +int HeapFree(HANDLE hHeap); +int HeapLock(HANDLE hHeap); +int HeapQueryInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength,PSIZE_T ReturnLength); +int HeapReAlloc(HANDLE hHeap,DWORD Flags,LPVOID pMemory,SIZE_T NewSize); +int HeapSetInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength); +int HeapSize(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem); +int HeapUnlock(HANDLE hHeap); +int HeapValidate(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem); +int HeapWalk(HANDLE hHeap,LPPROCESS_HEAP_ENTRY lpEntry); +int InitAtomTable(DWORD nSize); +int InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce,DWORD dwFlags,PBOOL fPending,LPVOID* lpContext); +int InitOnceComplete(LPINIT_ONCE lpInitOnce,DWORD dwFlags,LPVOID lpContext); +int InitOnceExecuteOnce(PINIT_ONCE InitOnce,PINIT_ONCE_FN InitFn,PVOID Parameter,LPVOID* Context); +int InitOnceInitialize(PINIT_ONCE InitOnce); +int InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable); +int InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +int InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection); +int InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount,DWORD Flags); +int InitializeExtendedContext(PVOID Context,DWORD ContextFlags,PCONTEXT_EX* ContextEx); +int InitializeProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,DWORD dwAttributeCount,DWORD dwFlags,PSIZE_T lpSize); +int InitializeProcessForWsWatch(HANDLE hProcess); +int InitializeSListHead(PSLIST_HEADER ListHead); +int InitializeSRWLock(PSRWLOCK SRWLock); +int InterlockedCompareExchange(LONG volatile* Destination,LONG Exchange,LONG Comperand); +int InterlockedCompareExchange64(LONGLONG volatile* Destination,LONGLONG Exchange,LONGLONG Comparand); +int InterlockedDecrement(LONG volatile* lpAddend); +int InterlockedExchange(DWORD Target,DWORD Value); +int InterlockedExchange(LONG volatile* Target,LONG Value); +int InterlockedExchangeAdd(LONG volatile* Addend,LONG Increment); +int InterlockedFlushSList(PSLIST_HEADER ListHead); +int InterlockedIncrement(LONG volatile* lpAddend); +int InterlockedPopEntrySList(PSLIST_HEADER ListHead); +int InterlockedPushEntrySList(PSLIST_HEADER ListHead,PSLIST_ENTRY ListEntry); +int IsBadCodePtr(FARPROC lpfn); +int IsBadReadPtr(const VOID* lp,UINT_PTR ucb); +int IsBadStringPtr(LPCTSTR lpsz,UINT_PTR ucchMax); +int IsBadStringPtrA(LPCTSTR lpsz,UINT_PTR ucchMax); +int IsBadStringPtrW(LPCTSTR lpsz,UINT_PTR ucchMax); +int IsBadWritePtr(LPVOID lp,UINT_PTR ucb); +int IsCalendarLeapYear(CALID calId,UINT year,UINT era); +int IsDBCSLeadByte(BYTE TestChar); +int IsDBCSLeadByteEx(UINT CodePage,BYTE TestChar); +int IsDebuggerPresent(); +int IsNLSDefinedString(NLS_FUNCTION Function,DWORD dwFlags,LPNLSVERSIONINFO lpVersionInformation,LPCWSTR lpString,INT cchStr); +int IsProcessInJob(HANDLE ProcessHandle,HANDLE JobHandle,PBOOL Result); +int IsProcessorFeaturePresent(DWORD ProcessorFeature); +int IsSystemResumeAutomatic(); +int IsThreadAFiber(); +int IsThreadpoolTimerSet(PTP_TIMER pti); +int IsValidCodePage(UINT CodePage); +int IsValidLanguageGroup(LGRPID LanguageGroup,DWORD dwFlags); +int IsValidLocale(LCID Locale,DWORD dwFlags); +int IsValidLocaleName(LPCWSTR lpLocaleName); +int IsWow64Process(HANDLE hProcess,PBOOL Wow64Process); +int LCIDToLocaleName(LCID Locale,LPWSTR lpName,int cchName,DWORD dwFlags); +int LCMapString(LCID Locale,DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); +int LCMapStringA(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPTSTR lpString2,int cchCount2); +int LCMapStringEx(LPCWSTR lpLocaleName,DWORD dwMapFlags,LPCWSTR lpSrcStr,int cchSrc,LPWSTR lpDestStr,int cchDest,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); +int LCMapStringW(LCID Locale,DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); +int LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +int LeaveCriticalSectionWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,PCRITICAL_SECTION pcs); +int LoadLibrary(LPCTSTR lpFileName); +int LoadLibraryA(LPCTSTR lpLibFileName); +int LoadLibraryEx(LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags); +int LoadLibraryExA(LPCTSTR pLibFileName,HANDLE hFile,DWORD dwFlags); +int LoadLibraryExW(LPCTSTR pLibFileName,HANDLE hFile,DWORD dwFlags); +int LoadLibraryW(LPCTSTR lpLibFileName); +int LoadModule(LPCSTR lpModuleName,LPVOID lpParameterBlock); +int LoadResource(HMODULE hModule,HRSRC hResInfo); +HLOCAL LocalAlloc(UINT uFlags,SIZE_T uBytes); +int LocalFileTimeToFileTime(const FILETIME* lpLocalFileTime,LPFILETIME lpFileTime); +int LocalFlags(HLOCAL hMem); +int LocalFree(HLOCAL hMem); +int LocalHandle(LPCVOID pMem); +int LocalLock(HLOCAL hMem); +HLOCAL LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags); +int LocalSize(HLOCAL hMem); +int LocalUnlock(HLOCAL hMem); +int LocaleNameToLCID(LPCWSTR lpName,DWORD dwFlags); +int LocateExtendedFeature(PCONTEXT_EX ContextEx,DWORD FeatureId,PDWORD Length); +int LocateLegacyContext(PCONTEXT_EX ContextEx,PDWORD Length); +int LockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh); +int LockFileEx(HANDLE hFile,DWORD dwFlags,DWORD dwReserved,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh,LPOVERLAPPED lpOverlapped); +int LockResource(HGLOBAL hResInfo); +int MapUserPhysicalPages(PVOID lpAddress,ULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); +int MapUserPhysicalPagesScatter(PVOID* VirtualAddresses,ULONG_PTR NumberOfPages,PULONG_PTR PageArray); +int MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap); +int MapViewOfFileEx(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap,LPVOID lpBaseAddress); +int MapViewOfFileExNuma(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap,LPVOID lpBaseAddress,DWORD nndPreferred); +int Module32First(HANDLE hModuleSnap,LPMODULEENTRY32 lpme); +int Module32FirstW(HANDLE hSnapshot,LPMODULEENTRY32 lpme); +int Module32Next(HANDLE hModuleSnap,LPMODULEENTRY32 lpme); +int Module32NextW(HANDLE hSnapshot,LPMODULEENTRY32 lpme); +int MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); +int MoveFileA(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); +int MoveFileEx(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwFlags); +int MoveFileTransacted(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags,HANDLE hTransaction); +int MoveFileW(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); +int MoveFileWithProgress(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags); +int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpwcBuffer,int nBuffer); +int NeedCurrentDirectoryForExePath(LPCTSTR ExeName); +int OpenEvent(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenEventA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenEventW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenFile(LPCSTR lpFileName,LPOFSTRUCT lpReOpenBuff,DWORD uStyle); +int OpenFileById(HANDLE hFile,LPFILE_ID_DESCRIPTOR lpFileID,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwFlags); +int OpenFileMapping(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenFileMappingA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenFileMappingW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenJobObject(DWORD dwDesiredAccess,BOOL bInheritHandles,LPCTSTR lpName); +int OpenMutex(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenMutexA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenMutexW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenPrivateNamespace(LPVOID lpBoundaryDescriptor,LPCTSTR lpAliasPrefix); +int OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId); +int OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); +int OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId); +int OpenWaitableTimer(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpTimerName); +int OutputDebugString(LPCTSTR lpOutputString); +int OutputDebugStringA(LPCTSTR lpOutputString); +int OutputDebugStringW(LPCTSTR lpOutputString); +int PeekConsoleInput(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead); +int PostQueuedCompletionStatus(HANDLE CompletionPort,DWORD dwNumberOfBytesTransferred,ULONG_PTR dwCompletionKey,LPOVERLAPPED lpOverlapped); +int PowerClearRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); +int PowerCreateRequest(PREASON_CONTEXT Context); +int PowerSetRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); +int PrepareTape(HANDLE hDevice,DWORD dwOperation,BOOL bImmediate); +int Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); +int Process32FirstW(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); +int Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); +int Process32NextW(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); +int ProcessIdToSessionId(DWORD dwProcessId,DWORD* pSessionId); +int PulseEvent(HANDLE hEvent); +int PurgeComm(HANDLE hFile,DWORD dwFlags); +int QueryActCtxSettingsW(DWORD dwFlags,HANDLE hActCtx,PCWSTR settingsNameSpace,PCWSTR settingName,PWSTR pvBuffer,SIZE_T dwBuffer,SIZE_T* pdwWrittenOrRequired); +int QueryActCtxW(DWORD dwFlags,HANDLE hActCtx,PVOID pvSubInstance,UINT ulInfoClass,PVOID pvBuffer,SIZE_T cbBuffer,SIZE_T* pcbWrittenOrRequired); +int QueryDepthSList(PSLIST_HEADER ListHead); +int QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize); +int QueryIdleProcessorCycleTime(PULONG BufferLength,PULONG64 ProcessorIdleCycleTime); +int QueryIdleProcessorCycleTimeEx(USHORT Group,PULONG BufferLength,PULONG64 ProcessorIdleCycleTime); +int QueryInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInfoClass,LPVOID lpJobObjectInfo,DWORD cbJobObjectInfoLength,LPDWORD lpReturnLength); +int QueryMemoryResourceNotification(HANDLE ResourceNotificationHandle,PBOOL ResourceState); +int QueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount); +int QueryPerformanceFrequency(LARGE_INTEGER* lpFrequency); +int QueryProcessAffinityUpdateMode(HANDLE ProcessHandle,DWORD lpdwFlags); +int QueryProcessCycleTime(HANDLE ProcessHandle,PULONG64 CycleTime); +int QueryThreadCycleTime(HANDLE ThreadHandle,PULONG64 CycleTime); +int QueryThreadpoolStackInformation(PTP_POOL ptpp,PTP_POOL_STACK_INFORMATION ptpsi); +int QueryUmsThreadInformation(PUMS_CONTEXT UmsThread,UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,ULONG UmsThreadInformationLength,PULONG ReturnLength); +int QueryUnbiasedInterruptTime(PULONGLONG UnbiasedTime); +int QueryWorkingSet(HANDLE hProcess,PVOID pv,DWORD cb); +int QueryWorkingSetEx(HANDLE hProcess,PVOID pv,DWORD cb); +int QueueUserAPC(PAPCFUNC pfnAPC,HANDLE hThread,ULONG_PTR dwData); +int QueueUserWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,DWORD Flags); +int RaiseException(DWORD dwExceptionCode,DWORD dwExceptionFlags,DWORD nNumberOfArguments,const ULONG_PTR* lpArguments); +int RaiseFailFastException(PEXCEPTION_RECORD pExceptionRecord,PCONTEXT pContextRecord,DWORD dwFlags); +int ReOpenFile(HANDLE hOriginalFile,DWORD dwDesiredAccess,DWORD dwShareMode,DWORD dwFlags); +int ReadConsole(HANDLE hConsoleInput,LPVOID lpBuffer,DWORD nNumberOfCharsToRead,LPDWORD lpNumberOfCharsRead,LPVOID pInputControl); +int ReadConsoleInput(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead); +int ReadConsoleInputA(HANDLE hConsoleInput,PINPUT_RECORD lpInputRecord,DWORD nLength,LPDWORD lpNumberOfEventsRead); +int ReadConsoleOutput(HANDLE hConsoleOutput,PCHAR_INFO lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpReadRegion); +int ReadConsoleOutputAttribute(HANDLE hConsoleOutput,LPWORD lpAttribute,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfAttrsRead); +int ReadConsoleOutputCharacter(HANDLE hConsoleOutput,LPTSTR lpCharacter,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfCharsRead); +int ReadDirectoryChangesW(HANDLE hDirectory,LPVOID lpBuffer,DWORD nBufferLength,BOOL bWatchSubtree,DWORD dwNotifyFilter,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); +bool ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped); +int ReadFileEx(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); +int ReadFileScatter(HANDLE hFile,FILE_SEGMENT_ELEMENT aSegmentArray,DWORD nNumberOfBytesToRead,LPDWORD lpReserved,LPOVERLAPPED lpOverlapped); +int ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddress,LPVOID lpStockBuffer,SIZE_T nSize,SIZE_T* lpNumberOfBytesRead); +int RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK pRecoveryCallback,PVOID pvParameter,DWORD dwPingInterval,DWORD dwFlags); +int RegisterApplicationRestart(PCWSTR pwzCommandline,DWORD dwFlags); +int RegisterWaitForSingleObject(PHANDLE phNewWaitObject,HANDLE hObject,WAITORTIMERCALLBACK Callback,PVOID Context,DWORD dwMilliseconds,DWORD dwFlags); +int ReleaseActCtx(HANDLE hActCtx); +int ReleaseMutex(HANDLE hMutex); +int ReleaseMutexWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE mut); +int ReleaseSRWLockExclusive(PSRWLOCK SRWLock); +int ReleaseSRWLockShared(PSRWLOCK SRWLock); +int ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount); +int ReleaseSemaphoreWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE sem,DWORD crel); +int RemoveDirectory(LPCTSTR lpPathName); +int RemoveDirectoryA(LPCTSTR lpPathName); +int RemoveDirectoryTransacted(LPCTSTR lpPathName,HANDLE hTransaction); +int RemoveDirectoryW(LPCTSTR lpPathName); +int RemoveSecureMemoryCacheCallback(PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack); +int RemoveVectoredContinueHandler(PVOID Handler); +int RemoveVectoredExceptionHandler(PVOID Handler); +int ReplaceFile(LPCTSTR lpReplacedFileName,LPCTSTR lpReplacementFileName,LPCTSTR lpBackupFileName,DWORD dwReplaceFlags,LPVOID lpExclude,LPVOID lpReserved); +int RequestWakeupLatency(LATENCY_TIME latency); +int ResetEvent(HANDLE hEvent); +int ResetWriteWatch(LPVOID lpBaseAddress,SIZE_T dwRegionSize); +int ResolveLocaleName(LPCWSTR lpNameToResolve,LPWSTR lpLocaleName,int cchLocaleName); +int ResumeThread(HANDLE hThread); +int RtlAddFunctionTable(PRUNTIME_FUNCTION FunctionTable,DWORD EntryCount,DWORD64 BaseAddress,ULONGLONG TargetGp); +int RtlCaptureContext(PCONTEXT ContextRecord); +int RtlCaptureStackBackTrace(ULONG FramesToSkip,ULONG FramesToCapture,PVOID* BackTrace,PULONG BackTraceHash); +int RtlDeleteFunctionTable(PRUNTIME_FUNCTION FunctionTable); +int RtlInstallFunctionTableCallback(DWORD64 TableIdentifier,DWORD64 BaseAddress,DWORD Length,PGET_RUNTIME_FUNCTION_CALLBACK Callback,PVOID Context,PCWSTR OutOfProcessCallbackDll); +int RtlIsValidLocaleName(LPCWSTR LocaleName,ULONG Flags); +int RtlLookupFunctionEntry(ULONGLONG ControlPC,PULONGLONG ImageBase,PULONGLONG TargetGp); +int RtlPcToFileHeader(PVOID PcValue,PVOID* BaseOfImage); +int RtlRestoreContext(PCONTEXT ContextRecord,PEXCEPTION_RECORD ExceptionRecord); +int ScrollConsoleScreenBuffer(HANDLE hConsoleOutput,const SMALL_RECT* lpScrollRectangle,const SMALL_RECT* lpClipRectangle,COORD dwDestinationOrigin,const CHAR_INFO* lpFill); +int ScrollConsoleScreenBufferA(HANDLE hConsoleOutput,const SMALL_RECT* lpScrollRectangle,const SMALL_RECT* lpClipRectangle,COORD dwDestinationOrigin,const CHAR_INFO* lpFill); +int SearchPath(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart); +int SearchPathA(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferSize,LPTSTR lpStockBuffer,LPTSTR* lpFilePart); +int SearchPathW(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferSize,LPTSTR lpStockBuffer,LPTSTR* lpFilePart); +int SetCalendarInfo(LCID Locale,CALID Calendar,CALTYPE CalType,LPCTSTR lpCalData); +int SetCommBreak(HANDLE hFile); +int SetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,DWORD dwSize); +int SetCommMask(HANDLE hFile,DWORD dwEvtMask); +int SetCommState(HANDLE hFile,LPDCB lpDCB); +int SetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts); +int SetComputerName(LPCTSTR lpComputerName); +int SetComputerNameA(LPCTSTR lpComputerName); +int SetComputerNameEx(COMPUTER_NAME_FORMAT NameType,LPCTSTR lpBuffer); +int SetComputerNameW(LPCTSTR lpComputerName); +int SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput); +int SetConsoleCP(UINT wCodePageID); +int SetConsoleCtrlHandler(PHANDLER_ROUTINE hRoutine,BOOL Add); +int SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo); +int SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD dwCursorPosition); +int SetConsoleDisplayMode(HANDLE hConsoleOutput,DWORD dwFlags,PCOORD lpNewScreenBufferDimensions); +int SetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); +int SetConsoleMode(HANDLE hConsoleHandle,DWORD dwMode); +int SetConsoleOutputCP(UINT wCodePageID); +int SetConsoleScreenBufferInfoEx(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); +int SetConsoleScreenBufferSize(HANDLE hConsoleOutput,COORD dwSize); +int SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes); +int SetConsoleTitle(LPCTSTR lpConsoleTitle); +int SetConsoleTitleA(LPCTSTR pConsoleTitle); +int SetConsoleTitleW(LPCTSTR pConsoleTitle); +int SetConsoleWindowInfo(HANDLE hConsoleOutput,BOOL bAbsolute,const SMALL_RECT* lpConsoleWindow); +int SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount); +int SetCurrentConsoleFontEx(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); +int SetCurrentDirectory(LPCTSTR lpPathName); +int SetCurrentDirectoryA(LPCTSTR lpPathName); +int SetCurrentDirectoryW(LPCTSTR lpPathName); +int SetDefaultCommConfig(LPCTSTR lpszName,LPCOMMCONFIG lpCC,DWORD dwSize); +int SetDllDirectory(LPCTSTR lpPathName); +int SetDynamicTimeZoneInformation(const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation); +int SetEndOfFile(HANDLE hFile); +int SetEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpValue); +int SetEnvironmentVariableA(LPCTSTR lpName,LPCTSTR lpValue); +int SetEnvironmentVariableW(LPCTSTR lpName,LPCTSTR lpValue); +int SetErrorMode(DWORD uMode); +int SetEvent(HANDLE hEvent); +int SetEventWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE evt); +int SetExtendedFeaturesMask(PCONTEXT_EX ContextEx,DWORD64 FeatureMask); +int SetFileApisToANSI(); +int SetFileApisToOEM(); +int SetFileAttributes(LPCTSTR lpFileName,DWORD dwFileAttributes); +int SetFileAttributesA(LPCTSTR lpFileName,DWORD dwFileAttributes); +int SetFileAttributesTransacted(LPCTSTR lpFileName,DWORD dwFileAttributes,HANDLE hTransaction); +int SetFileAttributesW(LPCTSTR lpFileName,DWORD dwFileAttributes); +int SetFileBandwidthReservation(HANDLE hFile,DWORD nPeriodMilliseconds,DWORD nBytesPerPeriod,BOOL bDiscardable,LPDWORD lpTransferSize,LPDWORD lpNumOutstandingRequests); +int SetFileCompletionNotificationModes(HANDLE FileHandle,UCHAR Flags); +int SetFileInformationByHandle(HANDLE hFile,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,LPVOID lpFileInformation,DWORD dwBufferSize); +int SetFileIoOverlappedRange(HANDLE FileHandle,PUCHAR OverlappedRangeStart,ULONG Length); +int SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); +int SetFilePointerEx(HANDLE hFile,LARGE_INTEGER lDistanceToMove,PLARGE_INTEGER pliNewFilePointer,DWORD dwMoveMethod); +int SetFileShortName(HANDLE hFile,LPCTSTR lpShortName); +int SetFileTime(HANDLE hFile,const FILETIME* lpCreationTime,const FILETIME* lpLastAccessTime,const FILETIME* lpLastWriteTime); +int SetFileValidData(HANDLE hFile,LONGLONG ValidDataLength); +int SetFirmwareEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpGuid,PVOID pBuffer,DWORD nSize); +int SetHandleInformation(HANDLE hObject,DWORD dwMask,DWORD dwFlags); +int SetInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInfoClass,LPVOID lpJobObjectInfo,DWORD cbJobObjectInfoLength); +int SetLastError(DWORD dwErrCode); +int SetLocalTime(const SYSTEMTIME* lpSystemTime); +int SetLocaleInfo(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); +int SetLocaleInfoA(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); +int SetLocaleInfoW(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); +int SetMailslotInfo(HANDLE hMailslot,DWORD lReadTimeout); +int SetPriorityClass(HANDLE hProcess,DWORD dwPriorityClass); +int SetProcessAffinityMask(HANDLE hProcess,DWORD_PTR dwProcessAffinityMask); +int SetProcessAffinityUpdateMode(HANDLE ProcessHandle,DWORD dwFlags); +int SetProcessDEPPolicy(DWORD dwFlags); +int SetProcessPriorityBoost(HANDLE hProcess,BOOL DisablePriorityBoost); +int SetProcessShutdownParameters(DWORD dwLevel,DWORD dwFlags); +int SetProcessWorkingSetSize(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize); +int SetProcessWorkingSetSizeEx(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize,DWORD Flags); +int SetSearchPathMode(DWORD Flags); +int SetStdHandle(DWORD nStdHandle,HANDLE hHandle); +int SetSystemFileCacheSize(SIZE_T MinimumFileCacheSize,SIZE_T MaximumFileCacheSize,DWORD Flags); +int SetSystemPowerState(BOOL fSuspend,BOOL fForce); +int SetSystemTime(const SYSTEMTIME* lpSystemTime); +int SetSystemTimeAdjustment(DWORD dwTimeAdjustment,BOOL bTimeAdjustmentDisabled); +int SetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPVOID lpTapeInformation); +int SetTapePosition(HANDLE hDevice,DWORD dwPositionMethod,DWORD dwPartition,DWORD dwOffsetLow,DWORD dwOffsetHigh,BOOL bImmediate); +int SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask); +int SetThreadContext(HANDLE hThread,const CONTEXT* lpContext); +int SetThreadErrorMode(DWORD dwNewMode,LPDWORD lpOldMode); +int SetThreadExecutionState(EXECUTION_STATE esFlags); +int SetThreadGroupAffinity(HANDLE hThread,const GROUP_AFFINITY* GroupAffinity); +int SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor); +int SetThreadIdealProcessorEx(HANDLE hThread,PPROCESSOR_NUMBER lpIdealProcessor,PPROCESSOR_NUMBER lpPreviousIdealProcessor); +int SetThreadLocale(LCID Locale); +int SetThreadPriority(HANDLE hThread,DWORD nPriority); +int SetThreadPriorityBoost(HANDLE hThread,BOOL DisablePriorityBoost); +int SetThreadStackGuarantee(PULONG StackSizeInBytes); +int SetThreadpoolCallbackPriority(PTP_CALLBACK_ENVIRON pcbe,TP_CALLBACK_PRIORITY Priority); +int SetThreadpoolStackInformation(PTP_POOL ptpp,PTP_POOL_STACK_INFORMATION ptpsi); +int SetThreadpoolThreadMaximum(PTP_POOL ptpp,DWORD cthrdMost); +int SetThreadpoolThreadMinimum(PTP_POOL ptpp,DWORD cthrdMic); +int SetThreadpoolTimer(PTP_TIMER pti,PFILETIME pftDueTime,DWORD msPeriod,DWORD msWindowLength); +int SetThreadpoolWait(PTP_WAIT pwa,HANDLE h,PFILETIME pftTimeout); +int SetTimeZoneInformation(const TIME_ZONE_INFORMATION* lpTimeZoneInformation); +int SetUmsThreadInformation(PUMS_CONTEXT UmsThread,UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,ULONG UmsThreadInformationLength); +int SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +int SetUserGeoID(GEOID GeoId); +int SetWaitableTimer(HANDLE hTimer,const LARGE_INTEGER* pDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,LPVOID lpArgToCompletionRoutine,BOOL fResume); +int SetWaitableTimerEx(HANDLE hTimer,const LARGE_INTEGER* lpDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,LPVOID lpArgToCompletionRoutine,PREASON_CONTEXT WakeContext,ULONG TolerableDelay); +int SetupComm(HANDLE hFile,DWORD dwInQueue,DWORD dwOutQueue); +int SignalObjectAndWait(HANDLE hObjectToSignal,HANDLE hObjectToWaitOn,DWORD dwMilliseconds,BOOL bAlertable); +int SizeofResource(HMODULE hModule,HRSRC hResInfo); +void Sleep(DWORD dwMilliseconds); +int SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable,PCRITICAL_SECTION CriticalSection,DWORD dwMilliseconds); +int SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable,PSRWLOCK SRWLock,DWORD dwMilliseconds,ULONG Flags); +int SleepEx(DWORD dwMilliseconds,BOOL bAlertable); +int StartThreadpoolIo(PTP_IO pio); +int SubmitThreadpoolWork(PTP_WORK pwk); +int SuspendThread(HANDLE hThread); +int SwitchToFiber(LPVOID lpFiber); +int SwitchToThread(); +int SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime,LPFILETIME lpFileTime); +int SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpUniversalTime,LPSYSTEMTIME lpLocalTime); +int TerminateJobObject(HANDLE hJob,UINT uExitCode); +int TerminateProcess(HANDLE hProcess,UINT uExitCode); +int TerminateThread(HANDLE hProcess,DWORD uExitCode); +int Thread32First(HANDLE hSnapshot,LPTHREADENTRY32 lpte); +int Thread32Next(HANDLE hSnapshot,LPTHREADENTRY32 lpte); +int TlsAlloc(); +int TlsFree(DWORD dwTlsIndex ); +int TlsGetValue(DWORD dwTlsIndex); +int TlsSetValue(DWORD dwTlsIndex,LPVOID pTlsValue); +int Toolhelp32ReadProcessMemory(DWORD th32ProcessID,LPCVOID lpBaseAddress,LPVOID lpBuffer,SIZE_T cbRead,SIZE_T lpNumberOfBytesRead); +int TransmitCommChar(HANDLE hFile,char cChar); +int TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); +int TryAcquireSRWLockShared(PSRWLOCK SRWLock); +int TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +int TrySubmitThreadpoolCallback(PTP_SIMPLE_CALLBACK pfns,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); +int TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpLocalTime,LPSYSTEMTIME lpUniversalTime); +int UmsThreadYield(PVOID SchedulerParam); +int UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo); +int UnlockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh); +int UnlockFileEx(HANDLE hFile,DWORD dwReserved,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh,LPOVERLAPPED lpOverlapped); +int UnmapViewOfFile(LPCVOID lpBaseAddress); +int UnregisterApplicationRecoveryCallback(); +int UnregisterApplicationRestart(); +int UnregisterWait(HANDLE WaitHandle); +int UnregisterWaitEx(HANDLE WaitHandle,HANDLE CompletionEvent); +int UpdateCalendarDayOfWeek(LPCALDATETIME lpCalDateTime); +int UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,DWORD dwFlags,DWORD Attribute,PVOID lpValue,SIZE_T cbSize,PVOID lpPreviousValue,PSIZE_T lpReturnSize); +int UpdateResource(HANDLE hUpdate,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage,LPVOID lpData,DWORD cbData); +int VerLanguageName(DWORD wLang,LPTSTR szLang,DWORD cchLang); +int VerLanguageNameA(DWORD wLang,LPTSTR szLang,DWORD nSize); +int VerLanguageNameW(DWORD wLang,LPTSTR szLang,DWORD nSize); +int VerSetConditionMask(ULONGLONG dwlConditionMask,DWORD dwTypeBitMask,DWORD dwConditionMask); +int VerifyScripts(DWORD dwFlags,LPCWSTR lpLocaleScripts,int cchLocaleScripts,LPCWSTR lpTestScripts,int cchTestScripts); +int VerifyVersionInfo(LPOSVERSIONINFOEX lpVersionInfo,DWORD dwTypeMask,DWORDLONG dwlConditionMask); +int VirtualAlloc(LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect); +int VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect); +int VirtualAllocExNuma(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect,DWORD nndPreferred); +int VirtualFree(LPVOID lpAddress,SIZE_T dwSize,DWORD FreeType); +int VirtualFreeEx(HANDLE hProces,LPVOID lpAddress,SIZE_T dwSize,DWORD dwFreeType); +int VirtualLock(LPVOID lpAddress,SIZE_T dwSize); +int VirtualProtect(LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,DWORD lpflOldProtect); +int VirtualProtectEx(HANDLE hProces,LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,DWORD lpflOldProtect); +int VirtualQuery(LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION pbi_Buffer,SIZE_T dwLength); +int VirtualQueryEx(HANDLE hProcess,LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION pbi_Buffer,SIZE_T dwLength); +int VirtualUnlock(LPVOID lpAddress,SIZE_T dwSize); +int WTSGetActiveConsoleSessionId(); +int WaitCommEvent(HANDLE hFile,LPDWORD lpEvtMask,LPOVERLAPPED lpOverlapped); +int WaitForDebugEvent(LPDEBUG_EVENT lpDebugEvent,DWORD dwMilliseconds); +int WaitForMultipleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds); +int WaitForMultipleObjectsEx(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable); +int WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); +int WaitForSingleObjectEx(HANDLE hHandle,DWORD dwMilliseconds,BOOL bAlertable); +int WaitForThreadpoolIoCallbacks(PTP_IO pio,BOOL fCancelPendingCallbacks); +int WaitForThreadpoolTimerCallbacks(PTP_TIMER pti,BOOL fCancelPendingCallbacks); +int WaitForThreadpoolWaitCallbacks(PTP_WAIT pwa,BOOL fCancelPendingCallbacks); +int WaitForThreadpoolWorkCallbacks(PTP_WORK pwk,BOOL fCancelPendingCallbacks); +int WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable); +int WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable); +int WerGetFlags(HANDLE hProcess,PDWORD pdwFlags); +int WerRegisterFile(PCWSTR pwzFile,WER_REGISTER_FILE_TYPE regFileType,DWORD dwFlags); +int WerRegisterMemoryBlock(PVOID pvAddress,DWORD dwSize); +int WerRegisterRuntimeExceptionModule(PCWSTR pwszOutOfProcessCallbackDll,PVOID pContext); +int WerSetFlags(DWORD dwFlags); +int WerUnregisterFile(PCWSTR pwzFilePath); +int WerUnregisterMemoryBlock(PVOID pvAddress); +int WerUnregisterRuntimeExceptionModule(PCWSTR pwszOutOfProcessCallbackDll,PVOID pContext); +int WideCharToMultiByte(UINT CodePage,DWORD Options,LPCWSTR WideCharStr,int WideCharCount,LPSTR lpszBuffer,int MultiByteByte,LPCSTR pDefaultChar,LPBOOL pDefaultCharUsed); +int WinExec(LPCSTR lpCmdLine,UINT uCmdShow); +int Wow64DisableWow64FsRedirection(PVOID* OldValue); +int Wow64EnableWow64FsRedirection(BOOLEAN Wow64FsEnableRedirection); +int Wow64GetThreadContext(HANDLE hThread,PWOW64_CONTEXT lpContext); +int Wow64GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,PWOW64_LDT_ENTRY lpSelectorEntry); +int Wow64RevertWow64FsRedirection(PVOID OldValue); +int Wow64SetThreadContext(HANDLE hThread,CONST WOW64_CONTEXT* lpContext); +int Wow64SuspendThread(HANDLE hThread); +int WriteConsole(HANDLE hConsoleOutput,LPCTSTR lpBuffer,DWORD nNumberOfCharsToWrite,LPDWORD lpNumberOfCharsWritten,LPVOID lpReserved); +int WriteConsoleInput(HANDLE hConsoleInput,const INPUT_RECORD* lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsWritten); +int WriteConsoleOutput(HANDLE hConsoleOutput,const CHAR_INFO* lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion); +int WriteConsoleOutputA(HANDLE hConsoleOutput,const CHAR_INFO* lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion); +int WriteConsoleOutputAttribute(HANDLE hConsoleOutput,const WORD* lpAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten); +int WriteConsoleOutputCharacter(HANDLE hConsoleOutput,LPCTSTR lpCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); +BOOL WriteFile(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped); +int WriteFileEx(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); +int WriteFileGather(HANDLE hFile,FILE_SEGMENT_ELEMENT lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD pOverlapped,LPOVERLAPPED lpCompletionRoutine); +int WriteFileW(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped); +int WritePrivateProfileSection(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); +int WritePrivateProfileSectionA(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); +int WritePrivateProfileSectionW(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); +int WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName); +int WritePrivateProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR pFileName); +int WritePrivateProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR pFileName); +int WritePrivateProfileStruct(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); +int WritePrivateProfileStructA(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); +int WritePrivateProfileStructW(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); +int WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpStockBuffer,SIZE_T nBufferSize,SIZE_T* lpNumberOfBytesWritten); +int WriteProfileSection(LPCTSTR lpAppName,LPCTSTR lpString); +int WriteProfileSectionA(LPCTSTR lpAppName,LPCTSTR lpString); +int WriteProfileSectionW(LPCTSTR lpAppName,LPCTSTR lpString); +int WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString); +int WriteProfileStringA(LPCTSTR lpszSection,LPCTSTR lpszKeyName,LPCTSTR lpszString); +int WriteProfileStringW(LPCTSTR lpszSection,LPCTSTR lpszKeyName,LPCTSTR lpszString); +int WriteTapemark(HANDLE hDevice,DWORD dwTapemarkType,DWORD dwTapemarkCount,BOOL bImmediate); +int ZombifyActCtx(HANDLE hActCtx); +int _hread(HFILE hFile,DWORD lpBuffer,DWORD nBufferSize); +int _hwrite(HFILE hFile,DWORD lpBuffer,DWORD nBufferSize); +int _lclose(HFILE hFile); +int _lcreat(LPCSTR lpPathName,DWORD iAttribute); +int _llseek(HFILE hFile,LONG lOffset,int iOrigin); +int _lopen(LPCSTR lpPathName,int iReadWrite); +int _lread(HFILE hFile,LPVOID lpBuffer,UINT nBufferSize); +int _lwrite(HFILE hFile,LPVOID lpBuffer,UINT nBufferSize); +int lstrcat(LPTSTR String1,LPTSTR String2); +int lstrcatW(LPTSTR String1,LPTSTR String2); +int lstrcmp(LPCTSTR string1,LPCTSTR string2); +int lstrcmpA(LPCTSTR string1,LPCTSTR string2); +int lstrcmpW(LPCTSTR string1,LPCTSTR string2); +int lstrcmpi(LPCTSTR string1,LPCTSTR string2); +int lstrcmpiW(LPCTSTR lpString1,LPCTSTR lpString2); +int lstrcpy(LPTSTR lpString1,LPTSTR lpString2); +int lstrcpyW(LPTSTR lpString1,LPTSTR lpString2); +int lstrcpyn(LPTSTR lpBuffer,LPCTSTR lpstrSrc,int nBuffer); +int lstrcpynW(LPTSTR lpBuffer,LPCTSTR lpstrSrc,int nBuffer); +int lstrlen(LPCTSTR lpString); +int lstrlenA(LPCTSTR lpString); +int lstrlenW(LPCTSTR lpString); +int RtlUnwind(PEXCEPTION_REGISTRATION pRegistrationFrame,PVOID returnAddr,PEXCEPTION_RECORD pExcptRec,DWORD _eax_value); +bool CreatePipe(PHANDLE hReadPipe,PHANDLE hWritePipe,LPSECURITY_ATTRIBUTES lpPipeAttributes,DWORD nSize); +long SetHandleCount(long wNumber); \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/shell32.txt b/x64_dbg_gui/Project/Data/shell32.txt new file mode 100644 index 00000000..11d0250a --- /dev/null +++ b/x64_dbg_gui/Project/Data/shell32.txt @@ -0,0 +1,246 @@ +int AssocCreateForClasses(const ASSOCIATIONELEMENT* rgClasses,ULONG cClasses,REFIID riid,void** ppv); +int AssocGetDetailsOfPropKey(IShellFolder* psf,PCUITEMID_CHILD pidl,PROPERTYKEY* pkey,VARIANT* pv,BOOL* pfFoundPropKey); +int CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder,HWND hwnd,UINT cidl,PCUITEMID_CHILD_ARRAY* apidl,IShellFolder* psf,LPFNDFMCALLBACK lpfn,UINT nKeys,const HKEY* ahkeys,IContextMenu** ppcm); +int CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUIDLIST_RELATIVE_ARRAY apidl,IDataObject** ppdtobj); +int CallCPLEntry16(HINSTANCE hInst,FARPROC16 lpfnEntry,HWND hwndCPL,UINT msg,LPARAM lParam1,LPARAM lParam2); +int CommandLineToArgvW(LPCWSTR lpCmdLine,int* pNumArgs); +int DAD_AutoScroll(HWND hwnd,AUTO_SCROLL_DATA* pad,const POINT* pptNow); +int DAD_DragEnterEx(HWND hwndTarget,const POINT ptStart); +int DAD_DragLeave(); +int DAD_DragMove(POINT pt); +int DAD_SetDragImage(HIMAGELIST him,POINT* pptOffset); +int DAD_ShowDragImage(BOOL fShow); +int DllGetVersion(DLLVERSIONINFO* pDllVersionInfo); +int DoEnvironmentSubst(LPTSTR pszString,UINT cchString); +int DragAcceptFiles(HWND hWnd,BOOL fAccept); +int DragFinish(HDROP hDrop); +int DragQueryFile(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); +int DragQueryFileA(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); +int DragQueryFileW(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); +int DragQueryPoint(HDROP hDrop,LPPOINT lppt); +int DriveType(int iDrive); +int DuplicateIcon(HINSTANCE hInst,HICON hIcon); +int ExtractAssociatedIcon(HINSTANCE hInst,LPTSTR lpIconPath,LPWORD lpiIcon); +int ExtractAssociatedIconA(HINSTANCE hInst,LPTSTR szIconPath,LPWORD lpiIcon); +int ExtractAssociatedIconEx(HINSTANCE hInst,LPTSTR lpIconPath,LPWORD lpiIconIndex,LPWORD lpiIconId); +int ExtractAssociatedIconW(HINSTANCE hInst,LPTSTR szIconPath,LPWORD lpiIcon); +int ExtractIcon(DWORD hInst,DWORD lpszExeFileName,DWORD nIconIndex); +int ExtractIcon(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); +int ExtractIconA(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); +int ExtractIconEx(LPCTSTR lpszFile,int nIconIndex,HICON* phiconLarge,HICON* phiconSmall,UINT nIcons); +int ExtractIconExW(LPCTSTR lpszFile,int nIconIndex,HICON* phiconLarge,HICON* phiconSmall,UINT nIcons); +int ExtractIconW(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); +int FileIconInit(BOOL fRestoreCache); +int FindExecutable(LPCTSTR lpFile,LPCTSTR lpDirectory,LPTSTR lpResult); +int GUIDFromString(LPCTSTR psz,LPGUID pguid); +int GetCurrentProcessExplicitAppUserModelID(PWSTR* AppID); +int GetFileNameFromBrowse(HWND hwnd,LPWSTR pszFilePath,UINT cchFilePath,LPCWSTR pszWorkingDir,LPCWSTR pszDefExt,LPCWSTR pszFilters,LPCWSTR szTitle); +int ILAppendID(PIDLIST_RELATIVE pidl,LPSHITEMID pmkid,BOOL fAppend); +int ILClone(PCUIDLIST_RELATIVE pidl); +int ILCloneFirst(PCUIDLIST_RELATIVE pidl); +int ILCombine(PCIDLIST_ABSOLUTE pidl1,PCUIDLIST_RELATIVE pidl2); +int ILCreateFromPath(LPCSTR pszPath); +int ILFindChild(PCIDLIST_ABSOLUTE pidlParent,PCIDLIST_ABSOLUTE pidlChild); +int ILFindLastID(PCUIDLIST_RELATIVE pidl); +int ILFree(PIDLIST_RELATIVE pidl); +int ILGetNext(PCUIDLIST_RELATIVE pidl); +int ILGetSize(PCUIDLIST_RELATIVE pidl); +int ILIsEqual(PCIDLIST_ABSOLUTE pidl1,PCIDLIST_ABSOLUTE pidl2); +int ILIsParent(PCIDLIST_ABSOLUTE pidl1,PCIDLIST_ABSOLUTE pidl2,BOOL fImmediate); +int ILLoadFromStream(IStream* pstm,PIDLIST_RELATIVE* pidl); +int ILRemoveLastID(PUIDLIST_RELATIVE pidl); +int ILSaveToStream(IStream* pstm,PCUIDLIST_RELATIVE pidl); +int InitNetworkAddressControl(); +int IsNetDrive(int iDrive); +int IsUserAnAdmin(); +int LinkWindow_RegisterClass(); +int LinkWindow_UnregisterClass(); +int NTSHChangeNotifyDeregister(ULONG ulID); +int NTSHChangeNotifyRegister(HWND hwnd,int fSources,LONG fEvents,UINT wMsg,int cEntries,SHChangeNotifyEntry* pfsne); +int OpenRegStream(HKEY hkey,LPCWSTR pszSubkey,LPCWSTR pszValue,DWORD grfMode); +int ParseField(LPCTSTR* szData,int n,LPTSTR* szBuf,int iBufLen); +int PathCleanupSpec(LPCWSTR pszDir,LPWSTR pszSpec); +int PathGetShortPath(LPWSTR pszLongPath); +int PathIsExe(LPCWSTR szfile); +int PathIsSlow(LPCTSTR pszFile,DWORD dwFileAttr); +int PathMakeUniqueName(LPWSTR pszUniqueName,UINT cchMax,LPCWSTR pszTemplate,LPCWSTR pszLongPlate,LPCWSTR pszDir); +int PathProcessCommand(LPCWSTR lpSrc,LPWSTR lpDest,int iDestMax,DWORD dwFlags); +int PathResolve(LPWSTR pszPath,LPCWSTR* dirs,UINT fFlags); +int PathYetAnotherMakeUniqueName(LPWSTR pszUniqueName,LPCWSTR pszPath,LPCWSTR pszShort,LPCWSTR pszFileSpec); +int PickIconDlg(HWND hwnd,LPWSTR pszIconPath,UINT cchIconPath,int* piIconIndex); +int PifMgr_CloseProperties(HANDLE hProps,UINT flOpt); +int PifMgr_GetProperties(HANDLE hProps,LPCSTR pszGroup,VOID* lpProps,int cbProps,UINT flOpt); +int PifMgr_OpenProperties(LPCWSTR pszApp,LPCWSTR lpszPIF,UINT hInf,UINT flOpt); +int PifMgr_SetProperties(HANDLE hProps,LPCSTR pszGroup,VOID* lpProps,int cbProps,UINT flOpt); +int ReadCabinetState(CABINETSTATE* pcs,int cLength); +int RealDriveType(int iDrive,BOOL fOKToHitNet); +int RestartDialog(HWND hParent,LPCWSTR pszPrompt,DWORD dwFlags); +int RestartDialogEx(HWND hParent,LPCWSTR pszPrompt,DWORD dwFlags,HWND dwReasonCode); +int SHAddDefaultPropertiesByExt(PCWSTR pszExt,IPropertyStore* pPropStore); +int SHAddFromPropSheetExtArray(HPSXA hpsxa,LPFNADDPROPSHEETPAGE lpfnAddPage,LPARAM lParam); +int SHAddToRecentDocs(UINT uFlags,LPCVOID pv); +int SHAlloc(SIZE_T cb); +int SHAppBarMessage(DWORD dwMessage,PAPPBARDATA pData); +int SHAssocEnumHandlers(LPCWSTR pszExtra,ASSOC_FILTER afFilter,IEnumAssocHandlers** ppEnumHandler); +int SHAssocEnumHandlersForProtocolByApplication(PCWSTR protocol,REFIID riid,void** enumHandlers); +int SHBindToFolderIDListParent(IShellFolder* psfRoot,PCUIDLIST_RELATIVE pidl,REFIID riid,void** ppv,PCUITEMID_CHILD* ppidlLast); +int SHBindToObject(IShellFolder* psf,PCUIDLIST_RELATIVE pidl,IBindCtx* pbc,REFIID riid,void** ppv); +int SHBindToParent(PCIDLIST_ABSOLUTE pidl,REFIID riid,VOID** ppv,PCUITEMID_CHILD* ppidlLast); +int SHBrowseForFolder(LPBROWSEINFO lpbi); +int SHCLSIDFromString(LPCWSTR psz,CLSID* pclsid); +int SHChangeNotification_Lock(HANDLE hChange,DWORD dwProcId,PIDLIST_ABSOLUTE** pppidl,LONG* plEvent); +int SHChangeNotification_Unlock(HANDLE hLock); +int SHChangeNotify(DWORD wEventId,DWORD uFlags,LPCVOID dwItem1,LPCVOID dwItem2); +int SHChangeNotifyDeregister(ULONG ulID); +int SHChangeNotifyRegister(HWND hwnd,int fSources,LONG fEvents,UINT wMsg,int cEntries,const SHChangeNotifyEntry* pshcne); +int SHChangeNotifyRegisterThread(SCNRT_STATUS status); +int SHCloneSpecialIDList(HWND hwndOwner,DWORD csidl,BOOL fCreate); +int SHCoCreateInstance(LPCWSTR pszCLSID,const CLSID* pclsid,IUnknown* pUnkOuter,REFIID riid,void** ppv); +int SHCreateAssociationRegistration(REFIID riid,void** ppv); +int SHCreateDataObject(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,IDataObject* pdtInner,REFIID riid,void** ppv); +int SHCreateDefaultContextMenu(const DEFCONTEXTMENU* pdcm,REFIID riid,void** ppv); +int SHCreateDefaultExtractIcon(REFIID riid,void** ppv); +int SHCreateDefaultPropertiesOp(IShellItem* psi,IFileOperation** ppFileOp); +int SHCreateDirectory(HWND hwnd,LPCWSTR pszPath); +int SHCreateDirectoryEx(HWND hwnd,LPCTSTR pszPath,const SECURITY_ATTRIBUTES* psa); +int SHCreateFileExtractIconW(LPCWSTR pszFile,DWORD dwFileAttributes,REFIID riid,void** ppv); +int SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl,REFIID riid,void** ppv); +int SHCreateItemFromParsingName(PCWSTR pszPath,IBindCtx* pbc,REFIID riid,void** ppv); +int SHCreateItemFromRelativeName(IShellItem* psiParent,PCWSTR pszName,IBindCtx* pbc,REFIID riid,void** ppv); +int SHCreateItemInKnownFolder(REFKNOWNFOLDERID kfid,KNOWN_FOLDER_FLAG dwKFFlags,PCWSTR pszItem,REFIID riid,void** ppv); +int SHCreateItemWithParent(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psfParent,PCUITEMID_CHILD pidl,REFIID riid,void** ppvItem); +int SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi); +int SHCreatePropSheetExtArray(HKEY hkey,LPCWSTR pszSubkey,UINT max_iface); +int SHCreateQueryCancelAutoPlayMoniker(IMoniker** ppmoniker); +int SHCreateShellFolderView(const SFV_CREATE* pcsfv,IShellView** ppsv); +int SHCreateShellFolderViewEx(LPCSFV pcsfv,IShellView** ppsv); +int SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psfParent,PCUITEMID_CHILD pidl,IShellItem** ppsi); +int SHCreateShellItemArray(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psf,UINT cidl,PCUITEMID_CHILD_ARRAY ppidl,IShellItemArray** ppsiItemArray); +int SHCreateShellItemArrayFromDataObject(IDataObject* pdo,REFIID riid,void** ppv); +int SHCreateShellItemArrayFromIDLists(UINT cidl,PCIDLIST_ABSOLUTE_ARRAY rgpidl,IShellItemArray** ppsiItemArray); +int SHCreateShellItemArrayFromShellItem(IShellItem* psi,REFIID riid,void** ppv); +int SHCreateStdEnumFmtEtc(UINT cfmt,IEnumFORMATETC** ppenumFormatEtc); +int SHDefExtractIcon(LPCTSTR pszIconFile,int iIndex,UINT uFlags,HICON* phiconLarge,HICON* phiconSmall,UINT nIconSize); +int SHDestroyPropSheetExtArray(HPSXA hpsxa); +int SHDoDragDrop(HWND hwnd,IDataObject* pdtobj,IDropSource* pdsrc,DWORD dwEffect,DWORD* pdwEffect); +int SHEmptyRecycleBin(HWND hwnd,LPCTSTR pszRootPath,DWORD dwFlags); +int SHEnumerateUnreadMailAccountsW(HKEY hKeyUser,DWORD dwIndex,LPWSTR pszMailAddress,int cchMailAddress); +int SHEvaluateSystemCommandTemplate(PCWSTR pszCmdTemplate,PWSTR* ppszApplication,PWSTR* ppszCommandLine,PWSTR* ppszParameters); +int SHExtractIconsW(LPCWSTR pszFileName,int nIconIndex,int cxIcon,int cyIcon,HICON* phIcon,UINT* pIconId,UINT nIcons,UINT flags); +int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp); +int SHFindFiles(PCIDLIST_ABSOLUTE pidlFolder,PCIDLIST_ABSOLUTE pidlSaveFile); +int SHFind_InitMenuPopup(HMENU hmenu,HWND hwnd,UINT idCmdFirst,UINT idCmdLast); +int SHFlushClipboard(); +int SHFlushSFCache(); +int SHFormatDrive(HWND hwnd,UINT drive,UINT fmtID,UINT options); +int SHFree(void* pv); +int SHFreeNameMappings(HANDLE hNameMappings); +int SHGetAttributesFromDataObject(IDataObject* pdo,DWORD dwAttributeMask,DWORD* pdwAttributes,UINT* pcItems); +int SHGetDataFromIDList(IShellFolder* psf,PCUITEMID_CHILD pidl,DWORD nFormat,PVOID pv,int cb); +int SHGetDesktopFolder(IShellFolder** ppshf); +int SHGetDiskFreeSpace(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); +int SHGetDiskFreeSpaceEx(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); +int SHGetDiskFreeSpaceExW(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); +int SHGetDriveMedia(LPCWSTR pszDrive,DWORD* pdwMediaContent); +int SHGetFileInfo(LPCTSTR szPath,DWORD dwFileAttributes,SHFILEINFO* pSFileInfo,UINT cbFileInfo,UINT uFlags); +int SHGetFileInfoW(LPCTSTR szPath,DWORD dwFileAttributes,SHFILEINFO* pSFileInfo,UINT cbFileInfo,UINT uFlags); +int SHGetFolderLocation(HWND hwndOwner,DWORD nFolder,HANDLE hToken,DWORD dwReserved,PIDLIST_ABSOLUTE* ppidl); +int SHGetFolderPath(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwFlags,LPTSTR pszPath); +int SHGetFolderPathA(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwReserved,LPTSTR lpBuffer); +int SHGetFolderPathAndSubDir(HWND hwnd,DWORD csidl,HANDLE hToken,DWORD dwFlags,LPCTSTR pszSubDir,LPTSTR pszPath); +int SHGetFolderPathW(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwReserved,LPTSTR lpBuffer); +int SHGetIDListFromObject(IUnknown* punk,PIDLIST_ABSOLUTE* ppidl); +int SHGetIconOverlayIndex(LPCTSTR pszIconPath,int iIconIndex); +int SHGetImageList(int iImageList,REFIID riid,void** ppv); +int SHGetInstanceExplorer(IUnknown** ppunk); +int SHGetItemFromDataObject(IDataObject* pdtobj,DATAOBJ_GET_ITEM_FLAGS dwFlags,REFIID riid,void** ppv); +int SHGetItemFromObject(IUnknown* punk,REFIID riid,void** ppv); +int SHGetKnownFolderIDList(REFKNOWNFOLDERID rfid,KNOWN_FOLDER_FLAG dwFlags,HANDLE hToken,PIDLIST_ABSOLUTE* ppidl); +int SHGetKnownFolderItem(REFKNOWNFOLDERID rfid,KNOWN_FOLDER_FLAG dwFlags,HANDLE hToken,REFIID riid,void** ppv); +int SHGetKnownFolderPath(REFKNOWNFOLDERID rfid,DWORD dwFlags,HANDLE hToken,PWSTR* ppszPath); +int SHGetLocalizedName(LPCWSTR pszPath,LPWSTR pszResModule,UINT cch,int* pidsRes); +int SHGetMalloc(LPMALLOC* ppMalloc); +int SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl,SIGDN sigdnName,PWSTR* ppszName); +int SHGetNameFromPropertyKey(REFPROPERTYKEY propkey,PWSTR* ppszCanonicalName); +int SHGetNewLinkInfo(LPCTSTR pszLinkTo,LPCTSTR pszDir,LPTSTR pszName,BOOL* pfMustCopy,UINT uFlags); +int SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl,LPTSTR pszPath); +int SHGetPathFromIDListEx(PCIDLIST_ABSOLUTE pidl,PWSTR pszPath,DWORD cchPath,GPFIDL_FLAGS uOpts); +int SHGetPathFromIDListW(PCIDLIST_ABSOLUTE pidlTarget,LPTSTR pszPath); +int SHGetPropertyStoreForWindow(HWND hwnd,REFIID riid,void** ppv); +int SHGetPropertyStoreFromIDList(PCIDLIST_ABSOLUTE pidl,GETPROPERTYSTOREFLAGS flags,REFIID riid,void** ppv); +int SHGetPropertyStoreFromParsingName(PCWSTR pszPath,IBindCtx* pbc,GETPROPERTYSTOREFLAGS flags,REFIID riid,void** ppv); +int SHGetRealIDL(IShellFolder* psf,PCUITEMID_CHILD pidlSimple,PITEMID_CHILD* ppidlReal); +int SHGetSetFolderCustomSettings(LPSHFOLDERCUSTOMSETTINGS pfcs,LPCTSTR pszPath,DWORD dwReadWrite); +int SHGetSetSettings(LPSHELLSTATE lpss,DWORD dwMask,BOOL bSet); +int SHGetSettings(LPSHELLFLAGSTATE lpsfs,DWORD dwMask); +int SHGetShellStyleHInstance(); +int SHGetSpecialFolderLocation(HWND hwndOwner,DWORD nFolder,PIDLIST_ABSOLUTE* pidl); +int SHGetSpecialFolderPath(HWND hwndOwner,LPTSTR lpszPath,DWORD csidl,BOOL fCreate); +int SHGetSpecialFolderPathA(HWND hwnd,LPTSTR pszPath,DWORD csidl,BOOL fCreate); +int SHGetSpecialFolderPathW(HWND hwnd,LPTSTR pszPath,DWORD csidl,BOOL fCreate); +int SHGetStockIconInfo(SHSTOCKICONID siid,UINT uFlags,SHSTOCKICONINFO* psii); +int SHGetTemporaryPropertyForItem(IShellItem* psi,REFPROPERTYKEY pk,PROPVARIANT* ppropvarInk); +int SHGetUnreadMailCountW(HKEY hKeyUser,LPCWSTR pszMailAddress,DWORD* pdwCount,FILETIME* pFileTime,LPCWSTR pszShellExecuteCommand,int cchShellExecuteCommand); +int SHHandleUpdateImage(PCIDLIST_ABSOLUTE pidlExtra); +int SHILCreateFromPath(LPCWSTR pszPath,PIDLIST_ABSOLUTE* ppidl,DWORD* rgflnOut); +int SHInvokePrinterCommand(HWND hwnd,UINT uAction,LPCTSTR lpBuf1,LPCTSTR lpBuf2,BOOL fModal); +int SHIsFileAvailableOffline(LPCWSTR pszPath,LPDWORD pdwStatus); +int SHLimitInputEdit(HWND hwndEdit,IShellFolder* psf); +int SHLoadInProc(REFCLSID rclsid); +int SHLoadNonloadedIconOverlayIdentifiers(); +int SHLoadOLE(LPARAM lParam); +int SHLocalStrDup(LPCWSTR psz,LPWSTR* ppsz); +int SHMapIDListToImageListIndexAsync(IShellTaskScheduler* pts,IShellFolder* psf,LPCITEMIDLIST pidl,UINT flags,PFNASYNCICONTASKBALLBACK pfn,void* pvData,void* pvHint,int* piIndex,int* piIndexSel); +int SHMapPIDLToSystemImageListIndex(IShellFolder* psf,PCUITEMID_CHILD pidl,int* piIndex); +int SHMultiFileProperties(IDataObject* pdtobj,DWORD dwFlags); +int SHObjectProperties(HWND hwnd,DWORD shopObjectType,PCWSTR pszObjectName,PCWSTR pszPropertyPage); +int SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUITEMID_CHILD_ARRAY* apidl,DWORD dwFlags); +int SHOpenPropSheetW(LPCWSTR pszCaption,UINT ckeys,const CLSID* pclsidDef,IDataObject* pdtobj,IShellBrowser* psb,LPCWSTR pStartPage); +int SHOpenWithDialog(HWND hwndParent,const OPENASINFO* poainfo); +int SHParseDisplayName(LPCWSTR pszName,IBindCtx* pbc,PIDLIST_ABSOLUTE* ppidl,SFGAOF sfgaoIn,SFGAOF* psfgaoOut); +int SHPathPrepareForWrite(HWND hwnd,IUnknown* punkEnableModless,LPCTSTR pszPath,DWORD dwFlags); +int SHPropStgCreate(IPropertySetStorage* psstg,REFFMTID fmtid,const CLSID* pclsid,DWORD grfFlags,DWORD grfMode,DWORD dwDisposition,IPropertyStorage** ppstg,UINT* puCodePage); +int SHPropStgReadMultiple(IPropertyStorage* pps,UINT uCodePage,ULONG cpspec); +int SHPropStgWriteMultiple(IPropertyStorage* pps,UINT* uCodePage,ULONG cpspec,PROPID propidNameFirst); +int SHQueryRecycleBin(LPCTSTR pszRootPath,LPSHQUERYRBINFO pSHQueryRBInfo); +int SHQueryUserNotificationState(QUERY_USER_NOTIFICATION_STATE* pquns); +int SHRemoveLocalizedName(LPCWSTR pszPath); +int SHReplaceFromPropSheetExtArray(HPSXA hpsxa,UINT uPageID,LPFNADDPROPSHEETPAGE lpfnReplaceWith,LPARAM lParam); +int SHResolveLibrary(IShellItem* psiLibrary); +int SHRestricted(RESTRICTIONS rest); +int SHRunControlPanel(LPCWSTR lpcszCmdLine,HWND hwndMsgParent); +int SHSetDefaultProperties(HWND hwnd,IShellItem* psi,DWORD dwFileOpFlags,IFileOperationProgressSink* pfops); +int SHSetFolderPath(DWORD csidl,HANDLE hToken,DWORD dwFlags,LPCTSTR pszPath); +int SHSetInstanceExplorer(IUnknown* punk); +int SHSetKnownFolderPath(REFKNOWNFOLDERID rfid,DWORD dwFlags,HANDLE hToken,PCWSTR pszPath); +int SHSetLocalizedName(LPCWSTR pszPath,LPCWSTR pszResModule,int idsRes); +int SHSetTemporaryPropertyForItem(IShellItem* psi,REFPROPERTYKEY propkey,REFPROPVARIANT propvar); +int SHSetUnreadMailCountW(LPCWSTR pszMailAddress,DWORD dwCount,LPCWSTR pszShellExecuteCommand); +int SHShellFolderView_Message(HWND hwnd,UINT uMsg,LPARAM lparam); +int SHShowManageLibraryUI(IShellItem* psiLibrary,HWND hwndOwner,LPCWSTR pszTitle,LPCWSTR pszInstruction,LIBRARYMANAGEDIALOGOPTIONS lmdOptions); +int SHSimpleIDListFromPath(LPCWSTR pszPath); +int SHStartNetConnectionDialogW(HWND hwnd,LPCWSTR pszRemoteName,DWORD dwType); +int SHTestTokenMembership(HANDLE hToken,ULONG ulRID); +int SHUnlockShared(void* pvData); +int SHUpdateImage(LPCTSTR pszHashItem,int iIndex,UINT uFlags,int iImageIndex); +int SHValidateUNC(HWND hwndOwner,LPWSTR pszFile,UINT fConnect); +int SetCurrentProcessExplicitAppUserModelID(PCWSTR AppID); +int ShellAbout(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); +int ShellAboutA(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); +int ShellAboutW(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); +int ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); +int ShellExecuteA(HWND hWnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); +int ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo); +int ShellExecuteExW(LPSHELLEXECUTEINFO lpExecInfo); +int ShellExecuteW(HWND hWnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); +int Shell_GetCachedImageIndex(LPCWSTR pwszIconPath,int iIconIndex,UINT uIconFlags); +int Shell_GetImageLists(HIMAGELIST* phiml,HIMAGELIST* phimlSmall); +int Shell_MergeMenus(HMENU hmDst,HMENU hmSrc,UINT uInsert,UINT uIDAdjust,UINT uIDAdjustMax,ULONG uFlags); +int Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid); +int Shell_NotifyIconGetRect(const NOTIFYICONIDENTIFIER* identifier,RECT* iconLocation); +int Shell_NotifyIconW(DWORD dwMessage,PNOTIFYICONDATA pnid); +int SignalFileOpen(PCIDLIST_ABSOLUTE pidl); +int StgMakeUniqueName(IStorage* pstgParent,PCWSTR pszFileSpec,DWORD grfMode,REFIID riid,void** ppv); +int WOWShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd,void* lpfnCBWinExec); +int Win32DeleteFile(LPCTSTR pszFileName); +int WriteCabinetState(CABINETSTATE* pcs); \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/stdio.txt b/x64_dbg_gui/Project/Data/stdio.txt new file mode 100644 index 00000000..0f206671 --- /dev/null +++ b/x64_dbg_gui/Project/Data/stdio.txt @@ -0,0 +1,61 @@ +int printf(constchar *, ...); +int _scanf(char * format, ...); +char * strchr(char *,char); +void * memcpy(void *, constvoid *, size_t); +int memcmp(constvoid *, constvoid *, size_t); +void * memset(void *,int, size_t); +char * _strset(char *,int); +char * strcpy(char *, constchar *); +char * strcat(char *, constchar *); +int strcmp(constchar *, constchar *); +size_t strlen(constchar *); +int _chdir(constchar *); +char * _getcwd(char *,int); +int _mkdir(constchar *); +int _rmdir(constchar *); +char * _fullpath(char *, constchar *, size_t); +void _splitpath(constchar *,char *,char *,char *,char *); +void _makepath(char *, constchar *, constchar *, constchar *, constchar *); +long _findfirst(constchar *, struct _finddata_t *); +int _findnext(long, struct _finddata_t *); +long _findfirst(constchar *, DWORD *); +int _findnext(long, DWORD *); +int _findclose(long); +void * memccpy(void *, constvoid *,int, unsignedint); +int memicmp(constvoid *, constvoid *, unsignedint); +void * memccpy(void *, constvoid *,int, DWORD); +int memicmp(constvoid *, constvoid *, DWORD); +int strcmpi(constchar *, constchar *); +int stricmp(constchar *, constchar *); +char * strdup(constchar *); +char * strlwr(char *); +int strnicmp(constchar *, constchar *, size_t); +char * strnset(char *,int, size_t); +char * strrev(char *); +char * strset(char *,int); +char * strupr(char *); +char * strchr(constchar *,int); +int _strcmpi(constchar *, constchar *); +int _stricmp(constchar *, constchar *); +int strcoll(constchar *, constchar *); +int _stricoll(constchar *, constchar *); +int _strncoll(constchar *, constchar *, size_t); +int _strnicoll(constchar *, constchar *, size_t); +size_t strcspn(constchar *, constchar *); +char * _strdup(constchar *); +char * _strerror(constchar *); +char * strerror(int); +char * _strlwr(char *); +char * strncat(char *, constchar *, size_t); +int strncmp(constchar *, constchar *, size_t); +int _strnicmp(constchar *, constchar *, size_t); +char * strncpy(char *, constchar *, size_t); +char * _strnset(char *,int, size_t); +char * strpbrk(constchar *, constchar *); +char * strrchr(constchar *,int); +char * _strrev(char *); +size_t strspn(constchar *, constchar *); +char * strstr(constchar *, constchar *); +char * strtok(char *, constchar *); +char * _strupr(char *); +size_t strxfrm (char *, constchar *, size_t); diff --git a/x64_dbg_gui/Project/Data/user32.txt b/x64_dbg_gui/Project/Data/user32.txt new file mode 100644 index 00000000..dac74ceb --- /dev/null +++ b/x64_dbg_gui/Project/Data/user32.txt @@ -0,0 +1,719 @@ +BOOL DestroyWindow(HWND hWnd); +BOOL EndDialog(HWND hDlg,int nResult); +BOOL EndPaint(HWND hWnd,const PAINTSTRUCT *lpPaint); +BOOL GetClientRect(HWND hWnd,LPRECT lpRect); +BOOL GetWindowRect(HWND hWnd,RECT * lpRect); +BOOL ShowWindow(HWND hWnd,int nCmdShow); +BOOL TranslateMessage(const MSG *lpMsg); +BOOL UpdateWindow(HWND hWnd); +COLORREF SetPixel(HDC,int,int,COLORREF); +HDC BeginPaint(HWND hWnd,PAINTSTRUCT *lpPaint); +HLOCAL LocalFree(HLOCAL hMem); +HMODULE GetModuleHandleA(LPCSTR lpModuleName); +int DrawTextA(HDC hDC,LPCSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); +void PostQuitMessage(int nExitCode); +void GetStartupInfo(LPSTARTUPINFO lpStartupInfo); +void GetStartupInfoA(LPSTARTUPINFO lpStartupInfo); +void GetStartupInfoW(LPSTARTUPINFO lpStartupInfo); +int EditWndProc(DWORD hWnd,DWORD uMsg,DWORD wParam,DWORD lParam); +int ActivateKeyboardLayout(KeyboardLayoutHandle hkl,UINT Flags); +int AddClipboardFormatListener(HWND hwnd); +int AdjustWindowRect(LPRECT lpRect,DWORD dwWinStyle,BOOL bMenu); +int AdjustWindowRectEx(LPRECT lpRect,DWORD dwWinStyle,BOOL bMenu,DWORD dwEsStyle); +int AllowActivateDetachQueuesSetFocus(); +int AllowSetForegroundWindow(DWORD dwProcessId); +int AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags); +int AnyPopup(); +int AppendMenu(HMENU hMenu,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); +int AppendMenuA(HMENU hMenu,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); +int AppendMenuW(HMENU hMenu,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); +int ArrangeIconicWindows(HWND hwnd); +int AttachThreadInput(DWORD idAttach,DWORD idAttachTo,BOOL fAttach); +int BeginDeferWindowPos(int nNumWindows); +int BeginPaint(HWND hwnd,LPPAINTSTRUCT lpPaint); +int BlockInput(BOOL fBlockIt); +int BringWindowToTop(HWND hWnd); +int BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM Param); +int BroadcastSystemMessageEx(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam,PBSMINFO pBSMInfo); +int CalculatePopupWindowPosition(const POINT* anchorPoint,const SIZE* windowSize,UINT flags,RECT* excludeRect,RECT* popupWindowPosition); +int CallMsgFilter(LPMSG lpMsg,int nCode); +int CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam); +int CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int CallWindowProcA(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int CallWindowProcW(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int CascadeWindows(HWND hwndParent,UINT wHow,const RECT* lpRect,UINT cKids,const HWND* lpKids); +int ChangeClipboardChain(HWND hWndRemove,HWND hWndNewNext); +int ChangeDisplaySettings(DEVMODE* lpDevMode,DWORD dwflags); +int ChangeDisplaySettingsEx(LPCTSTR lpszDeviceName,DEVMODE* lpDevMode,HWND hwnd,DWORD dwflags,LPVOID lParam); +int ChangeWindowMessageFilter(UINT message,DWORD dwFlag); +int ChangeWindowMessageFilterEx(HWND hWnd,UINT message,DWORD action,PCHANGEFILTERSTRUCT pChangeFilterStruct); +int CharLower(LPTSTR lpsz); +int CharLowerA(LPTSTR lpsz); +int CharLowerBuff(LPTSTR lpsz,DWORD cchLength); +int CharLowerBuffA(LPTSTR lpsz,DWORD cchLength); +int CharLowerBuffW(LPTSTR lpsz,DWORD cchLength); +int CharLowerW(LPTSTR lpsz); +int CharNext(LPCTSTR lpsz); +int CharNextA(LPCTSTR lpsz); +int CharNextExA(WORD CodePage,LPCSTR lpCurrentChar,DWORD dwFlags); +int CharNextW(LPCTSTR lpsz); +int CharPrev(LPCTSTR lpszStart,LPCTSTR lpszCurrent); +int CharPrevA(LPCTSTR lpszStart,LPCTSTR lpszCurrent); +int CharPrevExA(WORD CodePage,LPCSTR lpStart,LPCSTR lpCurrentChar,DWORD dwFlags); +int CharToOem(LPCTSTR lpszSrc,LPSTR lpszDst); +int CharToOemA(LPCTSTR lpszSrc,LPSTR lpszDst); +int CharToOemBuff(LPCTSTR lpszSrc,LPSTR lpszDst,DWORD cchDstLength); +int CharToOemW(LPCTSTR lpszSrc,LPSTR lpszDst); +int CharUpper(LPTSTR lpsz); +int CharUpperA(LPTSTR lpsz); +int CharUpperBuff(LPTSTR lpsz,DWORD cchLength); +int CharUpperBuffA(LPTSTR lpsz,DWORD cchLength); +int CharUpperBuffW(LPTSTR lpsz,DWORD cchLength); +int CharUpperW(LPTSTR lpsz); +int CheckDlgButton(HWND hDlg,int nIDButton,UINT uCheck); +int CheckMenuItem(HMENU hmenu,UINT uIDCheckItem,UINT uCheck); +int CheckMenuRadioItem(HMENU hmenu,UINT idFirst,UINT idLast,UINT idCheck,DWORD uFlags); +int CheckRadioButton(HWND hDlg,int nIDFirstButton,int nIDLastButton,int nIDCheckButton); +int ChildWindowFromPoint(HWND hWndParent,POINT Point); +int ChildWindowFromPointEx(HWND hwndParent,POINT pt,UINT uFlags); +int ClientToScreen(HWND hWnd,LPPOINT lpPoint); +int ClipCursor(const RECT* lpRect); +int CloseClipboard(); +int CloseDesktop(HDESK hDesktop); +int CloseGestureInfoHandle(HGESTUREINFO hGestureInfo); +int CloseTouchInputHandle(HTOUCHINPUT hTouchInput); +int CloseWindow(HWND hWnd); +int CloseWindowStation(HWINSTA hWinSta); +int CopyAcceleratorTable(HACCEL hAccelSrc,LPACCEL lpAccelDst,int cAccelEntries); +int CopyAcceleratorTableA(HACCEL hAccelSrc,LPACCEL IpAcceIDst,int cAccelEntries); +int CopyAcceleratorTableW(HACCEL hAccelSrc,LPACCEL IpAcceIDst,int cAccelEntries); +int CopyCursor(HCURSOR pcur); +int CopyIcon(HICON hIcon); +int CopyImage(HANDLE hImage,UINT uType,int cxDesired,int cyDesired,UINT fuFlags); +int CopyRect(LPRECT lprcDst,const RECT* lprcSrc); +int CountClipboardFormats(); +int CreateAcceleratorTable(LPACCEL lpaccl,int cEntries); +int CreateAcceleratorTableW(LPACCEL lpaccl,int cEntries); +int CreateCaret(HWND hWnd,HBITMAP hBitmap,int nWidth,int nHeight); +int CreateCursor(HINSTANCE hInst,int xHotSpot,int yHotSpot,int nWidth,int nHeight,const VOID* pvANDPlane,const VOID* pvXORPlane); +int CreateDesktop(LPCTSTR lpszDesktop,LPCTSTR lpszDevice,LPDEVMODE pDevmode,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa); +int CreateDesktopEx(LPCTSTR lpszDesktop,LPCTSTR lpszDevice,LPDEVMODE pDevmode,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa,ULONG ulHeapSize,PVOID pvoid); +int CreateDialogIndirectParam(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM lParamInit); +int CreateDialogIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFun,LPARAM lParamInit); +int CreateDialogIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFun,LPARAM lParamInit); +int CreateDialogParam(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM lParamInit); +int CreateDialogParamA(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); +int CreateDialogParamW(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); +int CreateIcon(HINSTANCE hInstance,int nWidth,int Height,BYTE cPlanes,BYTE cBitsPixel,const BYTE* lpbANDbits,const BYTE* lpbXORbits); +int CreateIconFromResource(PBYTE presbits,DWORD dwResSize,BOOL fIcon,DWORD dwVersion); +int CreateIconFromResourceEx(PBYTE pbIconBits,DWORD cbIconBits,BOOL fIcon,DWORD dwVersion,int cxDesired,int cyDesired,UINT uFlags); +int CreateIconIndirect(PICONINFO piconinfo); +int CreateMDIWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); +int CreateMDIWindowA(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); +int CreateMDIWindowW(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); +int CreateMenu(); +int CreatePopupMenu(); +int CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); +HWND CreateWindowEx(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); +HWND CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); +HWND CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent ,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); +int CreateWindowStation(LPCTSTR lpwinsta,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa); +int DdeAbandonTransaction(DWORD idInst,HCONV hConv,DWORD idTransaction); +int DdeAccessData(HDDEDATA hData,LPDWORD pcbDataSize); +int DdeAddData(HDDEDATA hData,LPBYTE pSrc,DWORD cb,DWORD cbOff); +int DdeClientTransaction(LPBYTE pData,DWORD cbData,HCONV hConv,HSZ hszItem,UINT wFmt,UINT wType,DWORD dwTimeout,LPDWORD pdwResult); +int DdeCmpStringHandles(HSZ hsz1,HSZ hsz2); +int DdeConnect(DWORD idInst,HSZ hszService,HSZ hszTopic,PCONVCONTEXT pCC); +int DdeConnectList(DWORD idInst,HSZ hszService,HSZ hszTopic,HCONVLIST hConvList,PCONVCONTEXT pCC); +int DdeCreateDataHandle(DWORD idInst,LPBYTE pSrc,DWORD cb,DWORD cbOff,HSZ hszItem,UINT wFmt,UINT afCmd); +int DdeCreateStringHandle(DWORD idInst,LPTSTR psz,int iCodePage); +int DdeDisconnect(HCONV hConv); +int DdeDisconnectList(HCONVLIST hConvList); +int DdeEnableCallback(DWORD idInst,HCONV hConv,UINT wCmd); +int DdeFreeDataHandle(HDDEDATA hData); +int DdeFreeStringHandle(DWORD idInst,HSZ hsz); +int DdeGetData(HDDEDATA hData,LPBYTE pDst,DWORD cbMax,DWORD cbOff); +int DdeGetLastError(DWORD idInst); +int DdeImpersonateClient(HCONV hConv); +int DdeInitialize(LPDWORD pidInst,PFNCALLBACK pfnCallback,DWORD afCmd,DWORD ulRes); +int DdeKeepStringHandle(DWORD idInst,HSZ hsz); +int DdeNameService(DWORD idInst,UINT hsz1,UINT hsz2,UINT afCmd); +int DdePostAdvise(DWORD idInst,HSZ hszTopic,HSZ hszItem); +int DdeQueryConvInfo(HCONV hConv,DWORD idTransaction,PCONVINFO pConvInfo); +int DdeQueryNextServer(HCONVLIST hConvList,HCONV hConvPrev); +int DdeQueryString(DWORD idInst,HSZ hsz,LPTSTR psz,DWORD cchMax,int iCodePage); +int DdeReconnect(HCONV hConv); +int DdeSetQualityOfService(HWND hwndClient,const SECURITY_QUALITY_OF_SERVICE* pqosNew,PSECURITY_QUALITY_OF_SERVICE pqosPrev); +int DdeSetUserHandle(HCONV hConv,DWORD id,DWORD_PTR hUser); +int DdeUnaccessData(HDDEDATA hData); +int DdeUninitialize(DWORD idInst); +int DefDlgProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam); +int DefDlgProcW(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam); +int DefFrameProc(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); +int DefFrameProcA(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); +int DefFrameProcW(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); +int DefMDIChildProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); +int DefMDIChildProcA(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); +int DefRawInputProc(PRAWINPUT* paRawInput,INT nInput,UINT cbSizeHeader); +LRESULT DefWindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +LRESULT DefWindowProcA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +LRESULT DefWindowProcW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int DeferWindowPos(HDWP hWinPosInfo,HWND hWnd,HWND hWndInsertAfter,int x,int y,int cx,int cy,UINT uFlags); +int DeleteMenu(HMENU hMenu,UINT uPosition,UINT uFlags); +int DeregisterShellHookWindow(HWND hWnd); +int DestroyAcceleratorTable(HACCEL hAccel); +int DestroyCaret(); +int DestroyCursor(HCURSOR hCursor); +int DestroyIcon(HICON hIcon); +int DestroyMenu(HMENU hMenu); +int DestroyWindow(HWND hWnd); +int DialogBoxIndirectParam(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); +int DialogBoxIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC pDialogFunc,LPARAM dwInitParam); +int DialogBoxIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC pDialogFunc,LPARAM dwInitParam); +int DialogBoxParam(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); +int DialogBoxParamA(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWnd,DLGPROC lpDialogFunc,LPARAM dwInitParam); +int DialogBoxParamW(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWnd,DLGPROC lpDialogFunc,LPARAM dwInitParam); +long DispatchMessage(const MSG *lpMsg); +long DispatchMessageA(const MSG *lpMsg); +long DispatchMessageW(const MSG *lpMsg); +int DlgDirList(HWND hDlg,LPTSTR lpPathSpec,int nIDListBox,int nIDStaticPath,UINT uFileType); +int DlgDirListComboBox(HWND hDlg,LPTSTR lpPathSpec,int nIDComboBox,int nIDStaticPath,UINT uFiletype); +int DlgDirSelectComboBoxEx(HWND hDlg,LPTSTR lpString,int nCount,int nIDComboBox); +int DlgDirSelectEx(HWND hDlg,LPTSTR lpString,int nCount,int nIDListBox); +int DragDetect(HWND hwnd,POINT pt); +int DrawAnimatedRects(HWND hWnd,int dAni,const RECT* lprcFrom,const RECT* lprcTo); +int DrawCaption(HWND hwnd,HDC hdc,LPCRECT lprc,UINT uFlags); +int DrawEdge(HDC hDC,LPRECT qrc,UINT edge,UINT grfFlags); +int DrawFocusRect(HDC hDC,const RECT* lprc); +int DrawFrameControl(HDC hDC,LPRECT lprc,UINT uType,UINT uState); +int DrawIcon(HDC hDC,int X,int Y,HICON hIcon); +int DrawIconEx(HDC hDC,int xLeft,int yTop,HICON hIcon,int cxWidth,int cyWidth,UINT istepIfAniCur,HBRUSH hbrFlickerFreeDraw,UINT diFlags); +int DrawMenuBar(HWND hWnd); +int DrawState(HDC hdc,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int x,int y,int cx,int cy,UINT fuFlags); +int DrawStateA(HDC hDC,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int X,int Y,int cx,int cy,UINT fuFlags); +int DrawStateW(HDC hDC,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int X,int Y,int cx,int cy,UINT fuFlags); +int DrawText(HDC hDC,LPCTSTR lpchText,int nCount,LPRECT lpRect,UINT uFormat); +int DrawTextA(HDC hDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); +int DrawTextEx(HDC hdc,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); +int DrawTextExA(HDC hDC,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); +int DrawTextExW(HDC hDC,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); +int DrawTextW(HDC hDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); +int EmptyClipboard(); +int EnableMenuItem(HMENU hMenu,UINT uIDEnableItem,UINT uEnable); +int EnableScrollBar(HWND hWnd,UINT WSBflags,UINT wArrows); +int EnableWindow(HWND hWnd,BOOL bEnable); +int EndDeferWindowPos(HDWP hWinPosInfo); +int EndDialog(HWND hDlg,INT_PTR nResult); +int EndMenu(); +int EndPaint(HWND hWnd,const PAINTSTRUCT* lpPaint); +int EndTask(HWND hWnd,BOOL fShutDown,BOOL fForce); +int EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam); +int EnumClipboardFormats(UINT format); +int EnumDesktopWindows(HDESK hDesktop,WNDENUMPROC lpfn,LPARAM lParam); +int EnumDesktops(HWINSTA hwinsta,DESKTOPENUMPROC lpEnumFunc,LPARAM lParam); +int EnumDisplayDevices(LPCTSTR lpReserved,DWORD iDeviceNum,PDISPLAY_DEVICE pDisplayDevice,DWORD dwFlags); +int EnumDisplayMonitors(DWORD hDesktop,DWORD lpfn,DWORD lParam); +int EnumDisplayMonitors(HDC hdc,LPCRECT lprcClip,MONITORENUMPROC lpfnEnum,LPARAM dwData); +int EnumDisplaySettings(LPCTSTR lpszDeviceName,int iModeNum,DEVMODE* lpDevMode); +int EnumDisplaySettingsA(LPCTSTR lpszDeviceName,int iModeNum,DEVMODE* lpDevMode); +int EnumDisplaySettingsEx(LPCTSTR lpszDeviceName,DWORD iModeNum,DEVMODE* lpDevMode,DWORD dwFlags); +int EnumProps(HWND hWnd,PROPENUMPROC lpEnumFunc); +int EnumPropsEx(HWND hWnd,PROPENUMPROCEX lpEnumFunc,LPARAM lParam); +int EnumThreadWindows(DWORD dwThreadId,WNDENUMPROC lpfn,LPARAM lParam); +int EnumWindowStations(WINSTAENUMPROC lpEnumFunc,LPARAM lParam); +int EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam); +int EqualRect(const RECT* lprc1,const RECT* lprc2); +int ExcludeUpdateRgn(HDC hDC,HWND hWnd); +int ExitWindowsEx(UINT uFlags,DWORD dwReserved); +int FillRect(HDC hDC,const RECT* lprc,HBRUSH hbr); +int FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName); +int FindWindowA(LPCTSTR lpClassName,LPCTSTR lpWindowName); +int FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow); +int FindWindowExA(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR pszWindow); +int FindWindowExW(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR pszWindow); +int FindWindowW(LPCTSTR lpClassName,LPCTSTR lpWindowName); +int FlashWindow(HWND hWnd,BOOL bInvert); +int FlashWindowEx(PFLASHWINFO pfwi); +int FrameRect(HDC hDC,const RECT* lprc,HBRUSH hbr); +int FreeDDElParam(UINT msg,LPARAM lParam); +int GetActiveWindow(); +int GetAltTabInfo(HWND hwnd,int iItem,PALTTABINFO pati,LPTSTR pszItemText,UINT cchItemText); +int GetAncestor(HWND hwnd,DWORD gaFlags); +int GetAsyncKeyState(int vKey); +int GetCapture(); +int GetCaretBlinkTime(); +int GetCaretPos(LPPOINT lpPoint); +int GetClassInfo(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); +int GetClassInfoA(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); +int GetClassInfoEx(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); +int GetClassInfoExA(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); +int GetClassInfoExW(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); +int GetClassInfoW(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); +int GetClassLong(HWND hWnd,int nIndex); +int GetClassLongA(HWND hWnd,int nIndex); +int GetClassLongW(HWND hWnd,int nIndex); +int GetClassName(HWND hWnd,LPTSTR lpClassName,int nMaxCount); +int GetClassNameA(HWND hWnd,LPTSTR lpBuffer,int nBufferSize); +int GetClassNameW(HWND hWnd,LPTSTR lpBuffer,int nBufferSize); +int GetClassWord(HWND hWnd,int nIndex); +int GetClientRect(HWND hWnd,LPRECT lpRect); +int GetClipCursor(LPRECT lpRect); +int GetClipboardData(UINT uFormat); +int GetClipboardFormatName(UINT format,LPTSTR lpszFormatName,int cchMaxCount); +int GetClipboardFormatNameA(UINT format,LPTSTR lpBuffer,int cchMaxCount); +int GetClipboardOwner(); +int GetClipboardSequenceNumber(); +int GetClipboardViewer(); +int GetComboBoxInfo(HWND hWndCombo,PCOMBOBOXINFO pcbi); +int GetCursor(); +int GetCursorInfo(PCURSORINFO pci); +int GetCursorPos(LPPOINT lpPoint); +int GetDC(HWND hwnd); +int GetDCEx(HWND hWnd,HRGN hrgnClip,UINT flags); +HWND GetDesktopWindow(); +int GetDialogBaseUnits(); +int GetDlgCtrlID(HWND hwndCtl); +int GetDlgItem(HWND hDlg,int nIDDlgItem); +int GetDlgItemInt(HWND hDlg,int nIDDlgItem,BOOL* lpTranslated,BOOL bSigned); +int GetDlgItemText(HWND hDlg,int nIDDlgItem,LPTSTR lpString,int nMaxCount); +int GetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPTSTR lpBuffer,int nBufferSize); +int GetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPTSTR lpBuffer,int nBufferSize); +int GetDoubleClickTime(); +int GetFocus(); +int GetForegroundWindow(); +int GetGUIThreadInfo(DWORD idThread,LPGUITHREADINFO lpgui); +int GetGestureConfig(HWND hwnd,DWORD dwReserved,DWORD dwFlags,PUINT pcIDs,PGESTURECONFIG pGestureConfig,UINT cbSize); +int GetGestureExtraArgs(HGESTUREINFO hGestureInfo,UINT cbExtraArgs,PBYTE pExtraArgs); +int GetGestureInfo(HGESTUREINFO hGestureInfo,PGESTUREINFO pGestureInfo); +int GetGuiResources(HANDLE hProcess,DWORD uiFlags); +int GetIconInfo(HICON hIcon,PICONINFO piconinfo); +int GetIconInfoEx(HICON hIcon,PICONINFOEX piconinfoex); +int GetInputState(); +int GetKBCodePage(); +int GetKeyNameText(LONG lParam,LPTSTR lpString,int nSize); +int GetKeyNameTextA(LONG lParam,LPTSTR lpString,int nSize); +int GetKeyNameTextW(LONG lParam,LPTSTR lpString,int nSize); +int GetKeyState(int nVirtKey); +int GetKeyboardLayout(DWORD dwLayout); +int GetKeyboardLayoutList(int nBuff,HKL* lpList); +int GetKeyboardLayoutName(LPTSTR pwszKLID); +int GetKeyboardLayoutNameA(LPTSTR pwszKLID); +int GetKeyboardLayoutNameW(LPTSTR pwszKLID); +int GetKeyboardState(PBYTE lpKeyState); +int GetKeyboardType(int nTypeFlag); +int GetLastActivePopup(HWND hWnd); +int GetLastInputInfo(PLASTINPUTINFO plii); +int GetLayeredWindowAttributes(HWND hwnd,COLORREF* pcrKey,BYTE* pbAlpha,DWORD pdwFlags); +int GetListBoxInfo(HWND hwnd); +int GetMenu(HWND hWnd); +int GetMenuBarInfo(HWND hwnd,UINT idObject,LONG idItem,PMENUBARINFO pmbi); +int GetMenuCheckMarkDimensions(); +int GetMenuContextHelpId(HMENU hmenu); +int GetMenuDefaultItem(HMENU hMenu,UINT fByPos,UINT gmdiFlags); +int GetMenuInfo(HMENU hMenu,LPCMENUINFO lpcMenuInfo); +int GetMenuItemCount(HMENU hMenu); +int GetMenuItemID(HMENU hMenu,int nPos); +int GetMenuItemInfo(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int GetMenuItemInfoA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int GetMenuItemInfoW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int GetMenuItemRect(HWND hWnd,HMENU hMenu,UINT uItem,LPRECT lprcItem); +int GetMenuState(HMENU hMenu,UINT uId,UINT uFlags); +int GetMenuString(HMENU hMenu,UINT uIDItem,LPTSTR lpString,int nMaxCount,UINT uFlag); +int GetMenuStringA(HMENU hMenu,UINT uIDItem,LPTSTR lpBuffer,int nBufferSize,UINT uFlag); +int GetMenuStringW(HMENU hMenu,UINT uIDItem,LPTSTR lpBuffer,int nBufferSize,UINT uFlag); +bool GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); +BOOL GetMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); +int GetMessageExtraInfo(); +int GetMessagePos(); +int GetMessageTime(); +BOOL GetMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); +int GetMonitorInfo(HMONITOR hMonitor,LPMONITORINFO lpmi); +int GetMonitorInfoW(HMONITOR hMonitor,LPMONITORINFO lpMonitorIfno); +int GetMouseMovePointsEx(UINT cbSize,LPMOUSEMOVEPOINT lppt,LPMOUSEMOVEPOINT lpptBuf,int nBufPoints,DWORD resolution); +int GetNextDlgGroupItem(HWND hDlg,HWND hCtl,BOOL bPrevious); +int GetNextDlgTabItem(HWND hDlg,HWND hCtl,BOOL bPrevious); +int GetOpenClipboardWindow(); +int GetParent(HWND hWnd); +int GetPhysicalCursorPos(LPPOINT lpPoint); +int GetPriorityClipboardFormat(UINT* paFormatPriorityList,int cFormats); +int GetProcessDefaultLayout(DWORD* pdwDefaultLayout); +int GetProcessWindowStation(); +int GetProp(HWND hWnd,LPCTSTR lpString); +int GetPropA(HWND hWnd,LPCTSTR lpString); +int GetPropW(HWND hWnd,LPCTSTR lpString); +int GetQueueStatus(DWORD flags); +int GetRawInputBuffer(PRAWINPUT pData,PUINT pcbSize,UINT cbSizeHeader); +int GetRawInputData(HRAWINPUT hRawInput,UINT uiCommand,LPVOID pData,PUINT pcbSize,UINT cbSizeHeader); +int GetRawInputDeviceInfo(HANDLE hDevice,UINT uiCommand,LPVOID pData,PUINT pcbSize); +int GetRawInputDeviceList(PRAWINPUTDEVICELIST pRawInputDeviceList,PUINT puiNumDevices,UINT cbSize); +int GetRegisteredRawInputDevices(PRAWINPUTDEVICE pRawInputDevices,PUINT puiNumDevices,UINT cbSize); +int GetScrollBarInfo(HWND hWnd,UINT fnBar,PSCROLLBARINFO lpsi); +int GetScrollInfo(HWND hWnd,int fnBar,LPSCROLLINFO lpScorllInfo); +int GetScrollPos(HWND hWnd,int nBar); +int GetScrollRange(HWND hWnd,int nBar,LPINT lpMinPos,LPINT lpMaxPos); +int GetShellWindow(); +int GetSubMenu(HMENU hMenu,int nPos); +int GetSysColor(int nIndex); +int GetSysColorBrush(int nIndex); +int GetSystemMenu(HWND hWnd,BOOL bRevert); +int GetSystemMetrics(int nIndex); +int GetTabbedTextExtent(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); +int GetTabbedTextExtentA(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); +int GetTabbedTextExtentW(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); +int GetThreadDesktop(DWORD dwThreadId); +int GetTitleBarInfo(HWND hwnd,PTITLEBARINFO pti); +int GetTopWindow(HWND hWnd); +int GetTouchInputInfo(HTOUCHINPUT hTouchInput,UINT cInputs,PTOUCHINPUT pInputs,int cbSize); +int GetUpdateRect(HWND hWnd,LPRECT lpRect,BOOL bErase); +int GetUpdateRgn(HWND hWnd,HRGN hRgn,BOOL bErase); +int GetUpdatedClipboardFormats(PUINT lpuiFormats,UINT cFormats,PUINT pcFormatsOut); +int GetUserObjectInformation(HANDLE hObj,UINT nIndex,PVOID pvInfo,DWORD nLength,LPDWORD lpnLengthNeeded); +int GetUserObjectInformationA(HANDLE hActiveDesktop,UINT nIndex,PVOID pvInfo,DWORD nBuffLen,LPDWORD dwSize); +int GetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSD,DWORD nLength,LPDWORD lpnLengthNeeded); +int GetWindow(HWND hWnd,UINT uCmd); +int GetWindowContextHelpId(HWND hWnd); +int GetWindowDC(HWND hWnd); +int GetWindowDisplayAffinity(HWND hWnd,DWORD* dwAffinity); +int GetWindowInfo(HWND hwnd,PWINDOWINFO pwi); +int GetWindowLong(HWND hWnd,int nIndex); +int GetWindowLongA(HWND hWnd,int nIndex); +int GetWindowLongW(HWND hWnd,int nIndex); +int GetWindowModuleFileName(HWND hwnd,LPTSTR lpszFileName,UINT cchFileNameMax); +int GetWindowPlacement(HWND hWnd,WINDOWPLACEMENT* lpwndpl); +int GetWindowRect(HWND hWnd,LPRECT lpRect); +int GetWindowRgn(HWND hWnd,HRGN hRgn); +int GetWindowRgnBox(HWND hWnd,LPRECT lprc); +int GetWindowText(HWND hWnd,LPTSTR lpString,int nMaxCount); +int GetWindowTextA(HWND hWnd,LPTSTR lpString,int nMaxCount); +int GetWindowTextLength(HWND hWnd); +int GetWindowTextLengthA(HWND hWnd); +int GetWindowTextLengthW(HWND hWnd); +int GetWindowTextW(HWND hWnd,LPTSTR lpString,int nMaxCount); +int GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId); +int GrayString(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); +int GrayStringA(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); +int GrayStringW(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); +int HideCaret(HWND hWnd); +int HiliteMenuItem(HWND hwnd,HMENU hmenu,UINT uItemHilite,UINT uHilite); +int ImpersonateDdeClientWindow(HWND hWndClient,HWND hWndServer); +int InSendMessage(); +int InSendMessageEx(LPVOID lpReserved); +int InflateRect(LPRECT lpRect,int x,int y); +int InsertMenu(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); +int InsertMenuA(HMENU hMenu,UINT nPosition,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); +int InsertMenuItem(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); +int InsertMenuItemA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); +int InsertMenuItemW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); +int InsertMenuW(HMENU hMenu,UINT nPosition,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); +int InternalGetWindowText(HWND hWnd,LPWSTR lpString,int nMaxCount); +int IntersectRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); +int InvalidateRect(HWND hWnd,const RECT* lpRect,BOOL bErase); +int InvalidateRgn(HWND hWnd,HRGN hRgn,BOOL bErase); +int InvertRect(HDC hDC,const RECT* lprc); +int IsCharAlpha(TCHAR ch); +int IsCharAlphaNumeric(TCHAR ch); +int IsCharAlphaNumericA(TCHAR char); +int IsCharAlphaNumericW(TCHAR char); +int IsCharLower(TCHAR ch); +int IsCharLowerA(TCHAR char); +int IsCharUpper(TCHAR ch); +int IsChild(HWND hWndParent,HWND hWnd); +int IsClipboardFormatAvailable(UINT format); +BOOL IsDialogMessage(HWND hDlg,LPMSG lpMsg); +BOOL IsDialogMessageA(HWND hDlg,LPMSG lpMsg); +BOOL IsDialogMessageW(HWND hDlg,LPMSG lpMsg); +int IsDlgButtonChecked(HWND hDlg,int nIDButton); +int IsGUIThread(BOOL bConvert); +int IsHungAppWindow(HWND hWnd); +int IsIconic(HWND hWnd); +int IsMenu(HMENU hMenu); +int IsProcessDPIAware(); +int IsRectEmpty(const RECT* lprc); +int IsTouchWindow(HWND hWnd,PULONG pulFlags); +int IsWinEventHookInstalled(DWORD event); +int IsWindow(HWND hWnd); +int IsWindowEnabled(HWND hWnd); +int IsWindowUnicode(HWND hWnd); +int IsWindowVisible(HWND hWnd); +int IsWow64Message(); +int IsZoomed(HWND hWnd); +int KillTimer(HWND hWnd,UINT_PTR nIDEvent); +HACCEL LoadAccelerators(HINSTANCE hInstance,LPCSTR lpTableName); +HACCEL LoadAcceleratorsA(HINSTANCE hInstance,LPCSTR lpTableName); +HACCEL LoadAcceleratorsW(HINSTANCE hInstance,LPCWSTR lpTableName); +int LoadBitmap(HINSTANCE hInstance,LPCTSTR lpBitmapName); +int LoadBitmapA(HINSTANCE hInstance,LPCTSTR lpBitmapName); +int LoadBitmapW(HINSTANCE hInstance,LPCTSTR lpBitmapName); +HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName); +HCURSOR LoadCursorA(HINSTANCE hInstance,LPCTSTR lpCursorName); +int LoadCursorFromFile(LPCTSTR lpFileName); +int LoadCursorFromFileA(LPCTSTR lpFileName); +int LoadCursorFromFileW(LPCTSTR lpFileName); +HCURSOR LoadCursorW(HINSTANCE hInstance,LPCTSTR lpCursorName); +HICON LoadIcon(HINSTANCE hInstance,LPCSTR lpIconName); +HICON LoadIconA(HINSTANCE hInstance,LPCSTR lpIconName); +HICON LoadIconW(HINSTANCE hInstance,LPCSTR lpIconName); +int LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad); +int LoadImageA(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int Width,int Height,UINT Options); +int LoadImageW(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int Width,int Height,UINT Options); +int LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags); +int LoadKeyboardLayoutA(LPCTSTR lpwszKLID,UINT Flags); +int LoadKeyboardLayoutW(LPCTSTR lpwszKLID,UINT Flags); +int LoadMenu(HINSTANCE hInstance,LPCTSTR lpMenuName); +int LoadMenuA(HINSTANCE hInstance,LPCTSTR lpMenuName); +int LoadMenuIndirect(CONST MENUTEMPLATE* lpMenuTemplate); +int LoadMenuIndirectA(CONST MENUTEMPLATE* lpMenuTemplate); +int LoadMenuIndirectW(CONST MENUTEMPLATE* lpMenuTemplate); +int LoadMenuW(HINSTANCE hInstance,LPCTSTR lpMenuName); +int LoadString(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); +int LoadStringA(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); +int LoadStringW(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); +int LockSetForegroundWindow(UINT uLockCode); +int LockWindowUpdate(HWND hWndLock); +int LockWorkStation(); +int LogicalToPhysicalPoint(HWND hWnd,LPPOINT lpPoint); +int LookupIconIdFromDirectory(PBYTE presbits,BOOL fIcon); +int LookupIconIdFromDirectoryEx(PBYTE presbits,BOOL fIcon,int cxDesired,int cyDesired,UINT Flags); +int MapDialogRect(HWND hDlg,LPRECT IpRect); +int MapVirtualKey(UINT uCode,UINT uMapType); +int MapVirtualKeyA(UINT uCode,UINT uMapType); +int MapVirtualKeyEx(UINT uCode,UINT uMapType,HKL dwhkl); +int MapVirtualKeyExA(UINT uCode,UINT uMapType,HKL dwhkl); +int MapVirtualKeyExW(UINT uCode,UINT uMapType,HKL dwhkl); +int MapVirtualKeyW(UINT uCode,UINT uMapType); +int MapWindowPoints(HWND hWndFrom,HWND hWndTo,LPPOINT lpPoints,UINT cPoints); +int MenuItemFromPoint(HWND hWnd,HMENU hMenu,POINT ptScreen); +int MessageBeep(UINT uType); +int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); +int MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); +int MessageBoxEx(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); +int MessageBoxExA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); +int MessageBoxExW(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); +int MessageBoxIndirect(const LPMSGBOXPARAMS lpMsgBoxParams); +int MessageBoxIndirectA(const LPMSGBOXPARAMS lpMsgBoxParams); +int MessageBoxIndirectW(const LPMSGBOXPARAMS lpMsgBoxParamsW); +int MessageBoxTimeout(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId,DWORD dwMilliseconds); +int MessageBoxW(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); +int ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); +int ModifyMenuA(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); +int ModifyMenuW(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); +int MonitorFromPoint(POINT pt,DWORD dwFlags); +int MonitorFromRect(LPCRECT lprc,DWORD dwFlags); +int MonitorFromWindow(DWORD hWnd,DWORD dwFlags); +int MonitorFromWindow(HWND hwnd,DWORD dwFlags); +int MoveWindow(HWND hWnd,int X,int Y,int nWidth,int nHeight,BOOL bRepaint); +int MsgWaitForMultipleObjects(DWORD nCount,const HANDLE* pHandles,BOOL fWaitAll,DWORD dwMilliseconds,DWORD dwWakeMask); +int MsgWaitForMultipleObjectsEx(DWORD nCount,const HANDLE* pHandles,DWORD dwMilliseconds,DWORD dwWakeMask,DWORD dwFlags); +int NotifyWinEvent(DWORD event,HWND hwnd,LONG idObject,LONG idChild); +int OemKeyScan(WORD wOemChar); +int OemToChar(LPCSTR lpszSrc,LPTSTR lpszDst); +int OemToCharA(LPCSTR lpszSrc,LPTSTR lpszDst); +int OemToCharBuff(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); +int OemToCharBuffA(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); +int OemToCharBuffW(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); +int OemToCharW(LPCSTR lpszSrc,LPTSTR lpszDst); +int OffsetRect(LPRECT lprc,int dx,int dy); +int OpenClipboard(HWND hWndNewOwner); +int OpenDesktop(LPTSTR lpszDesktop,DWORD dwFlags,BOOL fInherit,DWORD dwDesiredAccess); +int OpenIcon(HWND hWnd); +int OpenInputDesktop(DWORD dwFlags,BOOL fInherit,DWORD dwDesiredAccess); +int OpenWindowStation(LPTSTR lpszWinSta,BOOL fInherit,DWORD dwDesiredAccess); +int PackDDElParam(UINT msg,UINT_PTR uiLo,UINT_PTR uiHi); +int PaintDesktop(HDC hDC); +int PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); +int PeekMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); +int PeekMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); +int PhysicalToLogicalPoint(HWND hWnd,LPPOINT lpPoint); +int PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int PostMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); +int PostMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); +int PostQuitMessage(int nExitCode); +int PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); +int PostThreadMessageA(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); +int PostThreadMessageW(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); +int PrintWindow(HWND hwnd,HDC hdcBlt,UINT nFlags); +int PrivateExtractIcons(LPCTSTR lpszFile,int nIconIndex,int cxIcon,int cyIcon,HICON* phicon,UINT* piconid,UINT nIcons,UINT flags); +int PtInRect(const RECT* lprc,POINT pt); +int RealChildWindowFromPoint(HWND hwndParent,POINT ptParentClientCoords); +int RealGetWindowClass(HWND hwnd,LPTSTR pszType,UINT cchType); +int RedrawWindow(HWND hWnd,const RECT* lprcUpdate,HRGN hrgnUpdate,UINT flags); +ATOM RegisterClass(CONST WNDCLASS* lpWndClass); +ATOM RegisterClassA(CONST WNDCLASS* lpWndClass); +ATOM RegisterClassW(const WNDCLASS* lpWndClass); +ATOM RegisterClassEx(CONST WNDCLASSEX* lpwcx); +ATOM RegisterClassExA(CONST WNDCLASSEX* lpWndClassEx); +ATOM RegisterClassExW(CONST WNDCLASSEX* lpWndClassEx); +int RegisterClassW(CONST WNDCLASS* lpWndClass); +int RegisterClipboardFormat(LPCTSTR lpszFormat); +int RegisterClipboardFormatA(LPCTSTR lpszFormat); +int RegisterClipboardFormatW(LPCTSTR lpszFormat); +int RegisterDeviceNotification(HANDLE hRecipient,LPVOID NotificationFilter,UINT Flags); +int RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk); +int RegisterPowerSettingNotification(HANDLE hRecipient,LPCGUID PowerSettingGuid,UINT Flags); +int RegisterRawInputDevices(PCRAWINPUTDEVICE pRawInputDevices,UINT uiNumDevices,UINT cbSize); +int RegisterShellHookWindow(HWND hWnd); +int RegisterTouchWindow(HWND hWnd,ULONG ulFlags); +int RegisterWindowMessage(LPCTSTR lpString); +int RegisterWindowMessageA(LPCTSTR lpString); +int RegisterWindowMessageW(LPCTSTR lpString); +int ReleaseCapture(); +int ReleaseDC(HWND hWnd,HDC hDC); +int RemoveClipboardFormatListener(HWND hwnd); +int RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlags); +int RemoveProp(HWND hWnd,LPCTSTR lpString); +int RemovePropA(HWND hWnd,LPCTSTR lpString); +int RemovePropW(HWND hWnd,LPCTSTR lpString); +int ReplyMessage(LRESULT lResult); +int ReuseDDElParam(LPARAM lParam,UINT msgIn,UINT msgOut,UINT_PTR uiLo,UINT_PTR uiHi); +int ScreenToClient(HWND hWnd,LPPOINT lpPoint); +int ScrollDC(HDC hDC,int dx,int dy,const RECT* lprcScroll,const RECT* lprcClip,HRGN hrgnUpdate,LPRECT lprcUpdate); +int ScrollWindow(HWND hWnd,int XAmount,int YAmount,const RECT* lpRect,const RECT* lpClipRect); +int ScrollWindowEx(HWND hWnd,int dx,int dy,const RECT* prcScroll,const RECT* prcClip,HRGN hrgnUpdate,LPRECT prcUpdate,UINT flags); +int SendDlgItemMessage(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam); +int SendDlgItemMessageA(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam); +int SendInput(UINT nInputs,LPINPUT pInputs,int cbSize); +int SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int SendMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); +int SendMessageCallback(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpCallBack,ULONG_PTR dwData); +int SendMessageCallbackA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData); +int SendMessageCallbackW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData); +int SendMessageTimeout(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); +int SendMessageTimeoutA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); +int SendMessageTimeoutW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); +int SendMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); +int SendNotifyMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int SendNotifyMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int SendNotifyMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); +int SetActiveWindow(HWND hWnd); +int SetCapture(HWND hWnd); +int SetCaretBlinkTime(UINT uMSeconds); +int SetCaretPos(int X,int Y); +int SetClassLong(HWND hWnd,int nIndex,LONG dwNewLong); +int SetClassLongA(HWND hWnd,int nIndex,LONG dwNewLong); +int SetClassLongW(HWND hWnd,int nIndex,LONG dwNewLong); +int SetClassWord(HWND hWnd,int nIndex,WORD wNewWord); +int SetClipboardData(UINT uFormat,HANDLE hMem); +int SetClipboardViewer(HWND hWndNewViewer); +int SetCursor(HCURSOR hCursor); +int SetCursorPos(int X,int Y); +int SetDlgItemInt(HWND hDlg,int nIDDlgItem,UINT uValue,BOOL bSigned); +int SetDlgItemText(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); +int SetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); +int SetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); +int SetDoubleClickTime(UINT uInterval); +int SetFocus(HWND hWnd); +int SetForegroundWindow(HWND hWnd); +int SetGestureConfig(HWND hwnd,DWORD dwReserved,UINT cIDs,PGESTURECONFIG pGestureConfig,UINT cbSize); +int SetKeyboardState(LPBYTE lpKeyState); +int SetLastErrorEx(DWORD dwErrCode,DWORD dwType); +int SetLayeredWindowAttributes(HWND hWnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags); +int SetMenu(HWND hWnd,HMENU hMenu); +int SetMenuContextHelpId(HMENU hmenu,DWORD dwContextHelpId); +int SetMenuDefaultItem(HMENU hMenu,UINT uItem,UINT fByPos); +int SetMenuInfo(HMENU hmenu,LPCMENUINFO lpcmi); +int SetMenuItemBitmaps(HMENU hMenu,UINT uPosition,UINT uFlags,HBITMAP hBitmapUnchecked,HBITMAP hBitmapChecked); +int SetMenuItemInfo(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int SetMenuItemInfoA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int SetMenuItemInfoW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); +int SetMessageExtraInfo(LPARAM lParam); +int SetParent(HWND hWndChild,HWND hWndNewParent); +int SetPhysicalCursorPos(int X,int Y); +int SetProcessDPIAware(); +int SetProcessDefaultLayout(DWORD dwDefaultLayout); +int SetProcessWindowStation(HWINSTA hWinSta); +int SetProp(HWND hWnd,LPCTSTR lpString,HANDLE hData); +int SetPropA(HWND hWnd,LPCTSTR lpString,HANDLE hData); +int SetPropW(HWND hWnd,LPCTSTR lpString,HANDLE hData); +int SetRect(LPRECT lprc,int xLeft,int yTop,int xRight,int yBottom); +int SetRectEmpty(LPRECT lprc); +int SetScrollInfo(HWND hWnd,int fnBar,LPCSCROLLINFO lpsi,BOOL fRedraw); +int SetScrollPos(HWND hWnd,int nBar,int nPos,BOOL bRedraw); +int SetScrollRange(HWND hWnd,int nBar,int nMinPos,int nMaxPos,BOOL bRedraw); +int SetSysColors(int cElements,const INT* lpaElements,const COLORREF* lpaRgbValues); +int SetSystemCursor(HCURSOR hcur,DWORD id); +int SetThreadDesktop(HDESK hDesktop); +int SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc); +int SetUserObjectInformation(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength); +int SetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSID); +int SetWinEventHook(UINT eventMin,UINT eventMax,HMODULE hmodWinEventProc,WINEVENTPROC lpfnWinEventProc,DWORD idProcess,DWORD idThread,DWORD dwflags); +int SetWindowContextHelpId(HWND hWnd,DWORD dwContextHelpId); +int SetWindowDisplayAffinity(HWND hWnd,DWORD dwAffinity); +int SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong); +int SetWindowLongA(HWND hWnd,int nIndex,LONG dwNewLong); +int SetWindowLongW(HWND hWnd,int nIndex,LONG dwNewLong); +int SetWindowPlacement(HWND hWnd,WINDOWPLACEMENT* lpwndpl); +int SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx,int cy,UINT uFlags); +int SetWindowRgn(HWND hWnd,HRGN hRgn,BOOL bRedraw); +int SetWindowText(HWND hWnd,LPCTSTR lpString); +int SetWindowTextA(HWND hwnd,LPCTSTR lpString); +int SetWindowTextW(HWND hwnd,LPCTSTR lpString); +int SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); +int SetWindowsHookExA(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); +int SetWindowsHookExW(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); +int ShowCaret(HWND hWnd); +int ShowCursor(BOOL bShow); +int ShowOwnedPopups(HWND hWnd,BOOL fShow); +int ShowScrollBar(HWND hWnd,int wBar,BOOL bShow); +int ShowWindow(HWND hWnd,int nCmdShow); +int ShowWindowAsync(HWND hWnd,int nCmdShow); +int ShutdownBlockReasonCreate(HWND hWnd,LPCWSTR pwszReason); +int ShutdownBlockReasonDestroy(HWND hWnd); +int ShutdownBlockReasonQuery(HWND hWnd,LPWSTR pwszBuff,DWORD* pcchBuff); +int SoundSentry(); +int SubtractRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); +int SwapMouseButton(BOOL fSwap); +int SwitchDesktop(HDESK hDesktop); +int SwitchToThisWindow(HWND hWnd,BOOL fAltTab); +int SystemParametersInfo(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); +int SystemParametersInfoA(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); +int SystemParametersInfoW(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); +int TabbedTextOut(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); +int TabbedTextOutA(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); +int TabbedTextOutW(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); +int TileWindows(HWND hwndParent,UINT wHow,RECT* lpRect,UINT cKids,const HWND* lpKids); +int ToAscii(UINT uVirtKey,UINT uScanCode,PBYTE lpKeyState,LPWORD lpChar,UINT uFlags); +int ToAsciiEx(UINT uVirtKey,UINT uScanCode,PBYTE lpKeyState,LPWORD lpChar,UINT uFlags,HKL dwhkl); +int ToUnicode(UINT wVirtKey,UINT wScanCode,const PBYTE lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags); +int ToUnicodeEx(UINT wVirtKey,UINT wScanCode,const PBYTE lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags,HKL dwhkl); +int TrackMouseEvent(LPTRACKMOUSEEVENT pTrackMouseEvent); +int TrackPopupMenu(HMENU hMenu,UINT uFlags,int X,int Y,int nReserved,HWND hWnd,CONST RECT* prcRect); +int TrackPopupMenuEx(HMENU hmenu,UINT fuFlags,int x,int Y,HWND hWnd,LPTPMPARAMS lptpm); +int TranslateAcceleratorA(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); +int TranslateAcceleratorW(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); +int TranslateAccelerator(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); +int TranslateMDISysAccel(HWND hWndClient,LPMSG lpMsg); +int TranslateMessage(const MSG* lpMsg); +int UnhookWinEvent(HWINEVENTHOOK hWinEventHook); +int UnhookWindowsHookEx(HHOOK hhk); +int UnionRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); +int UnloadKeyboardLayout(HKL hkl); +int UnpackDDElParam(UINT msg,LPARAM lParam,PUINT_PTR puiLo,PUINT_PTR puiHi); +int UnregisterClass(LPCTSTR lpClassName,HINSTANCE hInstance); +int UnregisterClassA(DWORD lpClassName,DWORD hInstance); +int UnregisterClassA(LPCTSTR lpClassName,HINSTANCE hInstance); +int UnregisterClassW(LPCTSTR lpClassName,HINSTANCE hInstance); +int UnregisterDeviceNotification(HDEVNOTIFY Handle); +int UnregisterHotKey(HWND hWnd,int id); +int UnregisterPowerSettingNotification(HPOWERNOTIFY Handle); +int UnregisterTouchWindow(HWND hWnd); +int UpdateLayeredWindow(HWND hwnd,HDC hdcDst,POINT* pptDst,SIZE* psize,HDC hdcSrc,POINT* pptSrc,COLORREF crKey,BLENDFUNCTION* pblend,DWORD dwFlags); +int UpdateLayeredWindowIndirect(HWND hwnd,const UPDATELAYEREDWINDOWINFO* pULWInfo); +int UpdateWindow(HWND hWnd); +int UserHandleGrantAccess(HANDLE hUserHandle,HANDLE hJob,BOOL bGrant); +int ValidateRect(HWND hWnd,const RECT* lpRect); +int ValidateRgn(HWND hWnd,HRGN hRgn); +int VkKeyScan(TCHAR ch); +int VkKeyScanA(TCHAR ch); +int VkKeyScanEx(TCHAR ch,HKL dwhkl); +int VkKeyScanW(TCHAR ch); +int WaitForInputIdle(HANDLE hProcess,DWORD dwMilliseconds); +int WaitMessage(); +int WinHelp(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR dwData); +int WinHelpA(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR wData); +int WinHelpW(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR wData); +int WindowFromDC(HDC hDC); +int WindowFromPhysicalPoint(POINT Point); +int WindowFromPoint(POINT Point); +int keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,ULONG_PTR dwExtraInfo); +int mouse_event(DWORD dwFlags,DWORD dx,DWORD dy,DWORD dwData,ULONG_PTR dwExtraInfo); +int toascii(DWORD char); \ No newline at end of file diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index ce80abbe..03a2446f 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -66,7 +66,8 @@ SOURCES += \ Src/BasicView/CommandHelpView.cpp \ Src/BasicView/HistoryLineEdit.cpp \ Src/Gui/CPUJumps.cpp \ - Src/Gui/Configuration.cpp + Src/Gui/Configuration.cpp \ + Src/Utils/ApiFingerprints.cpp HEADERS += \ @@ -113,7 +114,8 @@ HEADERS += \ Src/BasicView/CommandHelpView.h \ Src/BasicView/HistoryLineEdit.h \ Src/Gui/CPUJumps.h \ - Src/Gui/Configuration.h + Src/Gui/Configuration.h \ + Src/Utils/ApiFingerprints.h INCLUDEPATH += \ diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp index 78a542b6..d7240cbd 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp @@ -116,6 +116,13 @@ void CPUJumps::paintEvent(QPaintEvent *event) cond, DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); + }else if(destRVA < first_va){ + drawJump(line, + -6, + jumpoffset, + cond, + DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); } } diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 99d83b2a..271208f5 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -23,13 +23,12 @@ void Configuration::load(QString filename){ if (!configfile.open(QIODevice::ReadOnly)) { qWarning("Couldn't open config file."); return ; - }else{ - qDebug() << "load succ"; } QByteArray saveData = configfile.readAll(); Config = QJsonDocument(QJsonDocument::fromJson(saveData)).object(); readColors(); + } void Configuration::readColors() { @@ -39,11 +38,22 @@ void Configuration::readColors() { for (int idx = 0; idx < ColorArray.size(); ++idx) { QJsonArray colorObj = ColorArray[idx].toArray(); Colors.insert(colorObj.at(0).toString(),QColor( colorObj.at(1).toString())); - qDebug() << "read color "< Configuration::ApiFingerprints(){ + QList files; + QJsonArray APIArray = Config["apifingerprints"].toArray(); + for (int idx = 0; idx < APIArray.size(); ++idx) { + QString filename = "data/"+APIArray.at(idx).toString()+".txt"; + QFile mFile(filename); + if(mFile.open(QFile::ReadOnly | QFile::Text)){ + files.append(APIArray.at(idx).toString()); + mFile.close(); + } - + } + return files; } const QColor Configuration::color(QString id) const diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.h b/x64_dbg_gui/Project/Src/Gui/Configuration.h index c1ea4b1d..26782673 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.h +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.h @@ -25,6 +25,7 @@ public: void readColors(); const QColor color(QString id) const; void load(QString filename); + QList ApiFingerprints(); }; #endif // CONFIGURATION_H diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 551346ba..943da761 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -24,6 +24,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // load config file mConfiguration = new Configuration; + mAPIFingerprints = new ApiFingerprints; + //Load recent files loadMRUList(16); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 3efec87b..83cb4ad9 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -19,6 +19,7 @@ #include "SettingsDialog.h" #include "tabwidget.h" #include "Configuration.h" +#include "ApiFingerprints.h" namespace Ui { class MainWindow; @@ -89,6 +90,7 @@ private: StatusLabel* mLastLogLabel; Configuration* mConfiguration; + ApiFingerprints* mAPIFingerprints; const char* mWindowMainTitle; diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp new file mode 100644 index 00000000..94427096 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp @@ -0,0 +1,110 @@ +#include "ApiFingerprints.h" +#include "Configuration.h" + + + +/** + * @brief retrieves information (name, arguments) for given api function from database + * @param name of dll without ".dll" + * @param name of function + * @remark upper or lower case doesn't matter + * @return + */ +const APIFunction ApiFingerprints::function(QString dllname,QString functionname) const{ + return Library.constFind(dllname.toLower().trimmed()).value().constFind(functionname.toLower().trimmed()).value(); + /* + * example + * -------------------- + * "int MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)" + * + * APIFunction f = function("UsEr32 ","messAgebOxa"); + * f.Name = "MessageBoxA"; + * f.DLLName = "user32"; + * f.ReturnType = "int" + * f.Arguments.at(0).Name = "hWnd"; + * f.Arguments.at(0).Type = "HWND"; + * f.Arguments.at(1).Name = "lpText"; + * f.Arguments.at(1).Type = "LPCTSTR"; + * ... + * + * upper / lower case doesn't matter and additional whitespace will be trimmed + */ + + +} + + +ApiFingerprints::ApiFingerprints() +{ + // the config file should contain a list of possible data files for api calls + QList files = Configuration::instance()->ApiFingerprints(); + + // iterate all given files + foreach(QString file, files){ + QFile mFile("data/"+file+".txt"); + if(mFile.open(QFile::ReadOnly | QFile::Text)){ + // if file exists --> parse file + + QMap Functions; + QTextStream in(&mFile); + while ( !in.atEnd() ) + { + // reads raw line like "int;MessageBoxA;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;" + QString rawFunctionDescr = in.readLine(); + QStringList functionParts = rawFunctionDescr.split(";"); + // format : retType;FunctionName;Arg1;Arg2;Arg3;... + + + if(functionParts.count()<2){ + // each function description needs at least a return type and a name + // if not, we ignore the data + continue; + } + + // function data + APIFunction func; + func.DLLName = file; + func.ReturnType = functionParts.at(0); + func.Name = functionParts.at(1); + + // read parameters + for(int i=2;i use "*" to split type and name of argument + QStringList par = rawArgument.split("*"); + APIArgument arg; + if(par.count() > 1){ + arg.Name = par.at(1).trimmed(); + arg.Type = par.at(0).trimmed()+"*"; + + }else{ + // current argument is no pointer --> use " " to split + par = rawArgument.split(" "); + if(par.count()>1){ + arg.Name = par.at(1).trimmed(); + arg.Type = par.at(0).trimmed(); + }else{ + // we assume that there is only the type + arg.Name = ""; + arg.Type = rawArgument.trimmed(); + } + } + + func.Arguments.append(arg); + + } + + Functions.insert(func.Name.toLower().trimmed(),func); + + } + + Library.insert(file,Functions); + mFile.close(); + } + + } + +} diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h new file mode 100644 index 00000000..c30dcda4 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h @@ -0,0 +1,28 @@ +#ifndef APIFINGERPRINTS_H +#define APIFINGERPRINTS_H + +#include +#include +#include + +struct APIArgument{ + QString Type; + QString Name; +}; + +struct APIFunction{ + QString DLLName; + QString ReturnType; + QString Name; + QList Arguments; +}; + +class ApiFingerprints +{ + QMap> Library; +public: + ApiFingerprints(); + const APIFunction function(QString dllname, QString functionname) const; +}; + +#endif // APIFINGERPRINTS_H diff --git a/x64_dbg_gui/Project/Src/config.json b/x64_dbg_gui/Project/Src/config.json new file mode 100644 index 00000000..7485bfcb --- /dev/null +++ b/x64_dbg_gui/Project/Src/config.json @@ -0,0 +1,18 @@ +{ + "colors": [ + ["DisassemblyCipColor","#000000"], + ["DisassemblyMainBpColor","#FF0000"], + ["DisassemblyOtherBpColor","#FFFBF0"], + ["DisassemblyBookmarkColor","#FEE970"], + ["DisassemblyMainLabelColor","#FF0000"], + ["blackaddress","#000000"], + ["DisassemblySelectedAddressColor","#000000"], + ["DisassemblyBytesColor","#000000"], + ["DisassemblyCommentColor","#000000"], + ["EIPLabel","#ffffff"], + ["EIPLabelBG","#4040ff"] + ], + "apifingerprints":[ + "gdi32","kernel32","shell32","stdio","user32" + ] +} \ No newline at end of file From ca032104cc3cfe8026e0a2c01a57bf4adac18cd3 Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Mon, 9 Jun 2014 16:09:12 +0200 Subject: [PATCH 057/676] bugfix: api fingerprints database had wrong format --- x64_dbg_gui/Project/Data/gdi32.txt | 674 ++++---- x64_dbg_gui/Project/Data/kernel32.txt | 2094 ++++++++++++------------- x64_dbg_gui/Project/Data/shell32.txt | 492 +++--- x64_dbg_gui/Project/Data/stdio.txt | 122 +- x64_dbg_gui/Project/Data/user32.txt | 1438 ++++++++--------- 5 files changed, 2410 insertions(+), 2410 deletions(-) diff --git a/x64_dbg_gui/Project/Data/gdi32.txt b/x64_dbg_gui/Project/Data/gdi32.txt index 0c000486..f72e4fb0 100644 --- a/x64_dbg_gui/Project/Data/gdi32.txt +++ b/x64_dbg_gui/Project/Data/gdi32.txt @@ -1,337 +1,337 @@ -int AbortDoc(HDC hDC); -int AbortPath(HDC hDC); -int AddFontMemResourceEx(PVOID pbFont,DWORD cbFont,PVOID pdv,DWORD* pcFonts); -int AddFontResource(LPCTSTR lpszFilename); -int AddFontResourceA(LPCTSTR lpszFilename); -int AddFontResourceEx(LPCTSTR lpszFilename,DWORD fl,PVOID pdv); -int AddFontResourceW(LPCTSTR lpszFilename); -int AngleArc(HDC hDC,int x,int y,DWORD dwRadius,FLOAT eStartAngle,FLOAT eSweepAngle); -int AnimatePalette(HPALETTE hpal,UINT iStartindex,UINT cEntries,const PALETTEENTRY* ppe); -int Arc(HDC hDC,int nLeftRect,int nTopRect,int nTopRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc); -int ArcTo(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); -int BeginPath(HDC hDC); -int BitBlt(HDC hDCDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); -int CancelDC(HDC hDC); -int ChoosePixelFormat(HDC hdc,const PIXELFORMATDESCRIPTOR* ppfd); -int Chord(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); -int CloseEnhMetaFile(HDC hDC); -int CloseFigure(HDC hDC); -int CloseMetaFile(HDC hDC); -int CombineRgn(HRGN hrgnDest,HRGN hrgnSrc1,HRGN hrgnSrc2,DWORD fnCombineMode); -int CombineTransform(LPXFORM lpxformResult,const XFORM* lpxform1,const XFORM* lpxform2); -int CopyEnhMetaFile(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); -int CopyEnhMetaFileA(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); -int CopyEnhMetaFileW(HENHMETAFILE hemfSrc,LPCTSTR lpszFile); -int CopyMetaFile(HMETAFILE hmfSrc,LPCTSTR lpszFile); -int CopyMetaFileA(HMETAFILE hmfSrc,LPCTSTR lpszFile); -int CopyMetaFileW(HMETAFILE hmfSrc,LPCTSTR lpszFile); -int CreateBitmap(int nWidth,int nHeight,UINT cPlanes,UINT cBitsPerPel,const VOID* lpvBits); -int CreateBitmapIndirect(const BITMAP* lpbm); -int CreateBrushIndirect(const LOGBRUSH* lplb); -int CreateCompatibleBitmap(HDC hDC,int nWidth,int nHeight); -int CreateCompatibleDC(HDC hDC); -int CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); -int CreateDCA(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); -int CreateDCW(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpInitData); -int CreateDIBPatternBrush(HGLOBAL hglbDIBPacked,UINT fuColorSpec); -int CreateDIBPatternBrushPt(const VOID* lpPackedDIB,DWORD iUsage); -int CreateDIBSection(HDC hDC,const BITMAPINFO* pbmi,DWORD iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset); -int CreateDIBitmap(HDC hDC,const BITMAPINFOHEADER* lpbmih,DWORD lpbmih,const VOID* lpbInit,const BITMAPINFO* lpbmi,DWORD fuUsage); -int CreateDiscardableBitmap(HDC hdc,int nWidth,int nHeight); -int CreateEllipticRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int CreateEllipticRgnIndirect(const RECT* lprc); -int CreateEnhMetaFile(HDC hdcRef,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); -int CreateEnhMetaFileA(HDC hDC,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); -int CreateEnhMetaFileW(HDC hDC,LPCTSTR lpFilename,const RECT* lpRect,LPCTSTR lpDescription); -int CreateFont(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); -int CreateFontA(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); -int CreateFontIndirect(const LOGFONT* lplf); -int CreateFontIndirectA(const LOGFONT* lplf); -int CreateFontIndirectEx(const ENUMLOGFONTEXDV* penumlfex); -int CreateFontIndirectW(const LOGFONT* lplf); -int CreateFontW(int nHeight,int nWidth,int nEscapement,int nOrientation,DWORD fnWeight,DWORD fdwItalic,DWORD fdwUnderline,DWORD fdwStrikeOut,DWORD fdwCharSet,DWORD fdwOutputPrecision,DWORD fdwClipPrecision,DWORD fdwQuality,DWORD fdwPitchAndFamily,LPCTSTR lpszFace); -int CreateHalftonePalette(HDC hDC); -int CreateHatchBrush(DWORD fnStyle,COLORREF clrref); -int CreateIC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpdvmInit); -int CreateICA(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,const DEVMODE* lpdvmInit); -int CreateMetaFile(LPCTSTR lpszFile); -int CreateMetaFileA(LPCTSTR lpszFile); -int CreateMetaFileW(LPCTSTR lpszFile); -int CreatePalette(const LOGPALETTE* lplgpl); -int CreatePatternBrush(HBITMAP hbmp); -int CreatePolyPolygonRgn(const POINT* lppt,const INT* lpPolyCounts,int nCount,DWORD fnPolyFillMode); -int CreatePolygonRgn(const POINT* lppt,int cPoints,DWORD fnPolyFillMode); -int CreateRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int CreateRectRgnIndirect(const RECT* lprc); -int CreateRoundRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidthEllipse,int nHeightEllipse); -int CreateScalableFontResource(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); -int CreateScalableFontResourceA(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); -int CreateScalableFontResourceW(DWORD fdwHidden,LPCTSTR lpszFontRes,LPCTSTR lpszFontFile,LPCTSTR lpszCurrentPath); -int CreateSolidBrush(COLORREF crColor); -int DPtoLP(HDC hDC,LPPOINT lpPoints,int nCount); -int DeleteDC(HDC hDC); -int DeleteEnhMetaFile(HENHMETAFILE hemf); -int DeleteMetaFile(HMETAFILE hmf); -int DeleteObject(HGDIOBJ hObject); -int DescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes,LPPIXELFORMATDESCRIPTOR ppfd); -int DrawEscape(HDC hDC,int nEscape,int cbInput,LPCSTR lpszInData); -int Ellipse(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int EndDoc(HDC hDC); -int EndPage(HDC hDC); -int EndPath(HDC hDC); -int EnumEnhMetaFile(HDC hDC,HENHMETAFILE hemf,ENHMFENUMPROC lpEnhMetaFunc,LPVOID lpData,const RECT* lpRect); -int EnumFontFamilies(HDC hdc,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); -int EnumFontFamiliesA(HDC hDC,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); -int EnumFontFamiliesEx(HDC hdc,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); -int EnumFontFamiliesExA(HDC hDC,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); -int EnumFontFamiliesExW(HDC hDC,LPLOGFONT lpLogfont,FONTENUMPROC lpEnumFontFamExProc,LPARAM lParam,DWORD dwFlags); -int EnumFontFamiliesW(HDC hDC,LPCTSTR lpszFamily,FONTENUMPROC lpEnumFontFamProc,LPARAM lParam); -int EnumFonts(HDC hdc,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); -int EnumFontsA(HDC hDC,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); -int EnumFontsW(HDC hDC,LPCTSTR lpFaceName,FONTENUMPROC lpFontFunc,LPARAM lParam); -int EnumMetaFile(HDC hDC,HMETAFILE hmf,MFENUMPROC lpMetaFunc,LPARAM lParam); -int EnumObjects(HDC hDC,int nObjectType,GOBJENUMPROC lpObjectFunc,LPARAM lParam); -int EqualRgn(HRGN hSrcRgn1,HRGN hSrcRgn2); -int Escape(HDC hDC,DWORD nEscape,int cbInput,LPCSTR lpvInData,LPVOID lpvOutData ); -int ExcludeClipRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int ExtCreateRegion(const XFORM* lpXform,DWORD nCount,const RGNDATA* lpRgnData); -int ExtEscape(HDC hdc,int nEscape,int cbInput,LPCSTR lpszInData,int cbOutput,LPSTR lpszOutData); -int ExtFloodFill(HDC hDC,int nXStart,int nYStart,COLORREF crColor,UINT fuFillType); -int ExtSelectClipRgn(HDC hDC,HRGN hrgn,DWORD fnMode); -int ExtTextOut(HDC hdc,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); -int ExtTextOutA(HDC hDC,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); -int ExtTextOutW(HDC hDC,int X,int Y,DWORD fuOptions,const RECT* lprc,LPCTSTR lpString,UINT cbCount,const INT* lpDx); -int FillPath(HDC hDC); -int FillRgn(HDC hDc,HRGN hrgn,HBRUSH hbr); -int FlattenPath(HDC hDC); -int FloodFill(HDC hDc,int nXStart,int nYStart,COLORREF crFill); -int FrameRgn(HDC hDc,HRGN hrgn,HBRUSH hbr,int nWidth,int nHeight); -int GdiComment(HDC hDC,UINT cbSize,const BYTE* lpData); -int GdiFlush(); -int GdiGetBatchLimit(); -int GdiSetBatchLimit(DWORD dwLimit); -int GetArcDirection(HDC hDC); -int GetAspectRatioFilterEx(HDC hDC); -int GetBitmapBits(HBITMAP hBitmap,LONG dwCount,LPVOID lpBits); -int GetBitmapDimensionEx(HBITMAP hBitmap,LPSIZE lpDimension); -int GetBkColor(HDC hDC); -int GetBkMode(HDC hDC); -int GetBoundsRect(HDC hDC,LPRECT lprcBounds,DWORD flags); -int GetBrushOrgEx(HDC hDC,LPPOINT lppt); -int GetCharABCWidths(HDC hdc,UINT uFirstChar,UINT uLastChar,LPABC lpabc); -int GetCharABCWidthsA(HDC hDC,UINT uFirstChar,UINT uLastChar,LPABC lpabc); -int GetCharABCWidthsFloat(HDC hdc,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); -int GetCharABCWidthsFloatA(HDC hDC,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); -int GetCharABCWidthsFloatW(HDC hDC,UINT iFirstChar,UINT iLastChar,LPABCFLOAT lpABCF); -int GetCharABCWidthsI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPABC lpabc); -int GetCharABCWidthsW(HDC hDC,UINT uFirstChar,UINT uLastChar,LPABC lpabc); -int GetCharWidth(HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer); -int GetCharWidth32(HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer); -int GetCharWidthA(HDC hDC,UINT iFirstChar,UINT iLastChar,LPINT lpStockBuffer); -int GetCharWidthFloat(HDC hdc,UINT iFirstChar,UINT iLastChar,PFLOAT pxBuffer); -int GetCharWidthI(HDC hdc,UINT giFirst,UINT cgi,LPWORD pgi,LPINT lpBuffer); -int GetCharWidthW(HDC hDC,UINT iFirstChar,UINT iLastChar,LPINT lpStockBuffer); -int GetCharacterPlacement(HDC hdc,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); -int GetCharacterPlacementA(HDC hDC,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); -int GetCharacterPlacementW(HDC hDC,LPCTSTR lpString,int nCount,int nMaxExtent,LPGCP_RESULTS lpResults,DWORD dwFlags); -int GetClipBox(HDC hDC,LPRECT lprc); -int GetClipRgn(HDC hdc,HRGN hrgn); -int GetColorAdjustment(HDC hdc,LPCOLORADJUSTMENT lpca); -int GetCurrentObject(HDC hDC,DWORD uObjectType); -int GetCurrentPositionEx(HDC hDC,LPPOINT lpPoint); -int GetDCBrushColor(HDC hdc); -int GetDCOrgEx(HDC hDC,LPPOINT lpPoint); -int GetDCPenColor(HDC hdc); -int GetDIBColorTable(HDC hDC,UINT uStartIndex,UINT cEntries,RGBQUAD* pColors); -int GetDIBits(HDC hDC,HBITMAP hbmp,UINT uStartScan,UINT cScanLines,LPVOID lpvBits,LPBITMAPINFO lpbi,DWORD uUsage); -int GetDeviceCaps(HDC hDC,DWORD nIndex); -int GetEnhMetaFile(LPCTSTR lpszMetaFile); -int GetEnhMetaFileA(LPCTSTR lpszMetaFile); -int GetEnhMetaFileBits(HENHMETAFILE hemf,UINT cbBuffer,LPBYTE lpbBuffer); -int GetEnhMetaFileDescription(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); -int GetEnhMetaFileDescriptionA(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); -int GetEnhMetaFileDescriptionW(HENHMETAFILE hemf,UINT cchBuffer,LPTSTR lpszDescription); -int GetEnhMetaFileHeader(HENHMETAFILE hemf,UINT cbBuffer,LPENHMETAHEADER lpemh); -int GetEnhMetaFilePaletteEntries(HENHMETAFILE hemf,UINT cEntries,LPPALETTEENTRY lppe); -int GetEnhMetaFilePixelFormat(HENHMETAFILE hemf,DWORD cbBuffer,const PIXELFORMATDESCRIPTOR* ppfd); -int GetEnhMetaFileW(LPCTSTR lpszMetaFile); -int GetFontData(HDC hDC,DWORD dwTable,DWORD dwOffset,LPVOID lpvBuffer,DWORD cbData); -int GetFontLanguageInfo(HDC hDC); -int GetFontUnicodeRanges(HDC hdc,LPGLYPHSET lpgs); -int GetGlyphIndices(HDC hdc,LPCTSTR lpstr,int c,LPWORD pgi,DWORD fl); -int GetGlyphOutline(HDC hDC,UINT uChar,DWORD uFormat,LPGLYPHMETRICS lpgm,DWORD cbBuffer,LPVOID lpvBuffer,const MAT2* lpmat2); -int GetGlyphOutlineW(HDC hDC,UINT uChar,DWORD uFormat,LPGLYPHMETRICS lpgm,DWORD cbBuffer,LPVOID lpvBuffer,const MAT2* lpmat2); -int GetGraphicsMode(HDC hDC); -int GetKerningPairs(HDC hDC,DWORD nNumPairs,LPKERNINGPAIR lpkrnpair); -int GetKerningPairsW(HDC hDC,DWORD nNumPairs,LPKERNINGPAIR lpkrnpair); -int GetLayout(HDC hdc); -int GetMapMode(HDC hDC); -int GetMetaFileBitsEx(HMETAFILE hmf,UINT nSize,LPVOID lpvData); -int GetMetaRgn(HDC hdc,HRGN hrgn); -int GetMiterLimit(HDC hDC,PFLOAT peLimit); -int GetNearestColor(HDC hDC,COLORREF crColor); -int GetNearestPaletteIndex(HPALETTE hpal,COLORREF crColor); -int GetObject(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); -int GetObjectA(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); -int GetObjectType(HGDIOBJ hgdiobj); -int GetObjectW(HGDIOBJ hgdiobj,int cbBuffer,LPVOID lpvObject); -int GetOutlineTextMetrics(HDC hdc,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); -int GetOutlineTextMetricsA(HDC hDC,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); -int GetOutlineTextMetricsW(HDC hDC,UINT cbData,LPOUTLINETEXTMETRIC lpOTM); -int GetPaletteEntries(HPALETTE hpal,UINT iStartIndex,UINT nEntries,LPPALETTEENTRY lppe); -int GetPath(HDC hDC,LPPOINT lpPoints,LPBYTE lpTypes,int nSize); -int GetPixel(HDC hDC,int XPos,int YPos); -int GetPixelFormat(HDC hdc); -int GetPolyFillMode(HDC hDC); -int GetROP2(HDC hDC); -int GetRandomRgn(HDC hdc,HRGN hrgn,DWORD iNum); -int GetRasterizerCaps(LPRASTERIZER_STATUS lprs,UINT cb); -int GetRegionData(HRGN hRgn,DWORD dwCount,LPRGNDATA lpRgnData); -int GetRgnBox(HRGN hrgn,LPRECT lprc); -int GetStockObject(int fnIndex); -int GetStretchBltMode(HDC hDC); -int GetSystemPaletteEntries(HDC hDC,UINT wStartIndex,UINT wNumEntries,LPPALETTEENTRY lpPaletteEntries); -int GetSystemPaletteUse(HDC hdc); -int GetTextAlign(HDC hDC); -int GetTextCharacterExtra(HDC hDC); -int GetTextCharset(HDC hDC); -int GetTextCharsetInfo(HDC hDC); -int GetTextColor(HDC hDC); -int GetTextExtentExPoint(HDC hdc,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); -int GetTextExtentExPointA(HDC hDC,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); -int GetTextExtentExPointI(HDC hdc,LPWORD pgiIn,int cgi,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); -int GetTextExtentExPointW(HDC hDC,LPCTSTR lpszStr,int cchString,int nMaxExtent,LPINT lpnFit,LPINT alpDx,LPSIZE lpSize); -int GetTextExtentPoint(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize); -int GetTextExtentPoint32(HDC hdc,LPCTSTR lpString,int c,LPSIZE lpSize); -int GetTextExtentPoint32A(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); -int GetTextExtentPoint32W(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize); -int GetTextExtentPointA(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); -int GetTextExtentPointI(HDC hdc,LPWORD pgiIn,int cgi,LPSIZE lpSize); -int GetTextExtentPointW(HDC hDC,LPCTSTR lpString,int cbString,LPSIZE lpSize); -int GetTextFace(HDC hdc,int nCount,LPTSTR lpFaceName); -int GetTextFaceA(HDC hDC,int nCount,LPTSTR lpFaceName); -int GetTextFaceW(HDC hDC,int nCount,LPTSTR lpFaceName); -int GetTextMetrics(HDC hdc,LPTEXTMETRIC lptm); -int GetTextMetricsA(HDC hDC,LPTEXTMETRIC lptm); -int GetTextMetricsW(HDC hDC,LPTEXTMETRIC lptm); -int GetViewportExtEx(HDC hDC,LPSIZE lpSize); -int GetViewportOrgEx(HDC hDC,LPPOINT lpPoint); -int GetWinMetaFileBits(HENHMETAFILE hemf,UINT cbBuffer,LPBYTE lpbBuffer,DWORD fnMapMode,HDC hdcRef); -int GetWindowExtEx(HDC hWnd,LPSIZE lpSize); -int GetWindowOrgEx(HDC hWnd,LPPOINT lpPoint); -int GetWorldTransform(HDC hDC,LPXFORM lpXform); -int IntersectClipRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int InvertRgn(HDC hDC,HRGN hrgn); -int LPtoDP(HDC hDC,LPPOINT lpPoints,int nCount); -int LineDDA(int nXStart,int nYStart,int nXEnd,int nYEnd,LINEDDAPROC lpLineFunc,LPARAM lpData); -int LineTo(HDC hDC,int nXEnd,int nYEnd); -int MaskBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,HBITMAP hbmMask,int xMask,int yMask,DWORD dwRop); -int ModifyWorldTransform(HDC hDC,const XFORM* lpXform,DWORD iMode); -int MoveToEx(HDC hDC,int X,int Y,LPPOINT lpPoint); -int OffsetClipRgn(HDC hDC,int nXOffset,int nYOffset); -int OffsetRgn(HRGN hrgn,int nXOffset,int nYOffset); -int OffsetViewportOrgEx(HDC hDC,int nXOffset,int nYOffset,LPPOINT lpPoint); -int OffsetWindowOrgEx(HDC hDC,int nXOffset,int nYOffset,LPPOINT lpPoint); -int PaintRgn(HDC hDC,HRGN hrgn); -int PatBlt(HDC hDC,int nXLeft,int nYLeft,int nWidth,int nHeight,DWORD dwRop); -int PathToRegion(HDC hDC); -int Pie(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2); -int PlayEnhMetaFile(HDC hDC,HENHMETAFILE hemf,const RECT* lpRect); -int PlayEnhMetaFileRecord(HDC hDC,LPHANDLETABLE lpHandletable,const ENHMETARECORD* lpEnhMetaRecord,UINT nHandles); -int PlayMetaFile(HDC hDC,HMETAFILE hmf); -int PlayMetaFileRecord(HDC hDC,LPHANDLETABLE lpHandletable,LPMETARECORD lpMetaRecord,UINT nHandles); -int PlgBlt(HDC hdcDest,const POINT* lpPoint,HDC hdcSrc,int nXSrc,int nYSrc,int nWidth,int nHeight,HBITMAP hbmMask,int xMask,int yMask); -int PolyBezier(HDC hDC,const POINT* lppt,DWORD lppt); -int PolyBezierTo(HDC hdc,const POINT* lppt,DWORD cCount); -int PolyDraw(HDC hDC,const POINT* lppt,const BYTE* lpbTypes,int cCount); -int PolyPolygon(HDC hDC,const POINT* lpPoints,const INT* lpPolyCounts,int nCount); -int PolyPolyline(HDC hDC,const POINT* lppt,const DWORD* lpdwPolyPoints,DWORD cCount); -int PolyTextOut(HDC hdc,const POLYTEXT* pptxt,int cStrings); -int PolyTextOutA(HDC hDC,const POLYTEXT* pptxt,int cStrings); -int PolyTextOutW(HDC hDC,const POLYTEXT* pptxt,int cStrings); -int Polygon(HDC hDC,const POINT* lpPoints,int nCount); -int Polyline(HDC hDC,const POINT* lppt,int cPoints); -int PolylineTo(HDC hdc,const POINT* lppt,DWORD cCount); -int PtInRegion(HRGN hrgn,int X,int Y); -int PtVisible(HDC hDC,int X,int Y); -int RealizePalette(DWORD hDC); -int RealizePalette(HDC hDC); -int RectInRegion(HRGN hrgn,const RECT* lprc); -int RectVisible(HDC hDC,const RECT* lprc); -int Rectangle(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int RemoveFontMemResourceEx(HANDLE fh); -int RemoveFontResource(LPCTSTR lpFileName); -int RemoveFontResourceA(LPCTSTR lpFileName); -int RemoveFontResourceEx(LPCTSTR lpFileName,DWORD fl,PVOID pdv); -int RemoveFontResourceW(LPCTSTR lpFileName); -int ResetDC(HDC hdc,const DEVMODE* lpInitData); -int ResetDCA(HDC hDc,const DEVMODE* lpInitData); -int ResetDCW(HDC hDc,const DEVMODE* lpInitData); -int ResizePalette(HPALETTE hpal,UINT nEntries); -int RestoreDC(HDC hDC,int nSavedDC); -int RoundRect(HDC hDC,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidth,int nHeight); -int SaveDC(HDC hDC); -int ScaleViewportExtEx(HDC hDC,int Xnum,int Xdenom,int Ynum,int Ydenom,LPSIZE lpSize); -int ScaleWindowExtEx(HDC hDC,int Xnum,int Xdenom,int Ynum,int Ydenom,LPSIZE lpSize); -int SelectClipPath(HDC hDC,int iMode); -int SelectClipRgn(HDC hDC,HRGN hrgn); -int SelectObject(HDC hDC,HGDIOBJ hObjec); -int SelectPalette(HDC hDC,HPALETTE hpal,BOOL bForceBackground); -int SetAbortProc(HDC hDC,ABORTPROC lpAbortProc); -int SetArcDirection(HDC hDC,int ArcDirection); -int SetBitmapBits(HBITMAP hbmp,DWORD cBytes,const VOID* lpBits); -int SetBitmapDimensionEx(HBITMAP hBitmap,int nWidth,int nHeight,LPSIZE lpSize); -int SetBkColor(HDC hDC,COLORREF crColor); -int SetBkMode(HDC hDC,DWORD iBkMode); -int SetBoundsRect(HDC hDC,const RECT* lprcBounds,DWORD flags); -int SetBrushOrgEx(HDC hDC,int nXOrg,int nYOrg,LPPOINT lppt); -int SetColorAdjustment(HDC hdc,const COLORADJUSTMENT* lpca); -int SetDCBrushColor(HDC hdc,COLORREF crColor); -int SetDCPenColor(HDC hdc,COLORREF crColor); -int SetDIBColorTable(HDC hDC,UINT un1,UINT un2,const RGBQUAD* pcRGBQuad); -int SetDIBits(HDC hDC,HBITMAP hbmp,UINT uStartScan,UINT cScanLines,const VOID* lpvBits,const BITMAPINFO* lpbmi,DWORD fuColorUse); -int SetDIBitsToDevice(HDC hDC,int XDest,int YDest,DWORD dwWidth,DWORD dwHeight,int XSrc,int YSrc,UINT uStartScan,UINT cScanLines,const VOID* lpvBits,const BITMAPINFO* lpbmi,DWORD fuColorUse); -int SetEnhMetaFileBits(UINT cbBuffer,const BYTE* lpData); -int SetGraphicsMode(HDC hDC,DWORD iMode); -int SetLayout(HDC hdc,DWORD dwLayout); -int SetMapMode(HDC hDC,DWORD fnMapMode); -int SetMapperFlags(HDC hDC,DWORD dwFlag); -int SetMetaFileBitsEx(UINT nSize,const BYTE* lpData); -int SetMetaRgn(HDC hdc); -int SetMiterLimit(HDC hDC,FLOAT eNewLimit,PFLOAT peOldLimit); -int SetPaletteEntries(HPALETTE hpal,UINT iStart,UINT cEntries,const PALETTEENTRY* lppe); -int SetPixel(HDC hDC,int X,int Y,COLORREF crColor); -int SetPixelFormat(HDC hdc,int iPixelFormat,const PIXELFORMATDESCRIPTOR* ppfd); -int SetPixelV(HDC hDC,int X,int Y,COLORREF crColor); -int SetPolyFillMode(HDC hDC,DWORD iPolyFillMode); -int SetROP2(HDC hDC,DWORD fnDrawMode2); -int SetRectRgn(HRGN hrgn,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect); -int SetStretchBltMode(HDC hDC,DWORD iStretchMode); -int SetSystemPaletteUse(HDC hdc,UINT uUsage); -int SetTextAlign(HDC hDC,DWORD fMode); -int SetTextCharacterExtra(HDC hDC,int nCharExtra); -int SetTextColor(HDC hDC,COLORREF crColor); -int SetTextJustification(HDC hDC,int nBreakExtra,int nBreakCount); -int SetViewportExtEx(HDC hDc,int nXExtent,int nYExtent,LPSIZE lpSize); -int SetViewportOrgEx(HDC hDC,int X,int Y,LPPOINT lpPoint); -int SetWinMetaFileBits(UINT nBufferSize,const BYTE* lpbBuffer,HDC hdcRef,const METAFILEPICT* lpmfp); -int SetWindowExtEx(HDC hDC,int nXExtent,int nYExtent,LPSIZE lpSize); -int SetWindowOrgEx(HDC hDC,int X,int Y,LPPOINT lpPoint); -int SetWorldTransform(HDC hDC,const XFORM* lpXform); -int StartDoc(HDC hdc,const DOCINFO* lpdi); -int StartDocA(HDC hDC,const DOCINFO* lpdi); -int StartDocW(HDC hDC,const DOCINFO* lpdi); -int StartPage(HDC hDC); -int StretchBlt(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,DWORD dwRop); -int StretchDIBits(HDC hDC,int XDest,int YDest,int nDestWidth,int nDestHeight,int XSrc,int YSrc,int nSrcWidth,int nSrcHeight,const VOID* lpBits,const BITMAPINFO* lpBitsInf,DWORD iUsage,DWORD dwRop); -int StrokeAndFillPath(HDC hDC); -int StrokePath(HDC hDC); -int SwapBuffers(HDC hdc); -int TextOut(HDC hdc,int nXStart,int nYStart,LPCTSTR lpString,int cbString); -int TextOutA(HDC hDC,int nXStart,int nYStart,LPCTSTR lpString,int cbString); -int TextOutW(HDC hDC,int nXStart,int nYStart,LPCTSTR lpString,int cbString); -int TranslateCharsetInfo(DWORD* lpSrc,LPCHARSETINFO lpCharsetInfo,DWORD dwFlags); -int UnrealizeObject(HGDIOBJ hgdiobj); -int UpdateColors(HDC hdc); -int WidenPath(HDC hDC); -HPEN CreatePen(int fnPenStyle,int nWidth,COLORREF crColor); \ No newline at end of file +int;AbortDoc;HDC hDC; +int;AbortPath;HDC hDC; +int;AddFontMemResourceEx;PVOID pbFont;DWORD cbFont;PVOID pdv;DWORD* pcFonts; +int;AddFontResource;LPCTSTR lpszFilename; +int;AddFontResourceA;LPCTSTR lpszFilename; +int;AddFontResourceEx;LPCTSTR lpszFilename;DWORD fl;PVOID pdv; +int;AddFontResourceW;LPCTSTR lpszFilename; +int;AngleArc;HDC hDC;int x;int y;DWORD dwRadius;FLOAT eStartAngle;FLOAT eSweepAngle; +int;AnimatePalette;HPALETTE hpal;UINT iStartindex;UINT cEntries;const PALETTEENTRY* ppe; +int;Arc;HDC hDC;int nLeftRect;int nTopRect;int nTopRect;int nBottomRect;int nXStartArc;int nYStartArc;int nXEndArc;int nYEndArc; +int;ArcTo;HDC hdc;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect;int nXRadial1;int nYRadial1;int nXRadial2;int nYRadial2; +int;BeginPath;HDC hDC; +int;BitBlt;HDC hDCDest;int nXDest;int nYDest;int nWidth;int nHeight;HDC hdcSrc;int nXSrc;int nYSrc;DWORD dwRop; +int;CancelDC;HDC hDC; +int;ChoosePixelFormat;HDC hdc;const PIXELFORMATDESCRIPTOR* ppfd; +int;Chord;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect;int nXRadial1;int nYRadial1;int nXRadial2;int nYRadial2; +int;CloseEnhMetaFile;HDC hDC; +int;CloseFigure;HDC hDC; +int;CloseMetaFile;HDC hDC; +int;CombineRgn;HRGN hrgnDest;HRGN hrgnSrc1;HRGN hrgnSrc2;DWORD fnCombineMode; +int;CombineTransform;LPXFORM lpxformResult;const XFORM* lpxform1;const XFORM* lpxform2; +int;CopyEnhMetaFile;HENHMETAFILE hemfSrc;LPCTSTR lpszFile; +int;CopyEnhMetaFileA;HENHMETAFILE hemfSrc;LPCTSTR lpszFile; +int;CopyEnhMetaFileW;HENHMETAFILE hemfSrc;LPCTSTR lpszFile; +int;CopyMetaFile;HMETAFILE hmfSrc;LPCTSTR lpszFile; +int;CopyMetaFileA;HMETAFILE hmfSrc;LPCTSTR lpszFile; +int;CopyMetaFileW;HMETAFILE hmfSrc;LPCTSTR lpszFile; +int;CreateBitmap;int nWidth;int nHeight;UINT cPlanes;UINT cBitsPerPel;const VOID* lpvBits; +int;CreateBitmapIndirect;const BITMAP* lpbm; +int;CreateBrushIndirect;const LOGBRUSH* lplb; +int;CreateCompatibleBitmap;HDC hDC;int nWidth;int nHeight; +int;CreateCompatibleDC;HDC hDC; +int;CreateDC;LPCTSTR lpszDriver;LPCTSTR lpszDevice;LPCTSTR lpszOutput;const DEVMODE* lpInitData; +int;CreateDCA;LPCTSTR lpszDriver;LPCTSTR lpszDevice;LPCTSTR lpszOutput;const DEVMODE* lpInitData; +int;CreateDCW;LPCTSTR lpszDriver;LPCTSTR lpszDevice;LPCTSTR lpszOutput;const DEVMODE* lpInitData; +int;CreateDIBPatternBrush;HGLOBAL hglbDIBPacked;UINT fuColorSpec; +int;CreateDIBPatternBrushPt;const VOID* lpPackedDIB;DWORD iUsage; +int;CreateDIBSection;HDC hDC;const BITMAPINFO* pbmi;DWORD iUsage;VOID** ppvBits;HANDLE hSection;DWORD dwOffset; +int;CreateDIBitmap;HDC hDC;const BITMAPINFOHEADER* lpbmih;DWORD lpbmih;const VOID* lpbInit;const BITMAPINFO* lpbmi;DWORD fuUsage; +int;CreateDiscardableBitmap;HDC hdc;int nWidth;int nHeight; +int;CreateEllipticRgn;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;CreateEllipticRgnIndirect;const RECT* lprc; +int;CreateEnhMetaFile;HDC hdcRef;LPCTSTR lpFilename;const RECT* lpRect;LPCTSTR lpDescription; +int;CreateEnhMetaFileA;HDC hDC;LPCTSTR lpFilename;const RECT* lpRect;LPCTSTR lpDescription; +int;CreateEnhMetaFileW;HDC hDC;LPCTSTR lpFilename;const RECT* lpRect;LPCTSTR lpDescription; +int;CreateFont;int nHeight;int nWidth;int nEscapement;int nOrientation;DWORD fnWeight;DWORD fdwItalic;DWORD fdwUnderline;DWORD fdwStrikeOut;DWORD fdwCharSet;DWORD fdwOutputPrecision;DWORD fdwClipPrecision;DWORD fdwQuality;DWORD fdwPitchAndFamily;LPCTSTR lpszFace; +int;CreateFontA;int nHeight;int nWidth;int nEscapement;int nOrientation;DWORD fnWeight;DWORD fdwItalic;DWORD fdwUnderline;DWORD fdwStrikeOut;DWORD fdwCharSet;DWORD fdwOutputPrecision;DWORD fdwClipPrecision;DWORD fdwQuality;DWORD fdwPitchAndFamily;LPCTSTR lpszFace; +int;CreateFontIndirect;const LOGFONT* lplf; +int;CreateFontIndirectA;const LOGFONT* lplf; +int;CreateFontIndirectEx;const ENUMLOGFONTEXDV* penumlfex; +int;CreateFontIndirectW;const LOGFONT* lplf; +int;CreateFontW;int nHeight;int nWidth;int nEscapement;int nOrientation;DWORD fnWeight;DWORD fdwItalic;DWORD fdwUnderline;DWORD fdwStrikeOut;DWORD fdwCharSet;DWORD fdwOutputPrecision;DWORD fdwClipPrecision;DWORD fdwQuality;DWORD fdwPitchAndFamily;LPCTSTR lpszFace; +int;CreateHalftonePalette;HDC hDC; +int;CreateHatchBrush;DWORD fnStyle;COLORREF clrref; +int;CreateIC;LPCTSTR lpszDriver;LPCTSTR lpszDevice;LPCTSTR lpszOutput;const DEVMODE* lpdvmInit; +int;CreateICA;LPCTSTR lpszDriver;LPCTSTR lpszDevice;LPCTSTR lpszOutput;const DEVMODE* lpdvmInit; +int;CreateMetaFile;LPCTSTR lpszFile; +int;CreateMetaFileA;LPCTSTR lpszFile; +int;CreateMetaFileW;LPCTSTR lpszFile; +int;CreatePalette;const LOGPALETTE* lplgpl; +int;CreatePatternBrush;HBITMAP hbmp; +int;CreatePolyPolygonRgn;const POINT* lppt;const INT* lpPolyCounts;int nCount;DWORD fnPolyFillMode; +int;CreatePolygonRgn;const POINT* lppt;int cPoints;DWORD fnPolyFillMode; +int;CreateRectRgn;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;CreateRectRgnIndirect;const RECT* lprc; +int;CreateRoundRectRgn;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect;int nWidthEllipse;int nHeightEllipse; +int;CreateScalableFontResource;DWORD fdwHidden;LPCTSTR lpszFontRes;LPCTSTR lpszFontFile;LPCTSTR lpszCurrentPath; +int;CreateScalableFontResourceA;DWORD fdwHidden;LPCTSTR lpszFontRes;LPCTSTR lpszFontFile;LPCTSTR lpszCurrentPath; +int;CreateScalableFontResourceW;DWORD fdwHidden;LPCTSTR lpszFontRes;LPCTSTR lpszFontFile;LPCTSTR lpszCurrentPath; +int;CreateSolidBrush;COLORREF crColor; +int;DPtoLP;HDC hDC;LPPOINT lpPoints;int nCount; +int;DeleteDC;HDC hDC; +int;DeleteEnhMetaFile;HENHMETAFILE hemf; +int;DeleteMetaFile;HMETAFILE hmf; +int;DeleteObject;HGDIOBJ hObject; +int;DescribePixelFormat;HDC hdc;int iPixelFormat;UINT nBytes;LPPIXELFORMATDESCRIPTOR ppfd; +int;DrawEscape;HDC hDC;int nEscape;int cbInput;LPCSTR lpszInData; +int;Ellipse;HDC hdc;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;EndDoc;HDC hDC; +int;EndPage;HDC hDC; +int;EndPath;HDC hDC; +int;EnumEnhMetaFile;HDC hDC;HENHMETAFILE hemf;ENHMFENUMPROC lpEnhMetaFunc;LPVOID lpData;const RECT* lpRect; +int;EnumFontFamilies;HDC hdc;LPCTSTR lpszFamily;FONTENUMPROC lpEnumFontFamProc;LPARAM lParam; +int;EnumFontFamiliesA;HDC hDC;LPCTSTR lpszFamily;FONTENUMPROC lpEnumFontFamProc;LPARAM lParam; +int;EnumFontFamiliesEx;HDC hdc;LPLOGFONT lpLogfont;FONTENUMPROC lpEnumFontFamExProc;LPARAM lParam;DWORD dwFlags; +int;EnumFontFamiliesExA;HDC hDC;LPLOGFONT lpLogfont;FONTENUMPROC lpEnumFontFamExProc;LPARAM lParam;DWORD dwFlags; +int;EnumFontFamiliesExW;HDC hDC;LPLOGFONT lpLogfont;FONTENUMPROC lpEnumFontFamExProc;LPARAM lParam;DWORD dwFlags; +int;EnumFontFamiliesW;HDC hDC;LPCTSTR lpszFamily;FONTENUMPROC lpEnumFontFamProc;LPARAM lParam; +int;EnumFonts;HDC hdc;LPCTSTR lpFaceName;FONTENUMPROC lpFontFunc;LPARAM lParam; +int;EnumFontsA;HDC hDC;LPCTSTR lpFaceName;FONTENUMPROC lpFontFunc;LPARAM lParam; +int;EnumFontsW;HDC hDC;LPCTSTR lpFaceName;FONTENUMPROC lpFontFunc;LPARAM lParam; +int;EnumMetaFile;HDC hDC;HMETAFILE hmf;MFENUMPROC lpMetaFunc;LPARAM lParam; +int;EnumObjects;HDC hDC;int nObjectType;GOBJENUMPROC lpObjectFunc;LPARAM lParam; +int;EqualRgn;HRGN hSrcRgn1;HRGN hSrcRgn2; +int;Escape;HDC hDC;DWORD nEscape;int cbInput;LPCSTR lpvInData;LPVOID lpvOutData ; +int;ExcludeClipRect;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;ExtCreateRegion;const XFORM* lpXform;DWORD nCount;const RGNDATA* lpRgnData; +int;ExtEscape;HDC hdc;int nEscape;int cbInput;LPCSTR lpszInData;int cbOutput;LPSTR lpszOutData; +int;ExtFloodFill;HDC hDC;int nXStart;int nYStart;COLORREF crColor;UINT fuFillType; +int;ExtSelectClipRgn;HDC hDC;HRGN hrgn;DWORD fnMode; +int;ExtTextOut;HDC hdc;int X;int Y;DWORD fuOptions;const RECT* lprc;LPCTSTR lpString;UINT cbCount;const INT* lpDx; +int;ExtTextOutA;HDC hDC;int X;int Y;DWORD fuOptions;const RECT* lprc;LPCTSTR lpString;UINT cbCount;const INT* lpDx; +int;ExtTextOutW;HDC hDC;int X;int Y;DWORD fuOptions;const RECT* lprc;LPCTSTR lpString;UINT cbCount;const INT* lpDx; +int;FillPath;HDC hDC; +int;FillRgn;HDC hDc;HRGN hrgn;HBRUSH hbr; +int;FlattenPath;HDC hDC; +int;FloodFill;HDC hDc;int nXStart;int nYStart;COLORREF crFill; +int;FrameRgn;HDC hDc;HRGN hrgn;HBRUSH hbr;int nWidth;int nHeight; +int;GdiComment;HDC hDC;UINT cbSize;const BYTE* lpData; +int;GdiFlush;; +int;GdiGetBatchLimit;; +int;GdiSetBatchLimit;DWORD dwLimit; +int;GetArcDirection;HDC hDC; +int;GetAspectRatioFilterEx;HDC hDC; +int;GetBitmapBits;HBITMAP hBitmap;LONG dwCount;LPVOID lpBits; +int;GetBitmapDimensionEx;HBITMAP hBitmap;LPSIZE lpDimension; +int;GetBkColor;HDC hDC; +int;GetBkMode;HDC hDC; +int;GetBoundsRect;HDC hDC;LPRECT lprcBounds;DWORD flags; +int;GetBrushOrgEx;HDC hDC;LPPOINT lppt; +int;GetCharABCWidths;HDC hdc;UINT uFirstChar;UINT uLastChar;LPABC lpabc; +int;GetCharABCWidthsA;HDC hDC;UINT uFirstChar;UINT uLastChar;LPABC lpabc; +int;GetCharABCWidthsFloat;HDC hdc;UINT iFirstChar;UINT iLastChar;LPABCFLOAT lpABCF; +int;GetCharABCWidthsFloatA;HDC hDC;UINT iFirstChar;UINT iLastChar;LPABCFLOAT lpABCF; +int;GetCharABCWidthsFloatW;HDC hDC;UINT iFirstChar;UINT iLastChar;LPABCFLOAT lpABCF; +int;GetCharABCWidthsI;HDC hdc;UINT giFirst;UINT cgi;LPWORD pgi;LPABC lpabc; +int;GetCharABCWidthsW;HDC hDC;UINT uFirstChar;UINT uLastChar;LPABC lpabc; +int;GetCharWidth;HDC hdc;UINT iFirstChar;UINT iLastChar;LPINT lpBuffer; +int;GetCharWidth32;HDC hdc;UINT iFirstChar;UINT iLastChar;LPINT lpBuffer; +int;GetCharWidthA;HDC hDC;UINT iFirstChar;UINT iLastChar;LPINT lpStockBuffer; +int;GetCharWidthFloat;HDC hdc;UINT iFirstChar;UINT iLastChar;PFLOAT pxBuffer; +int;GetCharWidthI;HDC hdc;UINT giFirst;UINT cgi;LPWORD pgi;LPINT lpBuffer; +int;GetCharWidthW;HDC hDC;UINT iFirstChar;UINT iLastChar;LPINT lpStockBuffer; +int;GetCharacterPlacement;HDC hdc;LPCTSTR lpString;int nCount;int nMaxExtent;LPGCP_RESULTS lpResults;DWORD dwFlags; +int;GetCharacterPlacementA;HDC hDC;LPCTSTR lpString;int nCount;int nMaxExtent;LPGCP_RESULTS lpResults;DWORD dwFlags; +int;GetCharacterPlacementW;HDC hDC;LPCTSTR lpString;int nCount;int nMaxExtent;LPGCP_RESULTS lpResults;DWORD dwFlags; +int;GetClipBox;HDC hDC;LPRECT lprc; +int;GetClipRgn;HDC hdc;HRGN hrgn; +int;GetColorAdjustment;HDC hdc;LPCOLORADJUSTMENT lpca; +int;GetCurrentObject;HDC hDC;DWORD uObjectType; +int;GetCurrentPositionEx;HDC hDC;LPPOINT lpPoint; +int;GetDCBrushColor;HDC hdc; +int;GetDCOrgEx;HDC hDC;LPPOINT lpPoint; +int;GetDCPenColor;HDC hdc; +int;GetDIBColorTable;HDC hDC;UINT uStartIndex;UINT cEntries;RGBQUAD* pColors; +int;GetDIBits;HDC hDC;HBITMAP hbmp;UINT uStartScan;UINT cScanLines;LPVOID lpvBits;LPBITMAPINFO lpbi;DWORD uUsage; +int;GetDeviceCaps;HDC hDC;DWORD nIndex; +int;GetEnhMetaFile;LPCTSTR lpszMetaFile; +int;GetEnhMetaFileA;LPCTSTR lpszMetaFile; +int;GetEnhMetaFileBits;HENHMETAFILE hemf;UINT cbBuffer;LPBYTE lpbBuffer; +int;GetEnhMetaFileDescription;HENHMETAFILE hemf;UINT cchBuffer;LPTSTR lpszDescription; +int;GetEnhMetaFileDescriptionA;HENHMETAFILE hemf;UINT cchBuffer;LPTSTR lpszDescription; +int;GetEnhMetaFileDescriptionW;HENHMETAFILE hemf;UINT cchBuffer;LPTSTR lpszDescription; +int;GetEnhMetaFileHeader;HENHMETAFILE hemf;UINT cbBuffer;LPENHMETAHEADER lpemh; +int;GetEnhMetaFilePaletteEntries;HENHMETAFILE hemf;UINT cEntries;LPPALETTEENTRY lppe; +int;GetEnhMetaFilePixelFormat;HENHMETAFILE hemf;DWORD cbBuffer;const PIXELFORMATDESCRIPTOR* ppfd; +int;GetEnhMetaFileW;LPCTSTR lpszMetaFile; +int;GetFontData;HDC hDC;DWORD dwTable;DWORD dwOffset;LPVOID lpvBuffer;DWORD cbData; +int;GetFontLanguageInfo;HDC hDC; +int;GetFontUnicodeRanges;HDC hdc;LPGLYPHSET lpgs; +int;GetGlyphIndices;HDC hdc;LPCTSTR lpstr;int c;LPWORD pgi;DWORD fl; +int;GetGlyphOutline;HDC hDC;UINT uChar;DWORD uFormat;LPGLYPHMETRICS lpgm;DWORD cbBuffer;LPVOID lpvBuffer;const MAT2* lpmat2; +int;GetGlyphOutlineW;HDC hDC;UINT uChar;DWORD uFormat;LPGLYPHMETRICS lpgm;DWORD cbBuffer;LPVOID lpvBuffer;const MAT2* lpmat2; +int;GetGraphicsMode;HDC hDC; +int;GetKerningPairs;HDC hDC;DWORD nNumPairs;LPKERNINGPAIR lpkrnpair; +int;GetKerningPairsW;HDC hDC;DWORD nNumPairs;LPKERNINGPAIR lpkrnpair; +int;GetLayout;HDC hdc; +int;GetMapMode;HDC hDC; +int;GetMetaFileBitsEx;HMETAFILE hmf;UINT nSize;LPVOID lpvData; +int;GetMetaRgn;HDC hdc;HRGN hrgn; +int;GetMiterLimit;HDC hDC;PFLOAT peLimit; +int;GetNearestColor;HDC hDC;COLORREF crColor; +int;GetNearestPaletteIndex;HPALETTE hpal;COLORREF crColor; +int;GetObject;HGDIOBJ hgdiobj;int cbBuffer;LPVOID lpvObject; +int;GetObjectA;HGDIOBJ hgdiobj;int cbBuffer;LPVOID lpvObject; +int;GetObjectType;HGDIOBJ hgdiobj; +int;GetObjectW;HGDIOBJ hgdiobj;int cbBuffer;LPVOID lpvObject; +int;GetOutlineTextMetrics;HDC hdc;UINT cbData;LPOUTLINETEXTMETRIC lpOTM; +int;GetOutlineTextMetricsA;HDC hDC;UINT cbData;LPOUTLINETEXTMETRIC lpOTM; +int;GetOutlineTextMetricsW;HDC hDC;UINT cbData;LPOUTLINETEXTMETRIC lpOTM; +int;GetPaletteEntries;HPALETTE hpal;UINT iStartIndex;UINT nEntries;LPPALETTEENTRY lppe; +int;GetPath;HDC hDC;LPPOINT lpPoints;LPBYTE lpTypes;int nSize; +int;GetPixel;HDC hDC;int XPos;int YPos; +int;GetPixelFormat;HDC hdc; +int;GetPolyFillMode;HDC hDC; +int;GetROP2;HDC hDC; +int;GetRandomRgn;HDC hdc;HRGN hrgn;DWORD iNum; +int;GetRasterizerCaps;LPRASTERIZER_STATUS lprs;UINT cb; +int;GetRegionData;HRGN hRgn;DWORD dwCount;LPRGNDATA lpRgnData; +int;GetRgnBox;HRGN hrgn;LPRECT lprc; +int;GetStockObject;int fnIndex; +int;GetStretchBltMode;HDC hDC; +int;GetSystemPaletteEntries;HDC hDC;UINT wStartIndex;UINT wNumEntries;LPPALETTEENTRY lpPaletteEntries; +int;GetSystemPaletteUse;HDC hdc; +int;GetTextAlign;HDC hDC; +int;GetTextCharacterExtra;HDC hDC; +int;GetTextCharset;HDC hDC; +int;GetTextCharsetInfo;HDC hDC; +int;GetTextColor;HDC hDC; +int;GetTextExtentExPoint;HDC hdc;LPCTSTR lpszStr;int cchString;int nMaxExtent;LPINT lpnFit;LPINT alpDx;LPSIZE lpSize; +int;GetTextExtentExPointA;HDC hDC;LPCTSTR lpszStr;int cchString;int nMaxExtent;LPINT lpnFit;LPINT alpDx;LPSIZE lpSize; +int;GetTextExtentExPointI;HDC hdc;LPWORD pgiIn;int cgi;int nMaxExtent;LPINT lpnFit;LPINT alpDx;LPSIZE lpSize; +int;GetTextExtentExPointW;HDC hDC;LPCTSTR lpszStr;int cchString;int nMaxExtent;LPINT lpnFit;LPINT alpDx;LPSIZE lpSize; +int;GetTextExtentPoint;HDC hdc;LPCTSTR lpString;int cbString;LPSIZE lpSize; +int;GetTextExtentPoint32;HDC hdc;LPCTSTR lpString;int c;LPSIZE lpSize; +int;GetTextExtentPoint32A;HDC hDC;LPCTSTR lpString;int cbString;LPSIZE lpSize; +int;GetTextExtentPoint32W;HDC hdc;LPCTSTR lpString;int cbString;LPSIZE lpSize; +int;GetTextExtentPointA;HDC hDC;LPCTSTR lpString;int cbString;LPSIZE lpSize; +int;GetTextExtentPointI;HDC hdc;LPWORD pgiIn;int cgi;LPSIZE lpSize; +int;GetTextExtentPointW;HDC hDC;LPCTSTR lpString;int cbString;LPSIZE lpSize; +int;GetTextFace;HDC hdc;int nCount;LPTSTR lpFaceName; +int;GetTextFaceA;HDC hDC;int nCount;LPTSTR lpFaceName; +int;GetTextFaceW;HDC hDC;int nCount;LPTSTR lpFaceName; +int;GetTextMetrics;HDC hdc;LPTEXTMETRIC lptm; +int;GetTextMetricsA;HDC hDC;LPTEXTMETRIC lptm; +int;GetTextMetricsW;HDC hDC;LPTEXTMETRIC lptm; +int;GetViewportExtEx;HDC hDC;LPSIZE lpSize; +int;GetViewportOrgEx;HDC hDC;LPPOINT lpPoint; +int;GetWinMetaFileBits;HENHMETAFILE hemf;UINT cbBuffer;LPBYTE lpbBuffer;DWORD fnMapMode;HDC hdcRef; +int;GetWindowExtEx;HDC hWnd;LPSIZE lpSize; +int;GetWindowOrgEx;HDC hWnd;LPPOINT lpPoint; +int;GetWorldTransform;HDC hDC;LPXFORM lpXform; +int;IntersectClipRect;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;InvertRgn;HDC hDC;HRGN hrgn; +int;LPtoDP;HDC hDC;LPPOINT lpPoints;int nCount; +int;LineDDA;int nXStart;int nYStart;int nXEnd;int nYEnd;LINEDDAPROC lpLineFunc;LPARAM lpData; +int;LineTo;HDC hDC;int nXEnd;int nYEnd; +int;MaskBlt;HDC hdcDest;int nXDest;int nYDest;int nWidth;int nHeight;HDC hdcSrc;int nXSrc;int nYSrc;HBITMAP hbmMask;int xMask;int yMask;DWORD dwRop; +int;ModifyWorldTransform;HDC hDC;const XFORM* lpXform;DWORD iMode; +int;MoveToEx;HDC hDC;int X;int Y;LPPOINT lpPoint; +int;OffsetClipRgn;HDC hDC;int nXOffset;int nYOffset; +int;OffsetRgn;HRGN hrgn;int nXOffset;int nYOffset; +int;OffsetViewportOrgEx;HDC hDC;int nXOffset;int nYOffset;LPPOINT lpPoint; +int;OffsetWindowOrgEx;HDC hDC;int nXOffset;int nYOffset;LPPOINT lpPoint; +int;PaintRgn;HDC hDC;HRGN hrgn; +int;PatBlt;HDC hDC;int nXLeft;int nYLeft;int nWidth;int nHeight;DWORD dwRop; +int;PathToRegion;HDC hDC; +int;Pie;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect;int nXRadial1;int nYRadial1;int nXRadial2;int nYRadial2; +int;PlayEnhMetaFile;HDC hDC;HENHMETAFILE hemf;const RECT* lpRect; +int;PlayEnhMetaFileRecord;HDC hDC;LPHANDLETABLE lpHandletable;const ENHMETARECORD* lpEnhMetaRecord;UINT nHandles; +int;PlayMetaFile;HDC hDC;HMETAFILE hmf; +int;PlayMetaFileRecord;HDC hDC;LPHANDLETABLE lpHandletable;LPMETARECORD lpMetaRecord;UINT nHandles; +int;PlgBlt;HDC hdcDest;const POINT* lpPoint;HDC hdcSrc;int nXSrc;int nYSrc;int nWidth;int nHeight;HBITMAP hbmMask;int xMask;int yMask; +int;PolyBezier;HDC hDC;const POINT* lppt;DWORD lppt; +int;PolyBezierTo;HDC hdc;const POINT* lppt;DWORD cCount; +int;PolyDraw;HDC hDC;const POINT* lppt;const BYTE* lpbTypes;int cCount; +int;PolyPolygon;HDC hDC;const POINT* lpPoints;const INT* lpPolyCounts;int nCount; +int;PolyPolyline;HDC hDC;const POINT* lppt;const DWORD* lpdwPolyPoints;DWORD cCount; +int;PolyTextOut;HDC hdc;const POLYTEXT* pptxt;int cStrings; +int;PolyTextOutA;HDC hDC;const POLYTEXT* pptxt;int cStrings; +int;PolyTextOutW;HDC hDC;const POLYTEXT* pptxt;int cStrings; +int;Polygon;HDC hDC;const POINT* lpPoints;int nCount; +int;Polyline;HDC hDC;const POINT* lppt;int cPoints; +int;PolylineTo;HDC hdc;const POINT* lppt;DWORD cCount; +int;PtInRegion;HRGN hrgn;int X;int Y; +int;PtVisible;HDC hDC;int X;int Y; +int;RealizePalette;DWORD hDC; +int;RealizePalette;HDC hDC; +int;RectInRegion;HRGN hrgn;const RECT* lprc; +int;RectVisible;HDC hDC;const RECT* lprc; +int;Rectangle;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;RemoveFontMemResourceEx;HANDLE fh; +int;RemoveFontResource;LPCTSTR lpFileName; +int;RemoveFontResourceA;LPCTSTR lpFileName; +int;RemoveFontResourceEx;LPCTSTR lpFileName;DWORD fl;PVOID pdv; +int;RemoveFontResourceW;LPCTSTR lpFileName; +int;ResetDC;HDC hdc;const DEVMODE* lpInitData; +int;ResetDCA;HDC hDc;const DEVMODE* lpInitData; +int;ResetDCW;HDC hDc;const DEVMODE* lpInitData; +int;ResizePalette;HPALETTE hpal;UINT nEntries; +int;RestoreDC;HDC hDC;int nSavedDC; +int;RoundRect;HDC hDC;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect;int nWidth;int nHeight; +int;SaveDC;HDC hDC; +int;ScaleViewportExtEx;HDC hDC;int Xnum;int Xdenom;int Ynum;int Ydenom;LPSIZE lpSize; +int;ScaleWindowExtEx;HDC hDC;int Xnum;int Xdenom;int Ynum;int Ydenom;LPSIZE lpSize; +int;SelectClipPath;HDC hDC;int iMode; +int;SelectClipRgn;HDC hDC;HRGN hrgn; +int;SelectObject;HDC hDC;HGDIOBJ hObjec; +int;SelectPalette;HDC hDC;HPALETTE hpal;BOOL bForceBackground; +int;SetAbortProc;HDC hDC;ABORTPROC lpAbortProc; +int;SetArcDirection;HDC hDC;int ArcDirection; +int;SetBitmapBits;HBITMAP hbmp;DWORD cBytes;const VOID* lpBits; +int;SetBitmapDimensionEx;HBITMAP hBitmap;int nWidth;int nHeight;LPSIZE lpSize; +int;SetBkColor;HDC hDC;COLORREF crColor; +int;SetBkMode;HDC hDC;DWORD iBkMode; +int;SetBoundsRect;HDC hDC;const RECT* lprcBounds;DWORD flags; +int;SetBrushOrgEx;HDC hDC;int nXOrg;int nYOrg;LPPOINT lppt; +int;SetColorAdjustment;HDC hdc;const COLORADJUSTMENT* lpca; +int;SetDCBrushColor;HDC hdc;COLORREF crColor; +int;SetDCPenColor;HDC hdc;COLORREF crColor; +int;SetDIBColorTable;HDC hDC;UINT un1;UINT un2;const RGBQUAD* pcRGBQuad; +int;SetDIBits;HDC hDC;HBITMAP hbmp;UINT uStartScan;UINT cScanLines;const VOID* lpvBits;const BITMAPINFO* lpbmi;DWORD fuColorUse; +int;SetDIBitsToDevice;HDC hDC;int XDest;int YDest;DWORD dwWidth;DWORD dwHeight;int XSrc;int YSrc;UINT uStartScan;UINT cScanLines;const VOID* lpvBits;const BITMAPINFO* lpbmi;DWORD fuColorUse; +int;SetEnhMetaFileBits;UINT cbBuffer;const BYTE* lpData; +int;SetGraphicsMode;HDC hDC;DWORD iMode; +int;SetLayout;HDC hdc;DWORD dwLayout; +int;SetMapMode;HDC hDC;DWORD fnMapMode; +int;SetMapperFlags;HDC hDC;DWORD dwFlag; +int;SetMetaFileBitsEx;UINT nSize;const BYTE* lpData; +int;SetMetaRgn;HDC hdc; +int;SetMiterLimit;HDC hDC;FLOAT eNewLimit;PFLOAT peOldLimit; +int;SetPaletteEntries;HPALETTE hpal;UINT iStart;UINT cEntries;const PALETTEENTRY* lppe; +int;SetPixel;HDC hDC;int X;int Y;COLORREF crColor; +int;SetPixelFormat;HDC hdc;int iPixelFormat;const PIXELFORMATDESCRIPTOR* ppfd; +int;SetPixelV;HDC hDC;int X;int Y;COLORREF crColor; +int;SetPolyFillMode;HDC hDC;DWORD iPolyFillMode; +int;SetROP2;HDC hDC;DWORD fnDrawMode2; +int;SetRectRgn;HRGN hrgn;int nLeftRect;int nTopRect;int nRightRect;int nBottomRect; +int;SetStretchBltMode;HDC hDC;DWORD iStretchMode; +int;SetSystemPaletteUse;HDC hdc;UINT uUsage; +int;SetTextAlign;HDC hDC;DWORD fMode; +int;SetTextCharacterExtra;HDC hDC;int nCharExtra; +int;SetTextColor;HDC hDC;COLORREF crColor; +int;SetTextJustification;HDC hDC;int nBreakExtra;int nBreakCount; +int;SetViewportExtEx;HDC hDc;int nXExtent;int nYExtent;LPSIZE lpSize; +int;SetViewportOrgEx;HDC hDC;int X;int Y;LPPOINT lpPoint; +int;SetWinMetaFileBits;UINT nBufferSize;const BYTE* lpbBuffer;HDC hdcRef;const METAFILEPICT* lpmfp; +int;SetWindowExtEx;HDC hDC;int nXExtent;int nYExtent;LPSIZE lpSize; +int;SetWindowOrgEx;HDC hDC;int X;int Y;LPPOINT lpPoint; +int;SetWorldTransform;HDC hDC;const XFORM* lpXform; +int;StartDoc;HDC hdc;const DOCINFO* lpdi; +int;StartDocA;HDC hDC;const DOCINFO* lpdi; +int;StartDocW;HDC hDC;const DOCINFO* lpdi; +int;StartPage;HDC hDC; +int;StretchBlt;HDC hdcDest;int nXOriginDest;int nYOriginDest;int nWidthDest;int nHeightDest;HDC hdcSrc;int nXOriginSrc;int nYOriginSrc;int nWidthSrc;int nHeightSrc;DWORD dwRop; +int;StretchDIBits;HDC hDC;int XDest;int YDest;int nDestWidth;int nDestHeight;int XSrc;int YSrc;int nSrcWidth;int nSrcHeight;const VOID* lpBits;const BITMAPINFO* lpBitsInf;DWORD iUsage;DWORD dwRop; +int;StrokeAndFillPath;HDC hDC; +int;StrokePath;HDC hDC; +int;SwapBuffers;HDC hdc; +int;TextOut;HDC hdc;int nXStart;int nYStart;LPCTSTR lpString;int cbString; +int;TextOutA;HDC hDC;int nXStart;int nYStart;LPCTSTR lpString;int cbString; +int;TextOutW;HDC hDC;int nXStart;int nYStart;LPCTSTR lpString;int cbString; +int;TranslateCharsetInfo;DWORD* lpSrc;LPCHARSETINFO lpCharsetInfo;DWORD dwFlags; +int;UnrealizeObject;HGDIOBJ hgdiobj; +int;UpdateColors;HDC hdc; +int;WidenPath;HDC hDC; +HPEN;CreatePen;int fnPenStyle;int nWidth;COLORREF crColor; \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/kernel32.txt b/x64_dbg_gui/Project/Data/kernel32.txt index 94731120..1876bb30 100644 --- a/x64_dbg_gui/Project/Data/kernel32.txt +++ b/x64_dbg_gui/Project/Data/kernel32.txt @@ -1,1047 +1,1047 @@ -int AcquireSRWLockExclusive(PSRWLOCK SRWLock); -int AcquireSRWLockShared(PSRWLOCK SRWLock); -int ActivateActCtx(HANDLE hActCtx,ULONG_PTR* lpCookie); -int AddAtom(LPCTSTR lpString); -int AddAtomA(LPCTSTR lpString); -int AddAtomW(LPCTSTR lpString); -int AddConsoleAlias(LPCTSTR Source,LPCTSTR Target,LPCTSTR ExeName); -int AddRefActCtx(HANDLE hActCtx); -int AddSIDToBoundaryDescriptor(HANDLE* BoundaryDescriptor,PSID RequiredSid); -int AddSecureMemoryCacheCallback(PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack); -int AddVectoredContinueHandler(ULONG FirstHandler,PVECTORED_EXCEPTION_HANDLER VectoredHandler); -int AddVectoredExceptionHandler(ULONG FirstHandler,PVECTORED_EXCEPTION_HANDLER VectoredHandler); -int AdjustCalendarDate(LPCALDATETIME lpCalDateTime,CALDATETIME_DATEUNIT calUnit,INT amount); -int AllocConsole(); -int AllocateUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); -int AllocateUserPhysicalPagesNuma(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR PageArray,DWORD nndPreferred); -int ApplicationRecoveryFinished(BOOL bSuccess); -int ApplicationRecoveryInProgress(PBOOL pbCanceled); -int AreFileApisANSI(); -int AssignProcessToJobObject(HANDLE hJob,HANDLE hProcess); -int AttachConsole(DWORD dwProcessId); -int BackupRead(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,BOOL bAbort,BOOL bProcessSecurity,LPVOID* lpContext); -int BackupSeek(HANDLE hFile,DWORD dwLowBytesToSeek,DWORD dwHighBytesToSeek,LPDWORD lpdwLowByteSeeked,LPDWORD lpdwHighByteSeeked,LPVOID* lpContext); -int BackupWrite(HANDLE hFile,LPBYTE lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,BOOL bAbort,BOOL bProcessSecurity,LPVOID* lpContext); -int Beep(DWORD dwFreq,DWORD dwDuration); -int BeginUpdateResource(LPCTSTR pFileName,BOOL bDeleteExistingResources); -int BindIoCompletionCallback(HANDLE FileHandle,LPOVERLAPPED_COMPLETION_ROUTINE Function,ULONG Flags); -int BuildCommDCB(LPCTSTR lpDef,LPDCB lpDCB); -int BuildCommDCBAndTimeouts(LPCTSTR lpDef,LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts); -int CallbackMayRunLong(PTP_CALLBACK_INSTANCE pci); -int CancelIo(HANDLE hFile); -int CancelIoEx(HANDLE hFile,LPOVERLAPPED lpOverlapped); -int CancelSynchronousIo(HANDLE hThread); -int CancelThreadpoolIo(PTP_IO pio); -int CancelWaitableTimer(HANDLE hTimer); -int ChangeTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); -int CheckNameLegalDOS8Dot3(LPCTSTR lpName,LPSTR lpOemName,DWORD OemNameSize,PBOOL pbNameContainsSpaces,PBOOL pbNameLegal); -int CheckRemoteDebuggerPresent(HANDLE hProcess,PBOOL pbDebuggerPresent); -int ClearCommBreak(HANDLE hFile); -int ClearCommError(HANDLE hFile,LPDWORD lpErrors,LPCOMSTAT lpStat); -int CloseHandle(HANDLE hObject); -int ClosePrivateNamespace(HANDLE Handle,DWORD Flags); -int CloseThreadpool(PTP_POOL ptpp); -int CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg); -int CloseThreadpoolCleanupGroupMembers(PTP_CLEANUP_GROUP ptpcg,BOOL fCancelPendingCallbacks,PVOID pvCleanupContext); -int CloseThreadpoolIo(PTP_IO pio); -int CloseThreadpoolTimer(PTP_TIMER pti); -int CloseThreadpoolWait(PTP_WAIT pwa); -int CloseThreadpoolWork(PTP_WORK pwk); -int CommConfigDialog(LPCTSTR lpszName,HWND hWnd,LPCOMMCONFIG lpCC); -int CompareFileTime(const FILETIME* lpFileTime1,const FILETIME* lpFileTime2); -int CompareString(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); -int CompareStringA(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); -int CompareStringEx(LPCWSTR lpLocaleName,DWORD dwCmpFlags,LPCWSTR lpString1,int cchCount1,LPCWSTR lpString2,int cchCount2,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); -int CompareStringOrdinal(LPCWSTR lpString1,int cchCount1,LPCWSTR lpString2,int cchCount2,BOOL bIgnoreCase); -int CompareStringW(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPCTSTR lpString2,int cchCount2); -int ContinueDebugEvent(DWORD dwProcessId,DWORD dwThreadId,DWORD dwContinueStatus); -int ConvertCalDateTimeToSystemTime(const LPCALDATETIME lpCalDateTime,SYSTEMTIME* lpSysTime); -int ConvertDefaultLocale(LCID Locale); -int ConvertFiberToThread(); -int ConvertSystemTimeToCalDateTime(const SYSTEMTIME lpSysTime,CALID calId,LPCALDATETIME lpCalDateTime); -int ConvertThreadToFiber(LPVOID lpParameter); -int ConvertThreadToFiberEx(LPVOID lpParameter,DWORD dwFlags); -int CopyExtendedContext(PCONTEXT_EX Destination,DWORD ContextFlags,PCONTEXT_EX Source); -int CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); -int CopyFileA(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); -int CopyFileEx(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags); -int CopyFileTransacted(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,LPBOOL pbCancel,DWORD dwCopyFlags,HANDLE hTransaction); -int CopyFileW(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists); -int CreateActCtx(PACTCTX pActCtx); -int CreateActCtxA(PACTCTX actctx); -int CreateActCtxW(PACTCTX actctx); -int CreateBoundaryDescriptor(LPCTSTR Name,ULONG Flags); -int CreateConsoleScreenBuffer(DWORD dwDesiredAccess,DWORD dwShareMode,const SECURITY_ATTRIBUTES* lpSecurityAttributes,DWORD dwFlags,LPVOID lpScreenBufferData); -int CreateDirectory(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateDirectoryA(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES pSecurityAttributes); -int CreateDirectoryEx(LPCTSTR lpTemplateDirectory,LPCTSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateDirectoryTransacted(LPCTSTR lpTemplateDirectory,LPCTSTR lpNewDirectory,LPSECURITY_ATTRIBUTES lpSecurityAttributes,HANDLE hTransaction); -int CreateDirectoryW(LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES pSecurityAttributes); -int CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); -int CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); -int CreateEventEx(LPSECURITY_ATTRIBUTES lpEventAttributes,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); -int CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); -int CreateFiber(SIZE_T dwStackSize,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter); -int CreateFiberEx(SIZE_T dwStackCommitSize,SIZE_T dwStackReserveSize,DWORD dwFlags,LPFIBER_START_ROUTINE lpStartAddress,LPVOID lpParameter); -int CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); -int CreateFileA(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); -int CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); -int CreateFileMappingA(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); -int CreateFileMappingNuma(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName,DWORD nndPreferred); -int CreateFileMappingW(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCTSTR lpName); -int CreateFileTransacted(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile,HANDLE hTransaction,PUSHORT pusMiniVersion,PVOID pExtendedParameter); -int CreateFileW(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile); -int CreateHardLink(LPCTSTR lpFileName,LPCTSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateHardLinkTransacted(LPCTSTR lpFileName,LPCTSTR lpExistingFileName,LPSECURITY_ATTRIBUTES lpSecurityAttributes,HANDLE hTransaction); -int CreateIoCompletionPort(HANDLE FileHandle,HANDLE ExistingCompletionPort,ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThreads); -int CreateJobObject(LPSECURITY_ATTRIBUTES lpJobAttributes,LPCTSTR lpName); -int CreateMailslot(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateMailslotA(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateMailslotW(LPCTSTR lpName,DWORD nMaxMessageSize,DWORD lReadTimeout,LPSECURITY_ATTRIBUTES lpSecurityAttributes); -int CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType); -int CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); -int CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); -int CreateMutexEx(LPSECURITY_ATTRIBUTES lpMutexAttributes,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); -int CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName); -int CreatePrivateNamespace(LPSECURITY_ATTRIBUTES lpPrivateNamespaceAttributes,LPVOID lpBoundaryDescriptor,LPCTSTR lpAliasPrefix); -bool CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); -bool CreateProcessA(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); -bool CreateProcessW(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); -int CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId); -int CreateRemoteThreadEx(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,LPDWORD lpThreadId); -int CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); -int CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); -int CreateSemaphoreEx(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName,DWORD dwFlags,DWORD dwDesiredAccess); -int CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName); -int CreateSymbolicLink(LPTSTR lpSymlinkFileName,LPTSTR lpTargetFileName,DWORD dwFlags); -int CreateSymbolicLinkTransacted(LPTSTR lpSymlinkFileName,LPTSTR lpTargetFileName,DWORD dwFlags,HANDLE hTransaction); -int CreateTapePartition(HANDLE hDevice,DWORD dwPartitionMethod,DWORD dwCount,DWORD dwSize); -HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE dwThreadFunction,LPVOID pThreadParm,DWORD dwCreationFlags,LPDWORD lpThreadId); -int CreateThreadpool(PVOID reserved); -int CreateThreadpoolCleanupGroup(); -int CreateThreadpoolIo(HANDLE fl,PTP_WIN32_IO_CALLBACK pfnio,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); -int CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnti,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); -int CreateThreadpoolWait(PTP_WAIT_CALLBACK pfnwa,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); -int CreateThreadpoolWork(PTP_WORK_CALLBACK pfnwk,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); -int CreateTimerQueue(); -int CreateTimerQueueTimer(PHANDLE phNewTimer,HANDLE TimerQueue,WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,DWORD Flags); -int CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID); -int CreateUmsCompletionList(PUMS_COMPLETION_LIST* UmsCompletionList); -int CreateUmsThreadContext(PUMS_CONTEXT* lpUmsThread); -int CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); -int CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); -int CreateWaitableTimerEx(LPSECURITY_ATTRIBUTES lpTimerAttributes,LPCTSTR lpTimerName,DWORD dwFlags,DWORD dwDesiredAccess); -int CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,BOOL bManualReset,LPCTSTR lpTimerName); -int DeactivateActCtx(DWORD dwFlags,ULONG_PTR ulCookie); -int DebugActiveProcess(DWORD dwProcessId); -int DebugActiveProcessStop(DWORD dwProcessId); -int DebugBreak(); -int DebugBreakProcess(HANDLE Process); -int DebugSetProcessKillOnExit(BOOL KillOnExit); -int DeleteAtom(ATOM nAtom); -int DeleteBoundaryDescriptor(HANDLE BoundaryDescriptor); -int DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -int DeleteFiber(LPVOID lpFiber); -int DeleteFile(LPCTSTR lpFileName); -int DeleteFileA(LPCTSTR lpFileName); -int DeleteFileTransacted(LPCTSTR lpFileName,HANDLE hTransaction); -int DeleteFileW(LPCTSTR lpFileName); -int DeleteProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList); -int DeleteTimerQueue(HANDLE TimerQueue); -int DeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); -int DeleteTimerQueueTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); -int DeleteUmsCompletionList(PUMS_COMPLETION_LIST UmsCompletionList); -int DeleteUmsThreadContext(PUMS_CONTEXT UmsThread); -int DequeueUmsCompletionListItems(PUMS_COMPLETION_LIST UmsCompletionList,DWORD WaitTimeOut,PUMS_CONTEXT* UmsThreadList); -int DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID pOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped); -int DisableThreadLibraryCalls(HMODULE hModule); -int DisassociateCurrentThreadFromCallback(PTP_CALLBACK_INSTANCE pci); -int DnsHostnameToComputerName(LPCTSTR Hostname,LPTSTR ComputerName,LPDWORD nSize); -int DosDateTimeToFileTime(WORD wFatDate,WORD wFatTime,LPFILETIME lpFileTime); -int DuplicateHandle(HANDLE hSourceProcessHandle,HANDLE hSourceHandle,HANDLE hTargetProcessHandle,LPHANDLE pTargetHandle,DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwOptions); -int EmptyWorkingSet(HANDLE hProcess); -int EndUpdateResource(HANDLE hUpdate,BOOL fDiscard); -int EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -int EnterUmsSchedulingMode(PUMS_SCHEDULER_STARTUP_INFO SchedulerStartupInfo); -int EnumCalendarInfo(CALINFO_ENUMPROC pCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); -int EnumCalendarInfoA(CALINFO_ENUMPROC lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); -int EnumCalendarInfoEx(CALINFO_ENUMPROCEX pCalInfoEnumProcEx,LCID Locale,CALID Calendar,CALTYPE CalType); -int EnumCalendarInfoExEx(CALINFO_ENUMPROCEXEX pCalInfoEnumProcExEx,LPCWSTR lpLocaleName,CALID Calendar,LPCWSTR lpReserved,CALTYPE CalType,LPARAM lParam); -int EnumCalendarInfoW(CALINFO_ENUMPROC lpCalInfoEnumProc,LCID Locale,CALID Calendar,CALTYPE CalType); -int EnumDateFormats(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); -int EnumDateFormatsA(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); -int EnumDateFormatsEx(DATEFMT_ENUMPROCEX lpDateFmtEnumProcEx,LCID Locale,DWORD dwFlags); -int EnumDateFormatsExEx(DATEFMT_ENUMPROCEXEX lpDateFmtEnumProcExEx,LPCWSTR lpLocaleName,DWORD dwFlags,LPARAM lParam); -int EnumDateFormatsW(DATEFMT_ENUMPROC lpDateFmtEnumProc,LCID Locale,DWORD dwFlags); -int EnumDeviceDrivers(LPVOID* lpImageBase,DWORD cb,LPDWORD lpcbNeeded); -int EnumLanguageGroupLocales(LANGGROUPLOCALE_ENUMPROC lpLangGroupLocaleEnumProc,LGRPID LanguageGroup,DWORD dwFlags,LONG_PTR lParam); -int EnumPageFiles(PENUM_PAGE_CALLBACK pCallbackRoutine,LPVOID lpContext); -int EnumProcessModules(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded); -int EnumProcessModulesEx(HANDLE hProcess,HMODULE* lphModule,DWORD cb,LPDWORD lpcbNeeded,DWORD dwFilterFlag); -int EnumProcesses(LPVOID pProcessIds,DWORD cb,DWORD* pBytesReturned); -int EnumResourceLanguages(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,ENUMRESLANGPROC lpEnumFunc,LONG_PTR lParam); -int EnumResourceLanguagesEx(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,ENUMRESLANGPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); -int EnumResourceNames(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR lParam); -int EnumResourceNamesA(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR IParam); -int EnumResourceNamesEx(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); -int EnumResourceNamesW(HMODULE hModule,LPCTSTR lpszType,ENUMRESNAMEPROC lpEnumFunc,LONG_PTR IParam); -int EnumResourceTypes(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR lParam); -int EnumResourceTypesA(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR IParam); -int EnumResourceTypesEx(HMODULE hModule,ENUMRESTYPEPROC lpEnumFunc,LONG_PTR lParam,DWORD dwFlags,LANGID LangId); -int EnumSystemCodePages(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); -int EnumSystemCodePagesA(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); -int EnumSystemCodePagesW(CODEPAGE_ENUMPROC lpCodePageEnumProc,DWORD dwFlags); -int EnumSystemFirmwareTables(DWORD FirmwareTableProviderSignature,PVOID pFirmwareTableBuffer,DWORD BufferSize); -int EnumSystemGeoID(GEOCLASS GeoClass,GEOID ParentGeoId,GEO_ENUMPROC lpGeoEnumProc); -int EnumSystemLanguageGroups(LANGUAGEGROUP_ENUMPROC lpLanguageGroupEnumProc,DWORD dwFlags,LONG_PTR lParam); -int EnumSystemLocales(LOCALE_ENUMPROC lpLocaleEnumProc,DWORD dwFlags); -int EnumSystemLocalesA(LOCALE_ENUMPROC pLocaleEnumProc,DWORD dwFlags); -int EnumSystemLocalesEx(LOCALE_ENUMPROCEX lpLocaleEnumProcEx,DWORD dwFlags,LPARAM lParam,LPVOID lpReserved); -int EnumSystemLocalesW(LOCALE_ENUMPROC pLocaleEnumProc,DWORD dwFlags); -int EnumTimeFormats(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); -int EnumTimeFormatsA(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); -int EnumTimeFormatsEx(TIMEFMT_ENUMPROCEX lpTimeFmtEnumProcEx,LPCWSTR lpLocaleName,DWORD dwFlags,LPARAM lParam); -int EnumTimeFormatsW(TIMEFMT_ENUMPROC lpTimeFmtEnumProc,LCID Locale,DWORD dwFlags); -int EraseTape(HANDLE hDevice,DWORD dwEraseType,BOOL bImmediate); -int EscapeCommFunction(HANDLE hFile,DWORD dwFunc); -int ExecuteUmsThread(PUMS_CONTEXT UmsThread); -VOID ExitProcess(UINT uExitCode); -int ExitThread(DWORD uExitCode); -int ExpandEnvironmentStrings(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); -int ExpandEnvironmentStringsA(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); -int ExpandEnvironmentStringsW(LPCTSTR lpSrc,LPTSTR lpDst,DWORD nSize); -int FatalAppExit(UINT uAction,LPCTSTR lpMessageText); -int FatalExit(int ExitCode); -int FileTimeToDosDateTime(const FILETIME* lpFileTime,LPWORD lpFatDate,LPWORD lpFatTime); -int FileTimeToLocalFileTime(const FILETIME* lpFileTime,LPFILETIME lpLocalFileTime); -int FileTimeToSystemTime(const FILETIME* lpFileTime,LPSYSTEMTIME lpSystemTime); -int FillConsoleOutputAttribute(HANDLE hConsoleOutput,WORD wAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten); -int FillConsoleOutputCharacter(HANDLE hConsoleOutput,TCHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); -int FillConsoleOutputCharacterA(HANDLE hConsoleOutput,TCHAR cCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); -int FindActCtxSectionGuid(DWORD dwFlags,const GUID* lpExtensionGuid,DWORD ulSectionId,const GUID* lpGuidToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData); -int FindActCtxSectionString(DWORD dwFlags,const GUID* lpExtensionGuid,DWORD ulSectionId,LPCTSTR lpStringToFind,PACTCTX_SECTION_KEYED_DATA ReturnedData); -int FindAtom(LPCTSTR lpString); -int FindAtomA(LPCTSTR lpString); -int FindAtomW(LPCTSTR lpString); -int FindClose(HANDLE hFindFile); -int FindCloseChangeNotification(HANDLE hChangeHandle); -int FindCloseChangeNotificationA(HANDLE hChangeHandle); -int FindCloseChangeNotificationW(HANDLE hChangeHandle); -int FindFirstChangeNotification(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); -int FindFirstChangeNotificationA(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); -int FindFirstChangeNotificationW(LPCTSTR lpPathName,BOOL bWatchSubtree,DWORD dwNotifyFilter); -int FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); -int FindFirstFileA(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); -int FindFirstFileEx(LPCTSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags); -int FindFirstFileNameTransactedW(LPCWSTR lpFileName,DWORD dwFlags,LPDWORD StringLength,PWCHAR LinkName,HANDLE hTransaction); -int FindFirstFileNameW(LPCWSTR lpFileName,DWORD dwFlags,LPDWORD StringLength,PWCHAR LinkName); -int FindFirstFileTransacted(LPCTSTR lpFileName,FINDEX_INFO_LEVELS fInfoLevelId,LPVOID lpFindFileData,FINDEX_SEARCH_OPS fSearchOp,LPVOID lpSearchFilter,DWORD dwAdditionalFlags,HANDLE hTransaction); -int FindFirstFileW(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); -int FindFirstStreamTransactedW(LPCWSTR lpFileName,STREAM_INFO_LEVELS InfoLevel,LPVOID lpFindStreamData,DWORD dwFlags,HANDLE hTransaction); -int FindFirstStreamW(LPCWSTR lpFileName,STREAM_INFO_LEVELS InfoLevel,LPVOID lpFindStreamData,DWORD dwFlags); -int FindNLSString(LCID Locale,DWORD dwFindNLSStringFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,LPINT pcchFound); -int FindNLSStringEx(LPCWSTR lpLocaleName,DWORD dwFindNLSStringFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,LPINT pcchFound,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); -int FindNextChangeNotification(HANDLE hChangeHandle ); -int FindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); -int FindNextFileA(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); -int FindNextFileNameW(HANDLE hFindStream,LPDWORD StringLength,PWCHAR LinkName); -int FindNextFileW(HANDLE hFindFile,LPWIN32_FIND_DATA lpFindFileData); -int FindNextStreamW(HANDLE hFindStream,LPVOID lpFindStreamData); -int FindResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); -int FindResourceA(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); -int FindResourceEx(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); -int FindResourceExA(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); -int FindResourceExW(HMODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage); -int FindResourceW(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType); -int FindStringOrdinal(DWORD dwFindStringOrdinalFlags,LPCWSTR lpStringSource,int cchSource,LPCWSTR lpStringValue,int cchValue,BOOL bIgnoreCase); -int FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -int FlsFree(DWORD dwFlsIndex); -int FlsGetValue(DWORD dwFlsIndex); -int FlsSetValue(DWORD dwFlsIndex,PVOID lpFlsData); -int FlushConsoleInputBuffer(HANDLE hConsoleInput); -int FlushFileBuffers(HANDLE hFile); -int FlushInstructionCache(HANDLE hProcess,LPCVOID lpBaseAddress,SIZE_T dwSize); -int FlushProcessWriteBuffers(); -int FlushViewOfFile(LPCVOID lpBaseAddress,SIZE_T dwNumberOfBytesToFlush); -int FoldString(DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); -int FormatMessage(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPTSTR lpBuffer,DWORD nSize,va_list* Arguments); -int FormatMessageA(DWORD dwFlags,LPCVOID lpSource,DWORD dwMessageId,DWORD dwLanguageId,LPTSTR lpBuffer,DWORD nSize,va_list* Arguments); -int FreeConsole(); -int FreeEnvironmentStrings(LPTCH lpszEnvironmentBlock); -int FreeEnvironmentStringsA(LPTCH lpszEnvironmentBlock); -int FreeEnvironmentStringsW(LPTCH lpszEnvironmentBlock); -int FreeLibrary(HMODULE hLibModule); -int FreeLibraryAndExitThread(HMODULE hModule,DWORD dwExitCode); -int FreeLibraryWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HMODULE mod); -int FreeResource(HGLOBAL HretResource); -int FreeUserPhysicalPages(HANDLE hProcess,PULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); -int GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,DWORD dwProcessGroupId); -int GetACP(); -int GetActiveProcessorCount(WORD GroupNumber); -int GetActiveProcessorGroupCount(); -int GetApplicationRecoveryCallback(HANDLE hProcess,APPLICATION_RECOVERY_CALLBACK* pRecoveryCallback,PVOID* ppvParameter,DWORD dwPingInterval,DWORD dwFlags); -int GetApplicationRestartSettings(HANDLE hProcess,PWSTR pwzCommandline,PDWORD pcchSize,PDWORD pdwFlags); -int GetAtomName(ATOM nAtom,LPTSTR lpBuffer,int nSize); -int GetAtomNameA(ATOM nAtom,LPTSTR lpBuffer,int nSize); -int GetAtomNameW(ATOM nAtom,LPTSTR lpBuffer,int nSize); -int GetBinaryType(LPCTSTR lpApplicationName,DWORD lpBinaryType); -int GetBinaryTypeA(LPCTSTR lpApplicationName,DWORD lpBinaryType); -int GetBinaryTypeW(LPCTSTR lpApplicationName,DWORD lpBinaryType); -int GetCPInfo(UINT CodePage,LPCPINFO lpCPInfo); -int GetCPInfoEx(UINT CodePage,DWORD dwFlags,LPCPINFOEX lpCPInfoEx); -int GetCalendarDateFormatEx(LPCWSTR lpszLocale,DWORD dwFlags,const LPCALDATETIME lpCalDateTime,LPCWSTR lpFormat,LPWSTR lpDateStr,int cchDate); -int GetCalendarInfo(LCID Locale,CALID Calendar,CALTYPE CalType,LPTSTR lpCalData,int cchData,LPDWORD lpValue); -int GetCalendarInfoEx(LPCWSTR lpLocaleName,CALID Calendar,LPCWSTR lpReserved,CALTYPE CalType,LPWSTR lpCalData,int cchData,LPDWORD lpValue); -int GetCalendarSupportedDateRange(CALID Calendar,LPCALDATETIME lpCalMinDateTime,LPCALDATETIME lpCalMaxDateTime); -int GetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,LPDWORD lpdwSize); -int GetCommMask(HANDLE hFile,LPDWORD lpEvtMask); -int GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat); -int GetCommProperties(HANDLE hFile,LPCOMMPROP lpCommProp); -int GetCommState(HANDLE hFile,LPDCB lpDCB); -int GetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts); -int GetCommandLine(); -int GetCommandLineA(); -int GetCommandLineW(); -int GetCompressedFileSize(LPCTSTR lpFileName,LPDWORD lpFileSizeHigh); -int GetCompressedFileSizeTransacted(LPCTSTR lpFileName,LPDWORD lpFileSizeHigh,HANDLE hTransaction); -int GetComputerName(LPTSTR lpBuffer,LPDWORD lpnSize); -int GetComputerNameA(LPTSTR lpBuffer,LPDWORD nBufferSize); -int GetComputerNameEx(COMPUTER_NAME_FORMAT NameType,LPTSTR lpBuffer,LPDWORD lpnSize); -int GetComputerNameW(LPTSTR lpBuffer,LPDWORD nBufferSize); -int GetConsoleAlias(LPTSTR lpSource,LPTSTR lpTargetBuffer,DWORD TargetBufferLength,LPTSTR lpExeName); -int GetConsoleAliasExes(LPTSTR lpExeNameBuffer,DWORD ExeNameBufferLength); -int GetConsoleAliasExesLength(); -int GetConsoleAliases(LPTSTR lpAliasBuffer,DWORD AliasBufferLength,LPTSTR lpExeName); -int GetConsoleAliasesLength(LPTSTR lpExeName); -int GetConsoleCP(); -int GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo); -int GetConsoleDisplayMode(LPDWORD lpdwMode); -int GetConsoleFontSize(HANDLE hConsoleOutput,DWORD nFont); -int GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); -int GetConsoleMode(HANDLE hConsoleHandle,DWORD lpMode); -int GetConsoleOriginalTitle(LPTSTR lpConsoleTitle,DWORD nSize); -int GetConsoleOutputCP(); -int GetConsoleProcessList(LPDWORD lpdwProcessList,DWORD dwProcessCount); -int GetConsoleScreenBufferInfo(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); -int GetConsoleScreenBufferInfoEx(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); -int GetConsoleSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo); -int GetConsoleTitle(LPTSTR lpConsoleTitle,DWORD nSize); -int GetConsoleWindow(); -int GetCurrencyFormat(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); -int GetCurrencyFormatA(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); -int GetCurrencyFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,LPCWSTR lpValue,const CURRENCYFMT* lpFormat,LPWSTR lpCurrencyStr,int cchCurrency); -int GetCurrencyFormatW(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const CURRENCYFMT* lpFormat,LPTSTR lpCurrencyStr,int cchCurrency); -int GetCurrentActCtx(HANDLE* lphActCtx); -int GetCurrentConsoleFont(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFO lpConsoleCurrentFont); -int GetCurrentConsoleFontEx(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); -int GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer); -int GetCurrentDirectoryA(DWORD nBufferSize,LPTSTR lpBuffer); -int GetCurrentDirectoryW(DWORD nBufferSize,LPTSTR lpBuffer); -int GetCurrentProcess(); -int GetCurrentProcessId(); -int GetCurrentProcessorNumber(); -int GetCurrentProcessorNumberEx(PPROCESSOR_NUMBER ProcNumber); -int GetCurrentThread(); -int GetCurrentThreadId(); -int GetCurrentUmsThread(); -int GetDateFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); -int GetDateFormatA(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); -int GetDateFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCWSTR lpFormat,LPWSTR lpDateStr,int cchDate,LPCWSTR lpCalendar); -int GetDateFormatW(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDate,LPCTSTR lpFormat,LPTSTR lpDateStr,int cchDate); -int GetDefaultCommConfig(LPCTSTR lpszName,LPCOMMCONFIG lpCC,LPDWORD lpdwSize); -int GetDeviceDriverBaseName(LPVOID ImageBase,LPTSTR lpBaseName,DWORD nSize); -int GetDeviceDriverFileName(LPVOID ImageBase,LPTSTR lpFilename,DWORD nSize); -int GetDevicePowerState(HANDLE hDevice,BOOL* pfOn); -int GetDiskFreeSpace(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); -int GetDiskFreeSpaceA(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); -int GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailable,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); -int GetDiskFreeSpaceExA(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); -int GetDiskFreeSpaceExW(LPCTSTR lpDirectoryName,PULARGE_INTEGER lpFreeBytesAvailableToCaller,PULARGE_INTEGER lpTotalNumberOfBytes,PULARGE_INTEGER lpTotalNumberOfFreeBytes); -int GetDiskFreeSpaceW(LPCTSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters); -int GetDllDirectory(DWORD nBufferLength,LPTSTR lpBuffer); -int GetDurationFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpDuration,ULONGLONG ullDuration,LPCWSTR lpFormat,LPWSTR lpDurationStr,int cchDuration); -int GetDurationFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpDuration,ULONGLONG ullDuration,LPCWSTR lpFormat,LPWSTR lpDurationStr,int cchDuration); -int GetDynamicTimeZoneInformation(PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation); -int GetEnabledExtendedFeatures(DWORD64 FeatureMask); -int GetEnvironmentStrings(); -int GetEnvironmentStringsW(); -int GetEnvironmentVariable(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nSize); -int GetEnvironmentVariableA(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nBufferSize); -int GetEnvironmentVariableW(LPCTSTR lpName,LPTSTR lpBuffer,DWORD nBufferSize); -int GetErrorMode(); -int GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode); -int GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode); -int GetExtendedContextLength(DWORD ContextFlags,PDWORD ContextLength); -int GetExtendedFeaturesMask(PCONTEXT_EX ContextEx); -int GetFileAttributes(LPCTSTR lpFileName); -int GetFileAttributesA(LPCTSTR lpFileName); -int GetFileAttributesEx(LPCTSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation); -int GetFileAttributesTransacted(LPCTSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation,HANDLE hTransaction); -int GetFileAttributesW(LPCTSTR lpFileName); -int GetFileBandwidthReservation(HANDLE hFile,LPDWORD lpPeriodMilliseconds,LPDWORD lpBytesPerPeriod,LPBOOL pDiscardable,LPDWORD lpTransferSize,LPDWORD lpNumOutstandingRequests); -int GetFileInformationByHandle(HANDLE hFile,LPBY_HANDLE_FILE_INFORMATION lpFileInformation); -int GetFileInformationByHandleEx(HANDLE hFile,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,LPVOID lpFileInformation,DWORD dwBufferSize); -int GetFileSize(HANDLE hFile,LPDWORD lpFileSizeHigh); -int GetFileSizeEx(HANDLE hFile,PLARGE_INTEGER lpFileSize); -int GetFileTime(HANDLE hFile,LPFILETIME lpCreationTime,LPFILETIME lpLastAccessTime,LPFILETIME lpLastWriteTime); -int GetFileType(HANDLE hFile); -int GetFinalPathNameByHandle(HANDLE hFile,LPTSTR lpszFilePath,DWORD cchFilePath,DWORD dwFlags); -int GetFirmwareEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpGuid,PVOID pBuffer,DWORD nSize); -int GetFullPathName(LPCTSTR lpFileName,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart); -int GetFullPathNameA(LPCTSTR lpFileName,DWORD nBufferSize,LPTSTR lpBuffer,LPTSTR* lpFilePart); -int GetFullPathNameTransacted(LPCTSTR lpFileName,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart,HANDLE hTransaction); -int GetFullPathNameW(LPCTSTR lpFileName,DWORD nBufferSize,LPTSTR lpBuffer,LPTSTR* lpFilePart); -int GetGeoInfo(GEOID Location,GEOTYPE GeoType,LPTSTR lpGeoData,int cchData,LANGID LangId); -int GetHandleInformation(HANDLE hObject,LPDWORD lpdwFlags); -int GetLargePageMinimum(); -int GetLargestConsoleWindowSize(HANDLE hConsoleOutput); -int GetLastError(); -int GetLocalTime(LPSYSTEMTIME lpSystemTime); -int GetLocaleInfo(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); -int GetLocaleInfoA(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); -int GetLocaleInfoEx(LPCWSTR lpLocaleName,LCTYPE LCType,LPWSTR lpLCData,int cchData); -int GetLocaleInfoW(LCID Locale,LCTYPE LCType,LPTSTR lpLCData,int cchData); -int GetLogicalProcessorInformation(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,PDWORD ReturnLength); -int GetLogicalProcessorInformationEx(LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer,PDWORD ReturnedLength); -int GetLongPathName(LPCTSTR lpszShortPath,LPTSTR lpszLongPath,DWORD cchBuffer); -int GetLongPathNameA(LPCTSTR lpszShortPath,LPTSTR lpBuffer,DWORD nBuffer); -int GetLongPathNameTransacted(LPCTSTR lpszShortPath,LPTSTR lpszLongPath,DWORD cchBuffer,HANDLE hTransaction); -int GetLongPathNameW(LPCTSTR lpszShortPath,LPTSTR lpBuffer,DWORD nBuffer); -int GetMailslotInfo(HANDLE hMailslot,LPDWORD lpMaxMessageSize,LPDWORD lpNextSize,LPDWORD lpMessageCount,LPDWORD lpReadTimeout); -int GetMappedFileName(HANDLE hProcess,LPVOID lpv,LPTSTR lpFilename,DWORD nSize); -int GetMaximumProcessorCount(WORD GroupNumber); -int GetMaximumProcessorGroupCount(); -int GetModuleBaseName(HANDLE hProcess,HMODULE hModule,LPTSTR lpBaseName,DWORD nSize); -int GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize); -int GetModuleFileNameA(HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); -int GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize); -int GetModuleFileNameExA(HANDLE hProcess,HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); -int GetModuleFileNameExW(HANDLE hProcess,HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); -int GetModuleFileNameW(HMODULE hModule,LPTSTR lpBuffer,DWORD nBufferSize); -int GetModuleHandle(LPCTSTR lpModuleName); -int GetModuleHandleA(LPCTSTR lpModuleName); -int GetModuleHandleEx(DWORD dwFlags,LPCTSTR lpModuleName,HMODULE* phModule); -int GetModuleHandleW(LPCTSTR lpModuleName); -int GetModuleInformation(HANDLE hProcess,HMODULE hModule,LPMODULEINFO lpmodinfo,DWORD dwSizemodinfo); -int GetNLSVersion(NLS_FUNCTION Function,LCID Locale,LPNLSVERSIONINFO lpVersionInformation); -int GetNLSVersionEx(NLS_FUNCTION function,LPCWSTR lpLocaleName,LPNLSVERSIONINFOEX lpVersionInformation); -int GetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo); -int GetNextUmsListItem(PUMS_CONTEXT UmsContext); -int GetNumaAvailableMemoryNode(UCHAR Node,PULONGLONG AvailableBytes); -int GetNumaAvailableMemoryNodeEx(USHORT Node,PULONGLONG AvailableBytes); -int GetNumaHighestNodeNumber(PULONG HighestNodeNumber); -int GetNumaNodeNumberFromHandle(HANDLE hFile,PUSHORT NodeNumber); -int GetNumaNodeProcessorMask(UCHAR Node,PULONGLONG ProcessorMask); -int GetNumaNodeProcessorMaskEx(USHORT Node,PGROUP_AFFINITY ProcessorMask); -int GetNumaProcessorNode(UCHAR Processor,PUCHAR NodeNumber); -int GetNumaProcessorNodeEx(PPROCESSOR_NUMBER Processor,PUSHORT NodeNumber); -int GetNumaProximityNode(ULONG ProximityId,PUCHAR NodeNumber); -int GetNumaProximityNodeEx(ULONG ProximityId,PUSHORT NodeNumber); -int GetNumberFormat(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); -int GetNumberFormatA(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); -int GetNumberFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,LPCWSTR lpValue,const NUMBERFMT* lpFormat,LPWSTR lpNumberStr,int cchNumber); -int GetNumberFormatW(LCID Locale,DWORD dwFlags,LPCTSTR lpValue,const NUMBERFMT* lpFormat,LPTSTR lpNumberStr,int cchNumber); -int GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,LPDWORD lpcNumberOfEvents); -int GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons); -int GetOEMCP(); -int GetOverlappedResult(HANDLE hFile,LPOVERLAPPED lpOverlapped,LPDWORD lpNumberOfBytesTransferred,BOOL bWait); -int GetPerformanceInfo(PPERFORMANCE_INFORMATION pPerformanceInformation,DWORD cb); -int GetPhysicallyInstalledSystemMemory(PULONGLONG TotalMemoryInKilobytes); -int GetPriorityClass(HANDLE hProcess); -int GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); -int GetPrivateProfileIntA(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); -int GetPrivateProfileIntW(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); -int GetPrivateProfileSection(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileSectionA(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileSectionW(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpBuffer,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpBuffer,DWORD nSize,LPCTSTR lpFileName); -int GetPrivateProfileStruct(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); -int GetPrivateProfileStructA(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); -int GetProcAddress(HMODULE hModule,LPCSTR lpProcName); -int GetProcessAffinityMask(HANDLE hProcess,PDWORD_PTR lpProcessAffinityMask,PDWORD_PTR lpSystemAffinityMask); -int GetProcessDEPPolicy(HANDLE hProcess,LPDWORD lpFlags,PBOOL lpPermanent); -int GetProcessGroupAffinity(HANDLE hProcess,PUSHORT GroupCount,PUSHORT GroupArray); -int GetProcessHandleCount(HANDLE hProcess,PDWORD pdwHandleCount); -int GetProcessHeap(); -int GetProcessHeaps(DWORD NumberOfHeaps,PHANDLE ProcessHeaps); -int GetProcessId(HANDLE Process); -int GetProcessIdOfThread(HANDLE Thread); -int GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize); -int GetProcessIoCounters(HANDLE hProcess,PIO_COUNTERS lpIoCounters); -int GetProcessMemoryInfo(HANDLE Process,PPROCESS_MEMORY_COUNTERS ppsmemCounters,DWORD cb); -int GetProcessPriorityBoost(HANDLE hProcess,PBOOL pDisablePriorityBoost); -int GetProcessShutdownParameters(LPDWORD lpdwLevel,LPDWORD lpdwFlags); -int GetProcessTimes(HANDLE hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); -int GetProcessVersion(DWORD ProcessId); -int GetProcessWorkingSetSize(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize); -int GetProcessWorkingSetSizeEx(HANDLE hProcess,PSIZE_T lpMinimumWorkingSetSize,PSIZE_T lpMaximumWorkingSetSize,PDWORD Flags); -int GetProcessorSystemCycleTime(USHORT Group,PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION Buffer,PDWORD ReturnedLength); -int GetProductInfo(DWORD dwOSMajorVersion,DWORD dwOSMinorVersion,DWORD dwSpMajorVersion,DWORD dwSpMinorVersion,DWORD pdwReturnedProductType); -UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); -UINT GetProfileIntA(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); -UINT GetProfileIntW(LPCTSTR lpAppName,LPCWSTR lpKeyName,INT nDefault); -int GetProfileSection(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); -int GetProfileSectionA(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); -int GetProfileSectionW(LPCTSTR lpAppName,LPTSTR lpReturnedString,DWORD nSize); -int GetProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); -int GetProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); -int GetProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize); -int GetQueuedCompletionStatus(HANDLE CompletionPort,LPDWORD lpNumberOfBytes,PULONG_PTR lpCompletionKey,LPOVERLAPPED* lpOverlapped,DWORD dwMilliseconds); -int GetQueuedCompletionStatusEx(HANDLE CompletionPort,LPOVERLAPPED_ENTRY lpCompletionPortEntries,ULONG ulCount,PULONG ulNumEntriesRemoved,DWORD dwMilliseconds,BOOL fAlertable); -int GetShortPathName(LPCTSTR lpszLongPath,LPTSTR lpszShortPath,DWORD cchBuffer); -int GetShortPathNameA(LPCTSTR lpszLongPath,LPTSTR lpBuffer,DWORD cchBuffer); -int GetShortPathNameW(LPCTSTR lpszLongPath,LPTSTR lpBuffer,DWORD cchBuffer); -int GetStartupInfo(LPSTARTUPINFO lpStartupInfo); -int GetStartupInfoA(LPSTARTUPINFO lpStartupInfo); -int GetStartupInfoW(LPSTARTUPINFO lpStartupInfo); -int GetStdHandle(DWORD nStdHandle); -int GetStringScripts(DWORD dwFlags,LPCWSTR lpString,int cchString,LPWSTR lpScripts,int cchScripts); -int GetStringTypeA(LCID Locale,DWORD dwInfoType,LPCSTR lpSrcStr,int cchSrc,LPWORD lpCharType); -int GetStringTypeEx(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); -int GetStringTypeExA(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); -int GetStringTypeExW(LCID Locale,DWORD dwInfoType,LPCTSTR lpSrcStr,int cchSrc,LPWORD lpCharType); -int GetStringTypeW(DWORD Locale,LPCWSTR dwInfoType,int lpSrcStr,LPWORD cchSrc,LPWORD lpCharType); -int GetSystemDEPPolicy(); -int GetSystemDefaultLCID(); -int GetSystemDefaultLangID(); -int GetSystemDefaultLocaleName(LPWSTR lpLocaleName,int cchLocaleName); -int GetSystemDirectory(LPTSTR lpBuffer,UINT uSize); -int GetSystemDirectoryA(LPTSTR lpBuffer,UINT nBufferSize); -int GetSystemDirectoryW(LPTSTR lpBuffer,UINT nBufferSize); -int GetSystemFileCacheSize(PSIZE_T lpMinimumFileCacheSize,PSIZE_T lpMaximumFileCacheSize,PDWORD lpFlags); -int GetSystemFirmwareTable(DWORD FirmwareTableProviderSignature,DWORD FirmwareTableID,PVOID pFirmwareTableBuffer,DWORD BufferSize); -int GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); -int GetSystemPowerStatus(LPSYSTEM_POWER_STATUS lpSystemPowerStatus); -int GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,PDWORD pdwQuotaUsed); -int GetSystemTime(LPSYSTEMTIME lpSystemTime); -int GetSystemTimeAdjustment(PDWORD lpTimeAdjustment,PDWORD lpTimeIncrement,PBOOL lpTimeAdjustmentDisabled); -int GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); -int GetSystemTimes(LPFILETIME lpIdleTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); -int GetSystemWindowsDirectory(LPTSTR lpBuffer,UINT uSize); -int GetSystemWow64Directory(LPTSTR lpBuffer,UINT uSize); -int GetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPDWORD lpdwSize,LPVOID lpTapeInformation); -int GetTapePosition(HANDLE hDevice,DWORD dwPositionType,LPDWORD lpdwPartition,LPDWORD lpdwOffsetLow,LPDWORD lpdwOffsetHigh); -int GetTapeStatus(HANDLE hDevice); -int GetTempFileName(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); -int GetTempFileNameA(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); -int GetTempFileNameW(LPCTSTR lpPathName,LPCTSTR lpPrefixString,UINT uUnique,LPTSTR lpTempFileName); -int GetTempPath(DWORD nBufferLength,LPTSTR lpBuffer); -int GetTempPathA(DWORD nBufferSize,LPTSTR lpBuffer); -int GetTempPathW(DWORD nBufferSize,LPTSTR lpBuffer); -int GetThreadContext(HANDLE hThread,LPCONTEXT lpContext); -int GetThreadErrorMode(); -int GetThreadGroupAffinity(HANDLE hThread,PGROUP_AFFINITY GroupAffinity); -int GetThreadIOPendingFlag(HANDLE hThread,PBOOL lpIOIsPending); -int GetThreadId(HANDLE Thread); -int GetThreadIdealProcessorEx(HANDLE hThread,PPROCESSOR_NUMBER lpIdealProcessor); -int GetThreadLocale(); -int GetThreadPriority(HANDLE hThread); -int GetThreadPriorityBoost(HANDLE hThread,PBOOL pDisablePriorityBoost); -int GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,LPLDT_ENTRY lpSelectorEntry); -int GetThreadTimes(HANDLE hThread,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime); -int GetTickCount(); -int GetTickCount64(); -int GetTimeFormat(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); -int GetTimeFormatA(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); -int GetTimeFormatEx(LPCWSTR lpLocaleName,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCWSTR lpFormat,LPWSTR lpTimeStr,int cchTime); -int GetTimeFormatW(LCID Locale,DWORD dwFlags,const SYSTEMTIME* lpTime,LPCTSTR lpFormat,LPTSTR lpTimeStr,int cchTime); -int GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation); -int GetTimeZoneInformationForYear(USHORT wYear,PDYNAMIC_TIME_ZONE_INFORMATION pdtzi,LPTIME_ZONE_INFORMATION ptzi); -int GetUmsCompletionListEvent(PUMS_COMPLETION_LIST UmsCompletionList,PHANDLE UmsCompletionEvent); -int GetUserDefaultLCID(); -int GetUserDefaultLangID(); -int GetUserDefaultLocaleName(LPWSTR lpLocaleName,int cchLocaleName); -int GetUserGeoID(GEOCLASS GeoClass); -int GetVersion(); -bool GetVersionEx(LPOSVERSIONINFO lpVersionInfo); -bool GetVersionExA(LPOSVERSIONINFO lpVersionInformation); -bool GetVersionExW(LPOSVERSIONINFO lpVersionInformation); -int GetWindowsDirectory(LPTSTR lpBuffer,UINT uSize); -int GetWindowsDirectoryA(LPTSTR lpBuffer,UINT nBufferSize); -int GetWindowsDirectoryW(LPTSTR lpBuffer,UINT nBufferSize); -int GetWriteWatch(DWORD dwFlags,PVOID lpBaseAddress,SIZE_T dwRegionSize,PVOID* lpAddresses,PULONG_PTR lpdwCount,PULONG lpdwGranularity); -int GetWsChanges(HANDLE hProcess,PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,DWORD cb); -int GetWsChangesEx(HANDLE hProcess,PPSAPI_WS_WATCH_INFORMATION_EX lpWatchInfoEx,DWORD cb); -int GlobalAddAtom(LPCTSTR lpString); -int GlobalAddAtomA(LPCTSTR lpString); -int GlobalAddAtomW(LPCTSTR lpString); -int GlobalAlloc(UINT uFlags,SIZE_T dwBytes); -int GlobalDeleteAtom(ATOM nAtom); -int GlobalFindAtom(LPCTSTR lpString); -int GlobalFindAtomA(LPCTSTR AtomName); -int GlobalFindAtomW(LPCTSTR AtomName); -int GlobalFlags(HGLOBAL hMem); -int GlobalFree(HGLOBAL hMem); -int GlobalGetAtomName(ATOM nAtom,LPTSTR lpBuffer,int nSize); -int GlobalGetAtomNameA(ATOM nAtom,LPTSTR lpBuffer,int nBufferSize); -int GlobalGetAtomNameW(ATOM nAtom,LPTSTR lpBuffer,int nBufferSize); -int GlobalHandle(LPCVOID hMem); -int GlobalLock(HGLOBAL hMem); -int GlobalMemoryStatus(LPMEMORYSTATUS lpMemBuffer); -int GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); -int GlobalReAlloc(HGLOBAL hMem,SIZE_T dwBytes,UINT uFlags); -int GlobalSize(HGLOBAL hMem); -int GlobalUnlock(HGLOBAL hMem); -int Heap32First(LPHEAPENTRY32 lphe,DWORD th32ProcessID,ULONG_PTR th32HeapID); -int Heap32ListFirst(HANDLE hSnapshot,LPHEAPLIST32 lphl); -int Heap32ListNext(HANDLE hSnapshot,LPHEAPLIST32 lphl); -int Heap32Next(LPHEAPENTRY32 lphe); -int HeapAlloc(HANDLE hHeap,DWORD Flags,SIZE_T HeapSize); -int HeapCompact(HANDLE hHeap,DWORD dwFlags); -int HeapCreate(DWORD flOptions,SIZE_T dwInitialSize,SIZE_T dwMaximumSize); -int HeapDestroy(HANDLE hHeap); -int HeapFree(HANDLE hHeap); -int HeapLock(HANDLE hHeap); -int HeapQueryInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength,PSIZE_T ReturnLength); -int HeapReAlloc(HANDLE hHeap,DWORD Flags,LPVOID pMemory,SIZE_T NewSize); -int HeapSetInformation(HANDLE HeapHandle,HEAP_INFORMATION_CLASS HeapInformationClass,PVOID HeapInformation,SIZE_T HeapInformationLength); -int HeapSize(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem); -int HeapUnlock(HANDLE hHeap); -int HeapValidate(HANDLE hHeap,DWORD dwFlags,LPCVOID lpMem); -int HeapWalk(HANDLE hHeap,LPPROCESS_HEAP_ENTRY lpEntry); -int InitAtomTable(DWORD nSize); -int InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce,DWORD dwFlags,PBOOL fPending,LPVOID* lpContext); -int InitOnceComplete(LPINIT_ONCE lpInitOnce,DWORD dwFlags,LPVOID lpContext); -int InitOnceExecuteOnce(PINIT_ONCE InitOnce,PINIT_ONCE_FN InitFn,PVOID Parameter,LPVOID* Context); -int InitOnceInitialize(PINIT_ONCE InitOnce); -int InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable); -int InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -int InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection); -int InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount,DWORD Flags); -int InitializeExtendedContext(PVOID Context,DWORD ContextFlags,PCONTEXT_EX* ContextEx); -int InitializeProcThreadAttributeList(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,DWORD dwAttributeCount,DWORD dwFlags,PSIZE_T lpSize); -int InitializeProcessForWsWatch(HANDLE hProcess); -int InitializeSListHead(PSLIST_HEADER ListHead); -int InitializeSRWLock(PSRWLOCK SRWLock); -int InterlockedCompareExchange(LONG volatile* Destination,LONG Exchange,LONG Comperand); -int InterlockedCompareExchange64(LONGLONG volatile* Destination,LONGLONG Exchange,LONGLONG Comparand); -int InterlockedDecrement(LONG volatile* lpAddend); -int InterlockedExchange(DWORD Target,DWORD Value); -int InterlockedExchange(LONG volatile* Target,LONG Value); -int InterlockedExchangeAdd(LONG volatile* Addend,LONG Increment); -int InterlockedFlushSList(PSLIST_HEADER ListHead); -int InterlockedIncrement(LONG volatile* lpAddend); -int InterlockedPopEntrySList(PSLIST_HEADER ListHead); -int InterlockedPushEntrySList(PSLIST_HEADER ListHead,PSLIST_ENTRY ListEntry); -int IsBadCodePtr(FARPROC lpfn); -int IsBadReadPtr(const VOID* lp,UINT_PTR ucb); -int IsBadStringPtr(LPCTSTR lpsz,UINT_PTR ucchMax); -int IsBadStringPtrA(LPCTSTR lpsz,UINT_PTR ucchMax); -int IsBadStringPtrW(LPCTSTR lpsz,UINT_PTR ucchMax); -int IsBadWritePtr(LPVOID lp,UINT_PTR ucb); -int IsCalendarLeapYear(CALID calId,UINT year,UINT era); -int IsDBCSLeadByte(BYTE TestChar); -int IsDBCSLeadByteEx(UINT CodePage,BYTE TestChar); -int IsDebuggerPresent(); -int IsNLSDefinedString(NLS_FUNCTION Function,DWORD dwFlags,LPNLSVERSIONINFO lpVersionInformation,LPCWSTR lpString,INT cchStr); -int IsProcessInJob(HANDLE ProcessHandle,HANDLE JobHandle,PBOOL Result); -int IsProcessorFeaturePresent(DWORD ProcessorFeature); -int IsSystemResumeAutomatic(); -int IsThreadAFiber(); -int IsThreadpoolTimerSet(PTP_TIMER pti); -int IsValidCodePage(UINT CodePage); -int IsValidLanguageGroup(LGRPID LanguageGroup,DWORD dwFlags); -int IsValidLocale(LCID Locale,DWORD dwFlags); -int IsValidLocaleName(LPCWSTR lpLocaleName); -int IsWow64Process(HANDLE hProcess,PBOOL Wow64Process); -int LCIDToLocaleName(LCID Locale,LPWSTR lpName,int cchName,DWORD dwFlags); -int LCMapString(LCID Locale,DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); -int LCMapStringA(LCID Locale,DWORD dwCmpFlags,LPCTSTR lpString1,int cchCount1,LPTSTR lpString2,int cchCount2); -int LCMapStringEx(LPCWSTR lpLocaleName,DWORD dwMapFlags,LPCWSTR lpSrcStr,int cchSrc,LPWSTR lpDestStr,int cchDest,LPNLSVERSIONINFO lpVersionInformation,LPVOID lpReserved,LPARAM lParam); -int LCMapStringW(LCID Locale,DWORD dwMapFlags,LPCTSTR lpSrcStr,int cchSrc,LPTSTR lpDestStr,int cchDest); -int LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -int LeaveCriticalSectionWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,PCRITICAL_SECTION pcs); -int LoadLibrary(LPCTSTR lpFileName); -int LoadLibraryA(LPCTSTR lpLibFileName); -int LoadLibraryEx(LPCTSTR lpFileName,HANDLE hFile,DWORD dwFlags); -int LoadLibraryExA(LPCTSTR pLibFileName,HANDLE hFile,DWORD dwFlags); -int LoadLibraryExW(LPCTSTR pLibFileName,HANDLE hFile,DWORD dwFlags); -int LoadLibraryW(LPCTSTR lpLibFileName); -int LoadModule(LPCSTR lpModuleName,LPVOID lpParameterBlock); -int LoadResource(HMODULE hModule,HRSRC hResInfo); -HLOCAL LocalAlloc(UINT uFlags,SIZE_T uBytes); -int LocalFileTimeToFileTime(const FILETIME* lpLocalFileTime,LPFILETIME lpFileTime); -int LocalFlags(HLOCAL hMem); -int LocalFree(HLOCAL hMem); -int LocalHandle(LPCVOID pMem); -int LocalLock(HLOCAL hMem); -HLOCAL LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags); -int LocalSize(HLOCAL hMem); -int LocalUnlock(HLOCAL hMem); -int LocaleNameToLCID(LPCWSTR lpName,DWORD dwFlags); -int LocateExtendedFeature(PCONTEXT_EX ContextEx,DWORD FeatureId,PDWORD Length); -int LocateLegacyContext(PCONTEXT_EX ContextEx,PDWORD Length); -int LockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh); -int LockFileEx(HANDLE hFile,DWORD dwFlags,DWORD dwReserved,DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh,LPOVERLAPPED lpOverlapped); -int LockResource(HGLOBAL hResInfo); -int MapUserPhysicalPages(PVOID lpAddress,ULONG_PTR NumberOfPages,PULONG_PTR UserPfnArray); -int MapUserPhysicalPagesScatter(PVOID* VirtualAddresses,ULONG_PTR NumberOfPages,PULONG_PTR PageArray); -int MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap); -int MapViewOfFileEx(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap,LPVOID lpBaseAddress); -int MapViewOfFileExNuma(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap,LPVOID lpBaseAddress,DWORD nndPreferred); -int Module32First(HANDLE hModuleSnap,LPMODULEENTRY32 lpme); -int Module32FirstW(HANDLE hSnapshot,LPMODULEENTRY32 lpme); -int Module32Next(HANDLE hModuleSnap,LPMODULEENTRY32 lpme); -int Module32NextW(HANDLE hSnapshot,LPMODULEENTRY32 lpme); -int MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); -int MoveFileA(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); -int MoveFileEx(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwFlags); -int MoveFileTransacted(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags,HANDLE hTransaction); -int MoveFileW(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); -int MoveFileWithProgress(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine,LPVOID lpData,DWORD dwFlags); -int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpwcBuffer,int nBuffer); -int NeedCurrentDirectoryForExePath(LPCTSTR ExeName); -int OpenEvent(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenEventA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenEventW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenFile(LPCSTR lpFileName,LPOFSTRUCT lpReOpenBuff,DWORD uStyle); -int OpenFileById(HANDLE hFile,LPFILE_ID_DESCRIPTOR lpFileID,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwFlags); -int OpenFileMapping(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenFileMappingA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenFileMappingW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenJobObject(DWORD dwDesiredAccess,BOOL bInheritHandles,LPCTSTR lpName); -int OpenMutex(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenMutexA(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenMutexW(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenPrivateNamespace(LPVOID lpBoundaryDescriptor,LPCTSTR lpAliasPrefix); -int OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId); -int OpenSemaphore(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName); -int OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId); -int OpenWaitableTimer(DWORD dwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpTimerName); -int OutputDebugString(LPCTSTR lpOutputString); -int OutputDebugStringA(LPCTSTR lpOutputString); -int OutputDebugStringW(LPCTSTR lpOutputString); -int PeekConsoleInput(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead); -int PostQueuedCompletionStatus(HANDLE CompletionPort,DWORD dwNumberOfBytesTransferred,ULONG_PTR dwCompletionKey,LPOVERLAPPED lpOverlapped); -int PowerClearRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); -int PowerCreateRequest(PREASON_CONTEXT Context); -int PowerSetRequest(HANDLE PowerRequest,POWER_REQUEST_TYPE RequestType); -int PrepareTape(HANDLE hDevice,DWORD dwOperation,BOOL bImmediate); -int Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); -int Process32FirstW(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); -int Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); -int Process32NextW(HANDLE hSnapshot,LPPROCESSENTRY32 lppe); -int ProcessIdToSessionId(DWORD dwProcessId,DWORD* pSessionId); -int PulseEvent(HANDLE hEvent); -int PurgeComm(HANDLE hFile,DWORD dwFlags); -int QueryActCtxSettingsW(DWORD dwFlags,HANDLE hActCtx,PCWSTR settingsNameSpace,PCWSTR settingName,PWSTR pvBuffer,SIZE_T dwBuffer,SIZE_T* pdwWrittenOrRequired); -int QueryActCtxW(DWORD dwFlags,HANDLE hActCtx,PVOID pvSubInstance,UINT ulInfoClass,PVOID pvBuffer,SIZE_T cbBuffer,SIZE_T* pcbWrittenOrRequired); -int QueryDepthSList(PSLIST_HEADER ListHead); -int QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize); -int QueryIdleProcessorCycleTime(PULONG BufferLength,PULONG64 ProcessorIdleCycleTime); -int QueryIdleProcessorCycleTimeEx(USHORT Group,PULONG BufferLength,PULONG64 ProcessorIdleCycleTime); -int QueryInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInfoClass,LPVOID lpJobObjectInfo,DWORD cbJobObjectInfoLength,LPDWORD lpReturnLength); -int QueryMemoryResourceNotification(HANDLE ResourceNotificationHandle,PBOOL ResourceState); -int QueryPerformanceCounter(LARGE_INTEGER* lpPerformanceCount); -int QueryPerformanceFrequency(LARGE_INTEGER* lpFrequency); -int QueryProcessAffinityUpdateMode(HANDLE ProcessHandle,DWORD lpdwFlags); -int QueryProcessCycleTime(HANDLE ProcessHandle,PULONG64 CycleTime); -int QueryThreadCycleTime(HANDLE ThreadHandle,PULONG64 CycleTime); -int QueryThreadpoolStackInformation(PTP_POOL ptpp,PTP_POOL_STACK_INFORMATION ptpsi); -int QueryUmsThreadInformation(PUMS_CONTEXT UmsThread,UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,ULONG UmsThreadInformationLength,PULONG ReturnLength); -int QueryUnbiasedInterruptTime(PULONGLONG UnbiasedTime); -int QueryWorkingSet(HANDLE hProcess,PVOID pv,DWORD cb); -int QueryWorkingSetEx(HANDLE hProcess,PVOID pv,DWORD cb); -int QueueUserAPC(PAPCFUNC pfnAPC,HANDLE hThread,ULONG_PTR dwData); -int QueueUserWorkItem(LPTHREAD_START_ROUTINE Function,PVOID Context,DWORD Flags); -int RaiseException(DWORD dwExceptionCode,DWORD dwExceptionFlags,DWORD nNumberOfArguments,const ULONG_PTR* lpArguments); -int RaiseFailFastException(PEXCEPTION_RECORD pExceptionRecord,PCONTEXT pContextRecord,DWORD dwFlags); -int ReOpenFile(HANDLE hOriginalFile,DWORD dwDesiredAccess,DWORD dwShareMode,DWORD dwFlags); -int ReadConsole(HANDLE hConsoleInput,LPVOID lpBuffer,DWORD nNumberOfCharsToRead,LPDWORD lpNumberOfCharsRead,LPVOID pInputControl); -int ReadConsoleInput(HANDLE hConsoleInput,PINPUT_RECORD lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsRead); -int ReadConsoleInputA(HANDLE hConsoleInput,PINPUT_RECORD lpInputRecord,DWORD nLength,LPDWORD lpNumberOfEventsRead); -int ReadConsoleOutput(HANDLE hConsoleOutput,PCHAR_INFO lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpReadRegion); -int ReadConsoleOutputAttribute(HANDLE hConsoleOutput,LPWORD lpAttribute,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfAttrsRead); -int ReadConsoleOutputCharacter(HANDLE hConsoleOutput,LPTSTR lpCharacter,DWORD nLength,COORD dwReadCoord,LPDWORD lpNumberOfCharsRead); -int ReadDirectoryChangesW(HANDLE hDirectory,LPVOID lpBuffer,DWORD nBufferLength,BOOL bWatchSubtree,DWORD dwNotifyFilter,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); -bool ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped); -int ReadFileEx(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); -int ReadFileScatter(HANDLE hFile,FILE_SEGMENT_ELEMENT aSegmentArray,DWORD nNumberOfBytesToRead,LPDWORD lpReserved,LPOVERLAPPED lpOverlapped); -int ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddress,LPVOID lpStockBuffer,SIZE_T nSize,SIZE_T* lpNumberOfBytesRead); -int RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK pRecoveryCallback,PVOID pvParameter,DWORD dwPingInterval,DWORD dwFlags); -int RegisterApplicationRestart(PCWSTR pwzCommandline,DWORD dwFlags); -int RegisterWaitForSingleObject(PHANDLE phNewWaitObject,HANDLE hObject,WAITORTIMERCALLBACK Callback,PVOID Context,DWORD dwMilliseconds,DWORD dwFlags); -int ReleaseActCtx(HANDLE hActCtx); -int ReleaseMutex(HANDLE hMutex); -int ReleaseMutexWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE mut); -int ReleaseSRWLockExclusive(PSRWLOCK SRWLock); -int ReleaseSRWLockShared(PSRWLOCK SRWLock); -int ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount); -int ReleaseSemaphoreWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE sem,DWORD crel); -int RemoveDirectory(LPCTSTR lpPathName); -int RemoveDirectoryA(LPCTSTR lpPathName); -int RemoveDirectoryTransacted(LPCTSTR lpPathName,HANDLE hTransaction); -int RemoveDirectoryW(LPCTSTR lpPathName); -int RemoveSecureMemoryCacheCallback(PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack); -int RemoveVectoredContinueHandler(PVOID Handler); -int RemoveVectoredExceptionHandler(PVOID Handler); -int ReplaceFile(LPCTSTR lpReplacedFileName,LPCTSTR lpReplacementFileName,LPCTSTR lpBackupFileName,DWORD dwReplaceFlags,LPVOID lpExclude,LPVOID lpReserved); -int RequestWakeupLatency(LATENCY_TIME latency); -int ResetEvent(HANDLE hEvent); -int ResetWriteWatch(LPVOID lpBaseAddress,SIZE_T dwRegionSize); -int ResolveLocaleName(LPCWSTR lpNameToResolve,LPWSTR lpLocaleName,int cchLocaleName); -int ResumeThread(HANDLE hThread); -int RtlAddFunctionTable(PRUNTIME_FUNCTION FunctionTable,DWORD EntryCount,DWORD64 BaseAddress,ULONGLONG TargetGp); -int RtlCaptureContext(PCONTEXT ContextRecord); -int RtlCaptureStackBackTrace(ULONG FramesToSkip,ULONG FramesToCapture,PVOID* BackTrace,PULONG BackTraceHash); -int RtlDeleteFunctionTable(PRUNTIME_FUNCTION FunctionTable); -int RtlInstallFunctionTableCallback(DWORD64 TableIdentifier,DWORD64 BaseAddress,DWORD Length,PGET_RUNTIME_FUNCTION_CALLBACK Callback,PVOID Context,PCWSTR OutOfProcessCallbackDll); -int RtlIsValidLocaleName(LPCWSTR LocaleName,ULONG Flags); -int RtlLookupFunctionEntry(ULONGLONG ControlPC,PULONGLONG ImageBase,PULONGLONG TargetGp); -int RtlPcToFileHeader(PVOID PcValue,PVOID* BaseOfImage); -int RtlRestoreContext(PCONTEXT ContextRecord,PEXCEPTION_RECORD ExceptionRecord); -int ScrollConsoleScreenBuffer(HANDLE hConsoleOutput,const SMALL_RECT* lpScrollRectangle,const SMALL_RECT* lpClipRectangle,COORD dwDestinationOrigin,const CHAR_INFO* lpFill); -int ScrollConsoleScreenBufferA(HANDLE hConsoleOutput,const SMALL_RECT* lpScrollRectangle,const SMALL_RECT* lpClipRectangle,COORD dwDestinationOrigin,const CHAR_INFO* lpFill); -int SearchPath(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferLength,LPTSTR lpBuffer,LPTSTR* lpFilePart); -int SearchPathA(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferSize,LPTSTR lpStockBuffer,LPTSTR* lpFilePart); -int SearchPathW(LPCTSTR lpPath,LPCTSTR lpFileName,LPCTSTR lpExtension,DWORD nBufferSize,LPTSTR lpStockBuffer,LPTSTR* lpFilePart); -int SetCalendarInfo(LCID Locale,CALID Calendar,CALTYPE CalType,LPCTSTR lpCalData); -int SetCommBreak(HANDLE hFile); -int SetCommConfig(HANDLE hCommDev,LPCOMMCONFIG lpCC,DWORD dwSize); -int SetCommMask(HANDLE hFile,DWORD dwEvtMask); -int SetCommState(HANDLE hFile,LPDCB lpDCB); -int SetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts); -int SetComputerName(LPCTSTR lpComputerName); -int SetComputerNameA(LPCTSTR lpComputerName); -int SetComputerNameEx(COMPUTER_NAME_FORMAT NameType,LPCTSTR lpBuffer); -int SetComputerNameW(LPCTSTR lpComputerName); -int SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput); -int SetConsoleCP(UINT wCodePageID); -int SetConsoleCtrlHandler(PHANDLER_ROUTINE hRoutine,BOOL Add); -int SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo); -int SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD dwCursorPosition); -int SetConsoleDisplayMode(HANDLE hConsoleOutput,DWORD dwFlags,PCOORD lpNewScreenBufferDimensions); -int SetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo); -int SetConsoleMode(HANDLE hConsoleHandle,DWORD dwMode); -int SetConsoleOutputCP(UINT wCodePageID); -int SetConsoleScreenBufferInfoEx(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx); -int SetConsoleScreenBufferSize(HANDLE hConsoleOutput,COORD dwSize); -int SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes); -int SetConsoleTitle(LPCTSTR lpConsoleTitle); -int SetConsoleTitleA(LPCTSTR pConsoleTitle); -int SetConsoleTitleW(LPCTSTR pConsoleTitle); -int SetConsoleWindowInfo(HANDLE hConsoleOutput,BOOL bAbsolute,const SMALL_RECT* lpConsoleWindow); -int SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection,DWORD dwSpinCount); -int SetCurrentConsoleFontEx(HANDLE hConsoleOutput,BOOL bMaximumWindow,PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx); -int SetCurrentDirectory(LPCTSTR lpPathName); -int SetCurrentDirectoryA(LPCTSTR lpPathName); -int SetCurrentDirectoryW(LPCTSTR lpPathName); -int SetDefaultCommConfig(LPCTSTR lpszName,LPCOMMCONFIG lpCC,DWORD dwSize); -int SetDllDirectory(LPCTSTR lpPathName); -int SetDynamicTimeZoneInformation(const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation); -int SetEndOfFile(HANDLE hFile); -int SetEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpValue); -int SetEnvironmentVariableA(LPCTSTR lpName,LPCTSTR lpValue); -int SetEnvironmentVariableW(LPCTSTR lpName,LPCTSTR lpValue); -int SetErrorMode(DWORD uMode); -int SetEvent(HANDLE hEvent); -int SetEventWhenCallbackReturns(PTP_CALLBACK_INSTANCE pci,HANDLE evt); -int SetExtendedFeaturesMask(PCONTEXT_EX ContextEx,DWORD64 FeatureMask); -int SetFileApisToANSI(); -int SetFileApisToOEM(); -int SetFileAttributes(LPCTSTR lpFileName,DWORD dwFileAttributes); -int SetFileAttributesA(LPCTSTR lpFileName,DWORD dwFileAttributes); -int SetFileAttributesTransacted(LPCTSTR lpFileName,DWORD dwFileAttributes,HANDLE hTransaction); -int SetFileAttributesW(LPCTSTR lpFileName,DWORD dwFileAttributes); -int SetFileBandwidthReservation(HANDLE hFile,DWORD nPeriodMilliseconds,DWORD nBytesPerPeriod,BOOL bDiscardable,LPDWORD lpTransferSize,LPDWORD lpNumOutstandingRequests); -int SetFileCompletionNotificationModes(HANDLE FileHandle,UCHAR Flags); -int SetFileInformationByHandle(HANDLE hFile,FILE_INFO_BY_HANDLE_CLASS FileInformationClass,LPVOID lpFileInformation,DWORD dwBufferSize); -int SetFileIoOverlappedRange(HANDLE FileHandle,PUCHAR OverlappedRangeStart,ULONG Length); -int SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); -int SetFilePointerEx(HANDLE hFile,LARGE_INTEGER lDistanceToMove,PLARGE_INTEGER pliNewFilePointer,DWORD dwMoveMethod); -int SetFileShortName(HANDLE hFile,LPCTSTR lpShortName); -int SetFileTime(HANDLE hFile,const FILETIME* lpCreationTime,const FILETIME* lpLastAccessTime,const FILETIME* lpLastWriteTime); -int SetFileValidData(HANDLE hFile,LONGLONG ValidDataLength); -int SetFirmwareEnvironmentVariable(LPCTSTR lpName,LPCTSTR lpGuid,PVOID pBuffer,DWORD nSize); -int SetHandleInformation(HANDLE hObject,DWORD dwMask,DWORD dwFlags); -int SetInformationJobObject(HANDLE hJob,JOBOBJECTINFOCLASS JobObjectInfoClass,LPVOID lpJobObjectInfo,DWORD cbJobObjectInfoLength); -int SetLastError(DWORD dwErrCode); -int SetLocalTime(const SYSTEMTIME* lpSystemTime); -int SetLocaleInfo(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); -int SetLocaleInfoA(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); -int SetLocaleInfoW(LCID Locale,LCTYPE LCType,LPCTSTR lpLCData); -int SetMailslotInfo(HANDLE hMailslot,DWORD lReadTimeout); -int SetPriorityClass(HANDLE hProcess,DWORD dwPriorityClass); -int SetProcessAffinityMask(HANDLE hProcess,DWORD_PTR dwProcessAffinityMask); -int SetProcessAffinityUpdateMode(HANDLE ProcessHandle,DWORD dwFlags); -int SetProcessDEPPolicy(DWORD dwFlags); -int SetProcessPriorityBoost(HANDLE hProcess,BOOL DisablePriorityBoost); -int SetProcessShutdownParameters(DWORD dwLevel,DWORD dwFlags); -int SetProcessWorkingSetSize(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize); -int SetProcessWorkingSetSizeEx(HANDLE hProcess,SIZE_T dwMinimumWorkingSetSize,SIZE_T dwMaximumWorkingSetSize,DWORD Flags); -int SetSearchPathMode(DWORD Flags); -int SetStdHandle(DWORD nStdHandle,HANDLE hHandle); -int SetSystemFileCacheSize(SIZE_T MinimumFileCacheSize,SIZE_T MaximumFileCacheSize,DWORD Flags); -int SetSystemPowerState(BOOL fSuspend,BOOL fForce); -int SetSystemTime(const SYSTEMTIME* lpSystemTime); -int SetSystemTimeAdjustment(DWORD dwTimeAdjustment,BOOL bTimeAdjustmentDisabled); -int SetTapeParameters(HANDLE hDevice,DWORD dwOperation,LPVOID lpTapeInformation); -int SetTapePosition(HANDLE hDevice,DWORD dwPositionMethod,DWORD dwPartition,DWORD dwOffsetLow,DWORD dwOffsetHigh,BOOL bImmediate); -int SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask); -int SetThreadContext(HANDLE hThread,const CONTEXT* lpContext); -int SetThreadErrorMode(DWORD dwNewMode,LPDWORD lpOldMode); -int SetThreadExecutionState(EXECUTION_STATE esFlags); -int SetThreadGroupAffinity(HANDLE hThread,const GROUP_AFFINITY* GroupAffinity); -int SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor); -int SetThreadIdealProcessorEx(HANDLE hThread,PPROCESSOR_NUMBER lpIdealProcessor,PPROCESSOR_NUMBER lpPreviousIdealProcessor); -int SetThreadLocale(LCID Locale); -int SetThreadPriority(HANDLE hThread,DWORD nPriority); -int SetThreadPriorityBoost(HANDLE hThread,BOOL DisablePriorityBoost); -int SetThreadStackGuarantee(PULONG StackSizeInBytes); -int SetThreadpoolCallbackPriority(PTP_CALLBACK_ENVIRON pcbe,TP_CALLBACK_PRIORITY Priority); -int SetThreadpoolStackInformation(PTP_POOL ptpp,PTP_POOL_STACK_INFORMATION ptpsi); -int SetThreadpoolThreadMaximum(PTP_POOL ptpp,DWORD cthrdMost); -int SetThreadpoolThreadMinimum(PTP_POOL ptpp,DWORD cthrdMic); -int SetThreadpoolTimer(PTP_TIMER pti,PFILETIME pftDueTime,DWORD msPeriod,DWORD msWindowLength); -int SetThreadpoolWait(PTP_WAIT pwa,HANDLE h,PFILETIME pftTimeout); -int SetTimeZoneInformation(const TIME_ZONE_INFORMATION* lpTimeZoneInformation); -int SetUmsThreadInformation(PUMS_CONTEXT UmsThread,UMS_THREAD_INFO_CLASS UmsThreadInfoClass,PVOID UmsThreadInformation,ULONG UmsThreadInformationLength); -int SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); -int SetUserGeoID(GEOID GeoId); -int SetWaitableTimer(HANDLE hTimer,const LARGE_INTEGER* pDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,LPVOID lpArgToCompletionRoutine,BOOL fResume); -int SetWaitableTimerEx(HANDLE hTimer,const LARGE_INTEGER* lpDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,LPVOID lpArgToCompletionRoutine,PREASON_CONTEXT WakeContext,ULONG TolerableDelay); -int SetupComm(HANDLE hFile,DWORD dwInQueue,DWORD dwOutQueue); -int SignalObjectAndWait(HANDLE hObjectToSignal,HANDLE hObjectToWaitOn,DWORD dwMilliseconds,BOOL bAlertable); -int SizeofResource(HMODULE hModule,HRSRC hResInfo); -void Sleep(DWORD dwMilliseconds); -int SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable,PCRITICAL_SECTION CriticalSection,DWORD dwMilliseconds); -int SleepConditionVariableSRW(PCONDITION_VARIABLE ConditionVariable,PSRWLOCK SRWLock,DWORD dwMilliseconds,ULONG Flags); -int SleepEx(DWORD dwMilliseconds,BOOL bAlertable); -int StartThreadpoolIo(PTP_IO pio); -int SubmitThreadpoolWork(PTP_WORK pwk); -int SuspendThread(HANDLE hThread); -int SwitchToFiber(LPVOID lpFiber); -int SwitchToThread(); -int SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime,LPFILETIME lpFileTime); -int SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpUniversalTime,LPSYSTEMTIME lpLocalTime); -int TerminateJobObject(HANDLE hJob,UINT uExitCode); -int TerminateProcess(HANDLE hProcess,UINT uExitCode); -int TerminateThread(HANDLE hProcess,DWORD uExitCode); -int Thread32First(HANDLE hSnapshot,LPTHREADENTRY32 lpte); -int Thread32Next(HANDLE hSnapshot,LPTHREADENTRY32 lpte); -int TlsAlloc(); -int TlsFree(DWORD dwTlsIndex ); -int TlsGetValue(DWORD dwTlsIndex); -int TlsSetValue(DWORD dwTlsIndex,LPVOID pTlsValue); -int Toolhelp32ReadProcessMemory(DWORD th32ProcessID,LPCVOID lpBaseAddress,LPVOID lpBuffer,SIZE_T cbRead,SIZE_T lpNumberOfBytesRead); -int TransmitCommChar(HANDLE hFile,char cChar); -int TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); -int TryAcquireSRWLockShared(PSRWLOCK SRWLock); -int TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -int TrySubmitThreadpoolCallback(PTP_SIMPLE_CALLBACK pfns,PVOID pv,PTP_CALLBACK_ENVIRON pcbe); -int TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,LPSYSTEMTIME lpLocalTime,LPSYSTEMTIME lpUniversalTime); -int UmsThreadYield(PVOID SchedulerParam); -int UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo); -int UnlockFile(HANDLE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh); -int UnlockFileEx(HANDLE hFile,DWORD dwReserved,DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh,LPOVERLAPPED lpOverlapped); -int UnmapViewOfFile(LPCVOID lpBaseAddress); -int UnregisterApplicationRecoveryCallback(); -int UnregisterApplicationRestart(); -int UnregisterWait(HANDLE WaitHandle); -int UnregisterWaitEx(HANDLE WaitHandle,HANDLE CompletionEvent); -int UpdateCalendarDayOfWeek(LPCALDATETIME lpCalDateTime); -int UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,DWORD dwFlags,DWORD Attribute,PVOID lpValue,SIZE_T cbSize,PVOID lpPreviousValue,PSIZE_T lpReturnSize); -int UpdateResource(HANDLE hUpdate,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage,LPVOID lpData,DWORD cbData); -int VerLanguageName(DWORD wLang,LPTSTR szLang,DWORD cchLang); -int VerLanguageNameA(DWORD wLang,LPTSTR szLang,DWORD nSize); -int VerLanguageNameW(DWORD wLang,LPTSTR szLang,DWORD nSize); -int VerSetConditionMask(ULONGLONG dwlConditionMask,DWORD dwTypeBitMask,DWORD dwConditionMask); -int VerifyScripts(DWORD dwFlags,LPCWSTR lpLocaleScripts,int cchLocaleScripts,LPCWSTR lpTestScripts,int cchTestScripts); -int VerifyVersionInfo(LPOSVERSIONINFOEX lpVersionInfo,DWORD dwTypeMask,DWORDLONG dwlConditionMask); -int VirtualAlloc(LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect); -int VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect); -int VirtualAllocExNuma(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect,DWORD nndPreferred); -int VirtualFree(LPVOID lpAddress,SIZE_T dwSize,DWORD FreeType); -int VirtualFreeEx(HANDLE hProces,LPVOID lpAddress,SIZE_T dwSize,DWORD dwFreeType); -int VirtualLock(LPVOID lpAddress,SIZE_T dwSize); -int VirtualProtect(LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,DWORD lpflOldProtect); -int VirtualProtectEx(HANDLE hProces,LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,DWORD lpflOldProtect); -int VirtualQuery(LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION pbi_Buffer,SIZE_T dwLength); -int VirtualQueryEx(HANDLE hProcess,LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION pbi_Buffer,SIZE_T dwLength); -int VirtualUnlock(LPVOID lpAddress,SIZE_T dwSize); -int WTSGetActiveConsoleSessionId(); -int WaitCommEvent(HANDLE hFile,LPDWORD lpEvtMask,LPOVERLAPPED lpOverlapped); -int WaitForDebugEvent(LPDEBUG_EVENT lpDebugEvent,DWORD dwMilliseconds); -int WaitForMultipleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds); -int WaitForMultipleObjectsEx(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable); -int WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); -int WaitForSingleObjectEx(HANDLE hHandle,DWORD dwMilliseconds,BOOL bAlertable); -int WaitForThreadpoolIoCallbacks(PTP_IO pio,BOOL fCancelPendingCallbacks); -int WaitForThreadpoolTimerCallbacks(PTP_TIMER pti,BOOL fCancelPendingCallbacks); -int WaitForThreadpoolWaitCallbacks(PTP_WAIT pwa,BOOL fCancelPendingCallbacks); -int WaitForThreadpoolWorkCallbacks(PTP_WORK pwk,BOOL fCancelPendingCallbacks); -int WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable); -int WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable); -int WerGetFlags(HANDLE hProcess,PDWORD pdwFlags); -int WerRegisterFile(PCWSTR pwzFile,WER_REGISTER_FILE_TYPE regFileType,DWORD dwFlags); -int WerRegisterMemoryBlock(PVOID pvAddress,DWORD dwSize); -int WerRegisterRuntimeExceptionModule(PCWSTR pwszOutOfProcessCallbackDll,PVOID pContext); -int WerSetFlags(DWORD dwFlags); -int WerUnregisterFile(PCWSTR pwzFilePath); -int WerUnregisterMemoryBlock(PVOID pvAddress); -int WerUnregisterRuntimeExceptionModule(PCWSTR pwszOutOfProcessCallbackDll,PVOID pContext); -int WideCharToMultiByte(UINT CodePage,DWORD Options,LPCWSTR WideCharStr,int WideCharCount,LPSTR lpszBuffer,int MultiByteByte,LPCSTR pDefaultChar,LPBOOL pDefaultCharUsed); -int WinExec(LPCSTR lpCmdLine,UINT uCmdShow); -int Wow64DisableWow64FsRedirection(PVOID* OldValue); -int Wow64EnableWow64FsRedirection(BOOLEAN Wow64FsEnableRedirection); -int Wow64GetThreadContext(HANDLE hThread,PWOW64_CONTEXT lpContext); -int Wow64GetThreadSelectorEntry(HANDLE hThread,DWORD dwSelector,PWOW64_LDT_ENTRY lpSelectorEntry); -int Wow64RevertWow64FsRedirection(PVOID OldValue); -int Wow64SetThreadContext(HANDLE hThread,CONST WOW64_CONTEXT* lpContext); -int Wow64SuspendThread(HANDLE hThread); -int WriteConsole(HANDLE hConsoleOutput,LPCTSTR lpBuffer,DWORD nNumberOfCharsToWrite,LPDWORD lpNumberOfCharsWritten,LPVOID lpReserved); -int WriteConsoleInput(HANDLE hConsoleInput,const INPUT_RECORD* lpBuffer,DWORD nLength,LPDWORD lpNumberOfEventsWritten); -int WriteConsoleOutput(HANDLE hConsoleOutput,const CHAR_INFO* lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion); -int WriteConsoleOutputA(HANDLE hConsoleOutput,const CHAR_INFO* lpBuffer,COORD dwBufferSize,COORD dwBufferCoord,PSMALL_RECT lpWriteRegion); -int WriteConsoleOutputAttribute(HANDLE hConsoleOutput,const WORD* lpAttribute,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfAttrsWritten); -int WriteConsoleOutputCharacter(HANDLE hConsoleOutput,LPCTSTR lpCharacter,DWORD nLength,COORD dwWriteCoord,LPDWORD lpNumberOfCharsWritten); -BOOL WriteFile(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped); -int WriteFileEx(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPOVERLAPPED lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); -int WriteFileGather(HANDLE hFile,FILE_SEGMENT_ELEMENT lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD pOverlapped,LPOVERLAPPED lpCompletionRoutine); -int WriteFileW(HANDLE hFile,LPCVOID lpWriteData,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped); -int WritePrivateProfileSection(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); -int WritePrivateProfileSectionA(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); -int WritePrivateProfileSectionW(LPCTSTR lpAppName,LPCTSTR lpString,LPCTSTR lpFileName); -int WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName); -int WritePrivateProfileStringA(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR pFileName); -int WritePrivateProfileStringW(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR pFileName); -int WritePrivateProfileStruct(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); -int WritePrivateProfileStructA(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); -int WritePrivateProfileStructW(LPCTSTR lpszSection,LPCTSTR lpszKey,LPVOID lpStruct,UINT uSizeStruct,LPCTSTR szFile); -int WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpStockBuffer,SIZE_T nBufferSize,SIZE_T* lpNumberOfBytesWritten); -int WriteProfileSection(LPCTSTR lpAppName,LPCTSTR lpString); -int WriteProfileSectionA(LPCTSTR lpAppName,LPCTSTR lpString); -int WriteProfileSectionW(LPCTSTR lpAppName,LPCTSTR lpString); -int WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString); -int WriteProfileStringA(LPCTSTR lpszSection,LPCTSTR lpszKeyName,LPCTSTR lpszString); -int WriteProfileStringW(LPCTSTR lpszSection,LPCTSTR lpszKeyName,LPCTSTR lpszString); -int WriteTapemark(HANDLE hDevice,DWORD dwTapemarkType,DWORD dwTapemarkCount,BOOL bImmediate); -int ZombifyActCtx(HANDLE hActCtx); -int _hread(HFILE hFile,DWORD lpBuffer,DWORD nBufferSize); -int _hwrite(HFILE hFile,DWORD lpBuffer,DWORD nBufferSize); -int _lclose(HFILE hFile); -int _lcreat(LPCSTR lpPathName,DWORD iAttribute); -int _llseek(HFILE hFile,LONG lOffset,int iOrigin); -int _lopen(LPCSTR lpPathName,int iReadWrite); -int _lread(HFILE hFile,LPVOID lpBuffer,UINT nBufferSize); -int _lwrite(HFILE hFile,LPVOID lpBuffer,UINT nBufferSize); -int lstrcat(LPTSTR String1,LPTSTR String2); -int lstrcatW(LPTSTR String1,LPTSTR String2); -int lstrcmp(LPCTSTR string1,LPCTSTR string2); -int lstrcmpA(LPCTSTR string1,LPCTSTR string2); -int lstrcmpW(LPCTSTR string1,LPCTSTR string2); -int lstrcmpi(LPCTSTR string1,LPCTSTR string2); -int lstrcmpiW(LPCTSTR lpString1,LPCTSTR lpString2); -int lstrcpy(LPTSTR lpString1,LPTSTR lpString2); -int lstrcpyW(LPTSTR lpString1,LPTSTR lpString2); -int lstrcpyn(LPTSTR lpBuffer,LPCTSTR lpstrSrc,int nBuffer); -int lstrcpynW(LPTSTR lpBuffer,LPCTSTR lpstrSrc,int nBuffer); -int lstrlen(LPCTSTR lpString); -int lstrlenA(LPCTSTR lpString); -int lstrlenW(LPCTSTR lpString); -int RtlUnwind(PEXCEPTION_REGISTRATION pRegistrationFrame,PVOID returnAddr,PEXCEPTION_RECORD pExcptRec,DWORD _eax_value); -bool CreatePipe(PHANDLE hReadPipe,PHANDLE hWritePipe,LPSECURITY_ATTRIBUTES lpPipeAttributes,DWORD nSize); -long SetHandleCount(long wNumber); \ No newline at end of file +int;AcquireSRWLockExclusive;PSRWLOCK SRWLock; +int;AcquireSRWLockShared;PSRWLOCK SRWLock; +int;ActivateActCtx;HANDLE hActCtx;ULONG_PTR* lpCookie; +int;AddAtom;LPCTSTR lpString; +int;AddAtomA;LPCTSTR lpString; +int;AddAtomW;LPCTSTR lpString; +int;AddConsoleAlias;LPCTSTR Source;LPCTSTR Target;LPCTSTR ExeName; +int;AddRefActCtx;HANDLE hActCtx; +int;AddSIDToBoundaryDescriptor;HANDLE* BoundaryDescriptor;PSID RequiredSid; +int;AddSecureMemoryCacheCallback;PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack; +int;AddVectoredContinueHandler;ULONG FirstHandler;PVECTORED_EXCEPTION_HANDLER VectoredHandler; +int;AddVectoredExceptionHandler;ULONG FirstHandler;PVECTORED_EXCEPTION_HANDLER VectoredHandler; +int;AdjustCalendarDate;LPCALDATETIME lpCalDateTime;CALDATETIME_DATEUNIT calUnit;INT amount; +int;AllocConsole;; +int;AllocateUserPhysicalPages;HANDLE hProcess;PULONG_PTR NumberOfPages;PULONG_PTR UserPfnArray; +int;AllocateUserPhysicalPagesNuma;HANDLE hProcess;PULONG_PTR NumberOfPages;PULONG_PTR PageArray;DWORD nndPreferred; +int;ApplicationRecoveryFinished;BOOL bSuccess; +int;ApplicationRecoveryInProgress;PBOOL pbCanceled; +int;AreFileApisANSI;; +int;AssignProcessToJobObject;HANDLE hJob;HANDLE hProcess; +int;AttachConsole;DWORD dwProcessId; +int;BackupRead;HANDLE hFile;LPBYTE lpBuffer;DWORD nNumberOfBytesToRead;LPDWORD lpNumberOfBytesRead;BOOL bAbort;BOOL bProcessSecurity;LPVOID* lpContext; +int;BackupSeek;HANDLE hFile;DWORD dwLowBytesToSeek;DWORD dwHighBytesToSeek;LPDWORD lpdwLowByteSeeked;LPDWORD lpdwHighByteSeeked;LPVOID* lpContext; +int;BackupWrite;HANDLE hFile;LPBYTE lpBuffer;DWORD nNumberOfBytesToWrite;LPDWORD lpNumberOfBytesWritten;BOOL bAbort;BOOL bProcessSecurity;LPVOID* lpContext; +int;Beep;DWORD dwFreq;DWORD dwDuration; +int;BeginUpdateResource;LPCTSTR pFileName;BOOL bDeleteExistingResources; +int;BindIoCompletionCallback;HANDLE FileHandle;LPOVERLAPPED_COMPLETION_ROUTINE Function;ULONG Flags; +int;BuildCommDCB;LPCTSTR lpDef;LPDCB lpDCB; +int;BuildCommDCBAndTimeouts;LPCTSTR lpDef;LPDCB lpDCB;LPCOMMTIMEOUTS lpCommTimeouts; +int;CallbackMayRunLong;PTP_CALLBACK_INSTANCE pci; +int;CancelIo;HANDLE hFile; +int;CancelIoEx;HANDLE hFile;LPOVERLAPPED lpOverlapped; +int;CancelSynchronousIo;HANDLE hThread; +int;CancelThreadpoolIo;PTP_IO pio; +int;CancelWaitableTimer;HANDLE hTimer; +int;ChangeTimerQueueTimer;HANDLE TimerQueue;HANDLE Timer;ULONG DueTime;ULONG Period; +int;CheckNameLegalDOS8Dot3;LPCTSTR lpName;LPSTR lpOemName;DWORD OemNameSize;PBOOL pbNameContainsSpaces;PBOOL pbNameLegal; +int;CheckRemoteDebuggerPresent;HANDLE hProcess;PBOOL pbDebuggerPresent; +int;ClearCommBreak;HANDLE hFile; +int;ClearCommError;HANDLE hFile;LPDWORD lpErrors;LPCOMSTAT lpStat; +int;CloseHandle;HANDLE hObject; +int;ClosePrivateNamespace;HANDLE Handle;DWORD Flags; +int;CloseThreadpool;PTP_POOL ptpp; +int;CloseThreadpoolCleanupGroup;PTP_CLEANUP_GROUP ptpcg; +int;CloseThreadpoolCleanupGroupMembers;PTP_CLEANUP_GROUP ptpcg;BOOL fCancelPendingCallbacks;PVOID pvCleanupContext; +int;CloseThreadpoolIo;PTP_IO pio; +int;CloseThreadpoolTimer;PTP_TIMER pti; +int;CloseThreadpoolWait;PTP_WAIT pwa; +int;CloseThreadpoolWork;PTP_WORK pwk; +int;CommConfigDialog;LPCTSTR lpszName;HWND hWnd;LPCOMMCONFIG lpCC; +int;CompareFileTime;const FILETIME* lpFileTime1;const FILETIME* lpFileTime2; +int;CompareString;LCID Locale;DWORD dwCmpFlags;LPCTSTR lpString1;int cchCount1;LPCTSTR lpString2;int cchCount2; +int;CompareStringA;LCID Locale;DWORD dwCmpFlags;LPCTSTR lpString1;int cchCount1;LPCTSTR lpString2;int cchCount2; +int;CompareStringEx;LPCWSTR lpLocaleName;DWORD dwCmpFlags;LPCWSTR lpString1;int cchCount1;LPCWSTR lpString2;int cchCount2;LPNLSVERSIONINFO lpVersionInformation;LPVOID lpReserved;LPARAM lParam; +int;CompareStringOrdinal;LPCWSTR lpString1;int cchCount1;LPCWSTR lpString2;int cchCount2;BOOL bIgnoreCase; +int;CompareStringW;LCID Locale;DWORD dwCmpFlags;LPCTSTR lpString1;int cchCount1;LPCTSTR lpString2;int cchCount2; +int;ContinueDebugEvent;DWORD dwProcessId;DWORD dwThreadId;DWORD dwContinueStatus; +int;ConvertCalDateTimeToSystemTime;const LPCALDATETIME lpCalDateTime;SYSTEMTIME* lpSysTime; +int;ConvertDefaultLocale;LCID Locale; +int;ConvertFiberToThread;; +int;ConvertSystemTimeToCalDateTime;const SYSTEMTIME lpSysTime;CALID calId;LPCALDATETIME lpCalDateTime; +int;ConvertThreadToFiber;LPVOID lpParameter; +int;ConvertThreadToFiberEx;LPVOID lpParameter;DWORD dwFlags; +int;CopyExtendedContext;PCONTEXT_EX Destination;DWORD ContextFlags;PCONTEXT_EX Source; +int;CopyFile;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;BOOL bFailIfExists; +int;CopyFileA;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;BOOL bFailIfExists; +int;CopyFileEx;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;LPPROGRESS_ROUTINE lpProgressRoutine;LPVOID lpData;LPBOOL pbCancel;DWORD dwCopyFlags; +int;CopyFileTransacted;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;LPPROGRESS_ROUTINE lpProgressRoutine;LPVOID lpData;LPBOOL pbCancel;DWORD dwCopyFlags;HANDLE hTransaction; +int;CopyFileW;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;BOOL bFailIfExists; +int;CreateActCtx;PACTCTX pActCtx; +int;CreateActCtxA;PACTCTX actctx; +int;CreateActCtxW;PACTCTX actctx; +int;CreateBoundaryDescriptor;LPCTSTR Name;ULONG Flags; +int;CreateConsoleScreenBuffer;DWORD dwDesiredAccess;DWORD dwShareMode;const SECURITY_ATTRIBUTES* lpSecurityAttributes;DWORD dwFlags;LPVOID lpScreenBufferData; +int;CreateDirectory;LPCTSTR lpPathName;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateDirectoryA;LPCTSTR lpPathName;LPSECURITY_ATTRIBUTES pSecurityAttributes; +int;CreateDirectoryEx;LPCTSTR lpTemplateDirectory;LPCTSTR lpNewDirectory;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateDirectoryTransacted;LPCTSTR lpTemplateDirectory;LPCTSTR lpNewDirectory;LPSECURITY_ATTRIBUTES lpSecurityAttributes;HANDLE hTransaction; +int;CreateDirectoryW;LPCTSTR lpPathName;LPSECURITY_ATTRIBUTES pSecurityAttributes; +int;CreateEvent;LPSECURITY_ATTRIBUTES lpEventAttributes;BOOL bManualReset;BOOL bInitialState;LPCTSTR lpName; +int;CreateEventA;LPSECURITY_ATTRIBUTES lpEventAttributes;BOOL bManualReset;BOOL bInitialState;LPCTSTR lpName; +int;CreateEventEx;LPSECURITY_ATTRIBUTES lpEventAttributes;LPCTSTR lpName;DWORD dwFlags;DWORD dwDesiredAccess; +int;CreateEventW;LPSECURITY_ATTRIBUTES lpEventAttributes;BOOL bManualReset;BOOL bInitialState;LPCTSTR lpName; +int;CreateFiber;SIZE_T dwStackSize;LPFIBER_START_ROUTINE lpStartAddress;LPVOID lpParameter; +int;CreateFiberEx;SIZE_T dwStackCommitSize;SIZE_T dwStackReserveSize;DWORD dwFlags;LPFIBER_START_ROUTINE lpStartAddress;LPVOID lpParameter; +int;CreateFile;LPCTSTR lpFileName;DWORD dwDesiredAccess;DWORD dwShareMode;LPSECURITY_ATTRIBUTES lpSecurityAttributes;DWORD dwCreationDisposition;DWORD dwFlagsAndAttributes;HANDLE hTemplateFile; +int;CreateFileA;LPCTSTR lpFileName;DWORD dwDesiredAccess;DWORD dwShareMode;LPSECURITY_ATTRIBUTES lpSecurityAttributes;DWORD dwCreationDistribution;DWORD dwFlagsAndAttributes;HANDLE hTemplateFile; +int;CreateFileMapping;HANDLE hFile;LPSECURITY_ATTRIBUTES lpAttributes;DWORD flProtect;DWORD dwMaximumSizeHigh;DWORD dwMaximumSizeLow;LPCTSTR lpName; +int;CreateFileMappingA;HANDLE hFile;LPSECURITY_ATTRIBUTES lpFileMappingAttributes;DWORD flProtect;DWORD dwMaximumSizeHigh;DWORD dwMaximumSizeLow;LPCTSTR lpName; +int;CreateFileMappingNuma;HANDLE hFile;LPSECURITY_ATTRIBUTES lpFileMappingAttributes;DWORD flProtect;DWORD dwMaximumSizeHigh;DWORD dwMaximumSizeLow;LPCTSTR lpName;DWORD nndPreferred; +int;CreateFileMappingW;HANDLE hFile;LPSECURITY_ATTRIBUTES lpFileMappingAttributes;DWORD flProtect;DWORD dwMaximumSizeHigh;DWORD dwMaximumSizeLow;LPCTSTR lpName; +int;CreateFileTransacted;LPCTSTR lpFileName;DWORD dwDesiredAccess;DWORD dwShareMode;LPSECURITY_ATTRIBUTES lpSecurityAttributes;DWORD dwCreationDisposition;DWORD dwFlagsAndAttributes;HANDLE hTemplateFile;HANDLE hTransaction;PUSHORT pusMiniVersion;PVOID pExtendedParameter; +int;CreateFileW;LPCTSTR lpFileName;DWORD dwDesiredAccess;DWORD dwShareMode;LPSECURITY_ATTRIBUTES lpSecurityAttributes;DWORD dwCreationDistribution;DWORD dwFlagsAndAttributes;HANDLE hTemplateFile; +int;CreateHardLink;LPCTSTR lpFileName;LPCTSTR lpExistingFileName;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateHardLinkTransacted;LPCTSTR lpFileName;LPCTSTR lpExistingFileName;LPSECURITY_ATTRIBUTES lpSecurityAttributes;HANDLE hTransaction; +int;CreateIoCompletionPort;HANDLE FileHandle;HANDLE ExistingCompletionPort;ULONG_PTR CompletionKey;DWORD NumberOfConcurrentThreads; +int;CreateJobObject;LPSECURITY_ATTRIBUTES lpJobAttributes;LPCTSTR lpName; +int;CreateMailslot;LPCTSTR lpName;DWORD nMaxMessageSize;DWORD lReadTimeout;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateMailslotA;LPCTSTR lpName;DWORD nMaxMessageSize;DWORD lReadTimeout;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateMailslotW;LPCTSTR lpName;DWORD nMaxMessageSize;DWORD lReadTimeout;LPSECURITY_ATTRIBUTES lpSecurityAttributes; +int;CreateMemoryResourceNotification;MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType; +int;CreateMutex;LPSECURITY_ATTRIBUTES lpMutexAttributes;BOOL bInitialOwner;LPCTSTR lpName; +int;CreateMutexA;LPSECURITY_ATTRIBUTES lpMutexAttributes;BOOL bInitialOwner;LPCTSTR lpName; +int;CreateMutexEx;LPSECURITY_ATTRIBUTES lpMutexAttributes;LPCTSTR lpName;DWORD dwFlags;DWORD dwDesiredAccess; +int;CreateMutexW;LPSECURITY_ATTRIBUTES lpMutexAttributes;BOOL bInitialOwner;LPCTSTR lpName; +int;CreatePrivateNamespace;LPSECURITY_ATTRIBUTES lpPrivateNamespaceAttributes;LPVOID lpBoundaryDescriptor;LPCTSTR lpAliasPrefix; +bool;CreateProcess;LPCTSTR lpApplicationName;LPTSTR lpCommandLine;LPSECURITY_ATTRIBUTES lpProcessAttributes;LPSECURITY_ATTRIBUTES lpThreadAttributes;BOOL bInheritHandles;DWORD dwCreationFlags;LPVOID lpEnvironment;LPCTSTR lpCurrentDirectory;LPSTARTUPINFO lpStartupInfo;LPPROCESS_INFORMATION lpProcessInformation; +bool;CreateProcessA;LPCTSTR lpApplicationName;LPTSTR lpCommandLine;LPSECURITY_ATTRIBUTES lpProcessAttributes;LPSECURITY_ATTRIBUTES lpThreadAttributes;BOOL bInheritHandles;DWORD dwCreationFlags;LPVOID lpEnvironment;LPCTSTR lpCurrentDirectory;LPSTARTUPINFO lpStartupInfo;LPPROCESS_INFORMATION lpProcessInformation; +bool;CreateProcessW;LPCTSTR lpApplicationName;LPTSTR lpCommandLine;LPSECURITY_ATTRIBUTES lpProcessAttributes;LPSECURITY_ATTRIBUTES lpThreadAttributes;BOOL bInheritHandles;DWORD dwCreationFlags;LPVOID lpEnvironment;LPCTSTR lpCurrentDirectory;LPSTARTUPINFO lpStartupInfo;LPPROCESS_INFORMATION lpProcessInformation; +int;CreateRemoteThread;HANDLE hProcess;LPSECURITY_ATTRIBUTES lpThreadAttributes;SIZE_T dwStackSize;LPTHREAD_START_ROUTINE lpStartAddress;LPVOID lpParameter;DWORD dwCreationFlags;LPDWORD lpThreadId; +int;CreateRemoteThreadEx;HANDLE hProcess;LPSECURITY_ATTRIBUTES lpThreadAttributes;SIZE_T dwStackSize;LPTHREAD_START_ROUTINE lpStartAddress;LPVOID lpParameter;DWORD dwCreationFlags;LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;LPDWORD lpThreadId; +int;CreateSemaphore;LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;LONG lInitialCount;LONG lMaximumCount;LPCTSTR lpName; +int;CreateSemaphoreA;LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;LONG lInitialCount;LONG lMaximumCount;LPCTSTR lpName; +int;CreateSemaphoreEx;LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;LONG lInitialCount;LONG lMaximumCount;LPCTSTR lpName;DWORD dwFlags;DWORD dwDesiredAccess; +int;CreateSemaphoreW;LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;LONG lInitialCount;LONG lMaximumCount;LPCTSTR lpName; +int;CreateSymbolicLink;LPTSTR lpSymlinkFileName;LPTSTR lpTargetFileName;DWORD dwFlags; +int;CreateSymbolicLinkTransacted;LPTSTR lpSymlinkFileName;LPTSTR lpTargetFileName;DWORD dwFlags;HANDLE hTransaction; +int;CreateTapePartition;HANDLE hDevice;DWORD dwPartitionMethod;DWORD dwCount;DWORD dwSize; +HANDLE;CreateThread;LPSECURITY_ATTRIBUTES lpThreadAttributes;SIZE_T dwStackSize;LPTHREAD_START_ROUTINE dwThreadFunction;LPVOID pThreadParm;DWORD dwCreationFlags;LPDWORD lpThreadId; +int;CreateThreadpool;PVOID reserved; +int;CreateThreadpoolCleanupGroup;; +int;CreateThreadpoolIo;HANDLE fl;PTP_WIN32_IO_CALLBACK pfnio;PVOID pv;PTP_CALLBACK_ENVIRON pcbe; +int;CreateThreadpoolTimer;PTP_TIMER_CALLBACK pfnti;PVOID pv;PTP_CALLBACK_ENVIRON pcbe; +int;CreateThreadpoolWait;PTP_WAIT_CALLBACK pfnwa;PVOID pv;PTP_CALLBACK_ENVIRON pcbe; +int;CreateThreadpoolWork;PTP_WORK_CALLBACK pfnwk;PVOID pv;PTP_CALLBACK_ENVIRON pcbe; +int;CreateTimerQueue;; +int;CreateTimerQueueTimer;PHANDLE phNewTimer;HANDLE TimerQueue;WAITORTIMERCALLBACK Callback;PVOID Parameter;DWORD DueTime;DWORD Period;DWORD Flags; +int;CreateToolhelp32Snapshot;DWORD dwFlags;DWORD th32ProcessID; +int;CreateUmsCompletionList;PUMS_COMPLETION_LIST* UmsCompletionList; +int;CreateUmsThreadContext;PUMS_CONTEXT* lpUmsThread; +int;CreateWaitableTimer;LPSECURITY_ATTRIBUTES lpTimerAttributes;BOOL bManualReset;LPCTSTR lpTimerName; +int;CreateWaitableTimerA;LPSECURITY_ATTRIBUTES lpTimerAttributes;BOOL bManualReset;LPCTSTR lpTimerName; +int;CreateWaitableTimerEx;LPSECURITY_ATTRIBUTES lpTimerAttributes;LPCTSTR lpTimerName;DWORD dwFlags;DWORD dwDesiredAccess; +int;CreateWaitableTimerW;LPSECURITY_ATTRIBUTES lpTimerAttributes;BOOL bManualReset;LPCTSTR lpTimerName; +int;DeactivateActCtx;DWORD dwFlags;ULONG_PTR ulCookie; +int;DebugActiveProcess;DWORD dwProcessId; +int;DebugActiveProcessStop;DWORD dwProcessId; +int;DebugBreak;; +int;DebugBreakProcess;HANDLE Process; +int;DebugSetProcessKillOnExit;BOOL KillOnExit; +int;DeleteAtom;ATOM nAtom; +int;DeleteBoundaryDescriptor;HANDLE BoundaryDescriptor; +int;DeleteCriticalSection;LPCRITICAL_SECTION lpCriticalSection; +int;DeleteFiber;LPVOID lpFiber; +int;DeleteFile;LPCTSTR lpFileName; +int;DeleteFileA;LPCTSTR lpFileName; +int;DeleteFileTransacted;LPCTSTR lpFileName;HANDLE hTransaction; +int;DeleteFileW;LPCTSTR lpFileName; +int;DeleteProcThreadAttributeList;LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList; +int;DeleteTimerQueue;HANDLE TimerQueue; +int;DeleteTimerQueueEx;HANDLE TimerQueue;HANDLE CompletionEvent; +int;DeleteTimerQueueTimer;HANDLE TimerQueue;HANDLE Timer;HANDLE CompletionEvent; +int;DeleteUmsCompletionList;PUMS_COMPLETION_LIST UmsCompletionList; +int;DeleteUmsThreadContext;PUMS_CONTEXT UmsThread; +int;DequeueUmsCompletionListItems;PUMS_COMPLETION_LIST UmsCompletionList;DWORD WaitTimeOut;PUMS_CONTEXT* UmsThreadList; +int;DeviceIoControl;HANDLE hDevice;DWORD dwIoControlCode;LPVOID lpInBuffer;DWORD nInBufferSize;LPVOID pOutBuffer;DWORD nOutBufferSize;LPDWORD lpBytesReturned;LPOVERLAPPED lpOverlapped; +int;DisableThreadLibraryCalls;HMODULE hModule; +int;DisassociateCurrentThreadFromCallback;PTP_CALLBACK_INSTANCE pci; +int;DnsHostnameToComputerName;LPCTSTR Hostname;LPTSTR ComputerName;LPDWORD nSize; +int;DosDateTimeToFileTime;WORD wFatDate;WORD wFatTime;LPFILETIME lpFileTime; +int;DuplicateHandle;HANDLE hSourceProcessHandle;HANDLE hSourceHandle;HANDLE hTargetProcessHandle;LPHANDLE pTargetHandle;DWORD dwDesiredAccess;BOOL bInheritHandle;DWORD dwOptions; +int;EmptyWorkingSet;HANDLE hProcess; +int;EndUpdateResource;HANDLE hUpdate;BOOL fDiscard; +int;EnterCriticalSection;LPCRITICAL_SECTION lpCriticalSection; +int;EnterUmsSchedulingMode;PUMS_SCHEDULER_STARTUP_INFO SchedulerStartupInfo; +int;EnumCalendarInfo;CALINFO_ENUMPROC pCalInfoEnumProc;LCID Locale;CALID Calendar;CALTYPE CalType; +int;EnumCalendarInfoA;CALINFO_ENUMPROC lpCalInfoEnumProc;LCID Locale;CALID Calendar;CALTYPE CalType; +int;EnumCalendarInfoEx;CALINFO_ENUMPROCEX pCalInfoEnumProcEx;LCID Locale;CALID Calendar;CALTYPE CalType; +int;EnumCalendarInfoExEx;CALINFO_ENUMPROCEXEX pCalInfoEnumProcExEx;LPCWSTR lpLocaleName;CALID Calendar;LPCWSTR lpReserved;CALTYPE CalType;LPARAM lParam; +int;EnumCalendarInfoW;CALINFO_ENUMPROC lpCalInfoEnumProc;LCID Locale;CALID Calendar;CALTYPE CalType; +int;EnumDateFormats;DATEFMT_ENUMPROC lpDateFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EnumDateFormatsA;DATEFMT_ENUMPROC lpDateFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EnumDateFormatsEx;DATEFMT_ENUMPROCEX lpDateFmtEnumProcEx;LCID Locale;DWORD dwFlags; +int;EnumDateFormatsExEx;DATEFMT_ENUMPROCEXEX lpDateFmtEnumProcExEx;LPCWSTR lpLocaleName;DWORD dwFlags;LPARAM lParam; +int;EnumDateFormatsW;DATEFMT_ENUMPROC lpDateFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EnumDeviceDrivers;LPVOID* lpImageBase;DWORD cb;LPDWORD lpcbNeeded; +int;EnumLanguageGroupLocales;LANGGROUPLOCALE_ENUMPROC lpLangGroupLocaleEnumProc;LGRPID LanguageGroup;DWORD dwFlags;LONG_PTR lParam; +int;EnumPageFiles;PENUM_PAGE_CALLBACK pCallbackRoutine;LPVOID lpContext; +int;EnumProcessModules;HANDLE hProcess;HMODULE* lphModule;DWORD cb;LPDWORD lpcbNeeded; +int;EnumProcessModulesEx;HANDLE hProcess;HMODULE* lphModule;DWORD cb;LPDWORD lpcbNeeded;DWORD dwFilterFlag; +int;EnumProcesses;LPVOID pProcessIds;DWORD cb;DWORD* pBytesReturned; +int;EnumResourceLanguages;HMODULE hModule;LPCTSTR lpType;LPCTSTR lpName;ENUMRESLANGPROC lpEnumFunc;LONG_PTR lParam; +int;EnumResourceLanguagesEx;HMODULE hModule;LPCTSTR lpType;LPCTSTR lpName;ENUMRESLANGPROC lpEnumFunc;LONG_PTR lParam;DWORD dwFlags;LANGID LangId; +int;EnumResourceNames;HMODULE hModule;LPCTSTR lpszType;ENUMRESNAMEPROC lpEnumFunc;LONG_PTR lParam; +int;EnumResourceNamesA;HMODULE hModule;LPCTSTR lpszType;ENUMRESNAMEPROC lpEnumFunc;LONG_PTR IParam; +int;EnumResourceNamesEx;HMODULE hModule;LPCTSTR lpszType;ENUMRESNAMEPROC lpEnumFunc;LONG_PTR lParam;DWORD dwFlags;LANGID LangId; +int;EnumResourceNamesW;HMODULE hModule;LPCTSTR lpszType;ENUMRESNAMEPROC lpEnumFunc;LONG_PTR IParam; +int;EnumResourceTypes;HMODULE hModule;ENUMRESTYPEPROC lpEnumFunc;LONG_PTR lParam; +int;EnumResourceTypesA;HMODULE hModule;ENUMRESTYPEPROC lpEnumFunc;LONG_PTR IParam; +int;EnumResourceTypesEx;HMODULE hModule;ENUMRESTYPEPROC lpEnumFunc;LONG_PTR lParam;DWORD dwFlags;LANGID LangId; +int;EnumSystemCodePages;CODEPAGE_ENUMPROC lpCodePageEnumProc;DWORD dwFlags; +int;EnumSystemCodePagesA;CODEPAGE_ENUMPROC lpCodePageEnumProc;DWORD dwFlags; +int;EnumSystemCodePagesW;CODEPAGE_ENUMPROC lpCodePageEnumProc;DWORD dwFlags; +int;EnumSystemFirmwareTables;DWORD FirmwareTableProviderSignature;PVOID pFirmwareTableBuffer;DWORD BufferSize; +int;EnumSystemGeoID;GEOCLASS GeoClass;GEOID ParentGeoId;GEO_ENUMPROC lpGeoEnumProc; +int;EnumSystemLanguageGroups;LANGUAGEGROUP_ENUMPROC lpLanguageGroupEnumProc;DWORD dwFlags;LONG_PTR lParam; +int;EnumSystemLocales;LOCALE_ENUMPROC lpLocaleEnumProc;DWORD dwFlags; +int;EnumSystemLocalesA;LOCALE_ENUMPROC pLocaleEnumProc;DWORD dwFlags; +int;EnumSystemLocalesEx;LOCALE_ENUMPROCEX lpLocaleEnumProcEx;DWORD dwFlags;LPARAM lParam;LPVOID lpReserved; +int;EnumSystemLocalesW;LOCALE_ENUMPROC pLocaleEnumProc;DWORD dwFlags; +int;EnumTimeFormats;TIMEFMT_ENUMPROC lpTimeFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EnumTimeFormatsA;TIMEFMT_ENUMPROC lpTimeFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EnumTimeFormatsEx;TIMEFMT_ENUMPROCEX lpTimeFmtEnumProcEx;LPCWSTR lpLocaleName;DWORD dwFlags;LPARAM lParam; +int;EnumTimeFormatsW;TIMEFMT_ENUMPROC lpTimeFmtEnumProc;LCID Locale;DWORD dwFlags; +int;EraseTape;HANDLE hDevice;DWORD dwEraseType;BOOL bImmediate; +int;EscapeCommFunction;HANDLE hFile;DWORD dwFunc; +int;ExecuteUmsThread;PUMS_CONTEXT UmsThread; +VOID;ExitProcess;UINT uExitCode; +int;ExitThread;DWORD uExitCode; +int;ExpandEnvironmentStrings;LPCTSTR lpSrc;LPTSTR lpDst;DWORD nSize; +int;ExpandEnvironmentStringsA;LPCTSTR lpSrc;LPTSTR lpDst;DWORD nSize; +int;ExpandEnvironmentStringsW;LPCTSTR lpSrc;LPTSTR lpDst;DWORD nSize; +int;FatalAppExit;UINT uAction;LPCTSTR lpMessageText; +int;FatalExit;int ExitCode; +int;FileTimeToDosDateTime;const FILETIME* lpFileTime;LPWORD lpFatDate;LPWORD lpFatTime; +int;FileTimeToLocalFileTime;const FILETIME* lpFileTime;LPFILETIME lpLocalFileTime; +int;FileTimeToSystemTime;const FILETIME* lpFileTime;LPSYSTEMTIME lpSystemTime; +int;FillConsoleOutputAttribute;HANDLE hConsoleOutput;WORD wAttribute;DWORD nLength;COORD dwWriteCoord;LPDWORD lpNumberOfAttrsWritten; +int;FillConsoleOutputCharacter;HANDLE hConsoleOutput;TCHAR cCharacter;DWORD nLength;COORD dwWriteCoord;LPDWORD lpNumberOfCharsWritten; +int;FillConsoleOutputCharacterA;HANDLE hConsoleOutput;TCHAR cCharacter;DWORD nLength;COORD dwWriteCoord;LPDWORD lpNumberOfCharsWritten; +int;FindActCtxSectionGuid;DWORD dwFlags;const GUID* lpExtensionGuid;DWORD ulSectionId;const GUID* lpGuidToFind;PACTCTX_SECTION_KEYED_DATA ReturnedData; +int;FindActCtxSectionString;DWORD dwFlags;const GUID* lpExtensionGuid;DWORD ulSectionId;LPCTSTR lpStringToFind;PACTCTX_SECTION_KEYED_DATA ReturnedData; +int;FindAtom;LPCTSTR lpString; +int;FindAtomA;LPCTSTR lpString; +int;FindAtomW;LPCTSTR lpString; +int;FindClose;HANDLE hFindFile; +int;FindCloseChangeNotification;HANDLE hChangeHandle; +int;FindCloseChangeNotificationA;HANDLE hChangeHandle; +int;FindCloseChangeNotificationW;HANDLE hChangeHandle; +int;FindFirstChangeNotification;LPCTSTR lpPathName;BOOL bWatchSubtree;DWORD dwNotifyFilter; +int;FindFirstChangeNotificationA;LPCTSTR lpPathName;BOOL bWatchSubtree;DWORD dwNotifyFilter; +int;FindFirstChangeNotificationW;LPCTSTR lpPathName;BOOL bWatchSubtree;DWORD dwNotifyFilter; +int;FindFirstFile;LPCTSTR lpFileName;LPWIN32_FIND_DATA lpFindFileData; +int;FindFirstFileA;LPCTSTR lpFileName;LPWIN32_FIND_DATA lpFindFileData; +int;FindFirstFileEx;LPCTSTR lpFileName;FINDEX_INFO_LEVELS fInfoLevelId;LPVOID lpFindFileData;FINDEX_SEARCH_OPS fSearchOp;LPVOID lpSearchFilter;DWORD dwAdditionalFlags; +int;FindFirstFileNameTransactedW;LPCWSTR lpFileName;DWORD dwFlags;LPDWORD StringLength;PWCHAR LinkName;HANDLE hTransaction; +int;FindFirstFileNameW;LPCWSTR lpFileName;DWORD dwFlags;LPDWORD StringLength;PWCHAR LinkName; +int;FindFirstFileTransacted;LPCTSTR lpFileName;FINDEX_INFO_LEVELS fInfoLevelId;LPVOID lpFindFileData;FINDEX_SEARCH_OPS fSearchOp;LPVOID lpSearchFilter;DWORD dwAdditionalFlags;HANDLE hTransaction; +int;FindFirstFileW;LPCTSTR lpFileName;LPWIN32_FIND_DATA lpFindFileData; +int;FindFirstStreamTransactedW;LPCWSTR lpFileName;STREAM_INFO_LEVELS InfoLevel;LPVOID lpFindStreamData;DWORD dwFlags;HANDLE hTransaction; +int;FindFirstStreamW;LPCWSTR lpFileName;STREAM_INFO_LEVELS InfoLevel;LPVOID lpFindStreamData;DWORD dwFlags; +int;FindNLSString;LCID Locale;DWORD dwFindNLSStringFlags;LPCWSTR lpStringSource;int cchSource;LPCWSTR lpStringValue;int cchValue;LPINT pcchFound; +int;FindNLSStringEx;LPCWSTR lpLocaleName;DWORD dwFindNLSStringFlags;LPCWSTR lpStringSource;int cchSource;LPCWSTR lpStringValue;int cchValue;LPINT pcchFound;LPNLSVERSIONINFO lpVersionInformation;LPVOID lpReserved;LPARAM lParam; +int;FindNextChangeNotification;HANDLE hChangeHandle ; +int;FindNextFile;HANDLE hFindFile;LPWIN32_FIND_DATA lpFindFileData; +int;FindNextFileA;HANDLE hFindFile;LPWIN32_FIND_DATA lpFindFileData; +int;FindNextFileNameW;HANDLE hFindStream;LPDWORD StringLength;PWCHAR LinkName; +int;FindNextFileW;HANDLE hFindFile;LPWIN32_FIND_DATA lpFindFileData; +int;FindNextStreamW;HANDLE hFindStream;LPVOID lpFindStreamData; +int;FindResource;HMODULE hModule;LPCTSTR lpName;LPCTSTR lpType; +int;FindResourceA;HMODULE hModule;LPCTSTR lpName;LPCTSTR lpType; +int;FindResourceEx;HMODULE hModule;LPCTSTR lpType;LPCTSTR lpName;WORD wLanguage; +int;FindResourceExA;HMODULE hModule;LPCTSTR lpType;LPCTSTR lpName;WORD wLanguage; +int;FindResourceExW;HMODULE hModule;LPCTSTR lpType;LPCTSTR lpName;WORD wLanguage; +int;FindResourceW;HMODULE hModule;LPCTSTR lpName;LPCTSTR lpType; +int;FindStringOrdinal;DWORD dwFindStringOrdinalFlags;LPCWSTR lpStringSource;int cchSource;LPCWSTR lpStringValue;int cchValue;BOOL bIgnoreCase; +int;FlsAlloc;PFLS_CALLBACK_FUNCTION lpCallback; +int;FlsFree;DWORD dwFlsIndex; +int;FlsGetValue;DWORD dwFlsIndex; +int;FlsSetValue;DWORD dwFlsIndex;PVOID lpFlsData; +int;FlushConsoleInputBuffer;HANDLE hConsoleInput; +int;FlushFileBuffers;HANDLE hFile; +int;FlushInstructionCache;HANDLE hProcess;LPCVOID lpBaseAddress;SIZE_T dwSize; +int;FlushProcessWriteBuffers;; +int;FlushViewOfFile;LPCVOID lpBaseAddress;SIZE_T dwNumberOfBytesToFlush; +int;FoldString;DWORD dwMapFlags;LPCTSTR lpSrcStr;int cchSrc;LPTSTR lpDestStr;int cchDest; +int;FormatMessage;DWORD dwFlags;LPCVOID lpSource;DWORD dwMessageId;DWORD dwLanguageId;LPTSTR lpBuffer;DWORD nSize;va_list* Arguments; +int;FormatMessageA;DWORD dwFlags;LPCVOID lpSource;DWORD dwMessageId;DWORD dwLanguageId;LPTSTR lpBuffer;DWORD nSize;va_list* Arguments; +int;FreeConsole;; +int;FreeEnvironmentStrings;LPTCH lpszEnvironmentBlock; +int;FreeEnvironmentStringsA;LPTCH lpszEnvironmentBlock; +int;FreeEnvironmentStringsW;LPTCH lpszEnvironmentBlock; +int;FreeLibrary;HMODULE hLibModule; +int;FreeLibraryAndExitThread;HMODULE hModule;DWORD dwExitCode; +int;FreeLibraryWhenCallbackReturns;PTP_CALLBACK_INSTANCE pci;HMODULE mod; +int;FreeResource;HGLOBAL HretResource; +int;FreeUserPhysicalPages;HANDLE hProcess;PULONG_PTR NumberOfPages;PULONG_PTR UserPfnArray; +int;GenerateConsoleCtrlEvent;DWORD dwCtrlEvent;DWORD dwProcessGroupId; +int;GetACP;; +int;GetActiveProcessorCount;WORD GroupNumber; +int;GetActiveProcessorGroupCount;; +int;GetApplicationRecoveryCallback;HANDLE hProcess;APPLICATION_RECOVERY_CALLBACK* pRecoveryCallback;PVOID* ppvParameter;DWORD dwPingInterval;DWORD dwFlags; +int;GetApplicationRestartSettings;HANDLE hProcess;PWSTR pwzCommandline;PDWORD pcchSize;PDWORD pdwFlags; +int;GetAtomName;ATOM nAtom;LPTSTR lpBuffer;int nSize; +int;GetAtomNameA;ATOM nAtom;LPTSTR lpBuffer;int nSize; +int;GetAtomNameW;ATOM nAtom;LPTSTR lpBuffer;int nSize; +int;GetBinaryType;LPCTSTR lpApplicationName;DWORD lpBinaryType; +int;GetBinaryTypeA;LPCTSTR lpApplicationName;DWORD lpBinaryType; +int;GetBinaryTypeW;LPCTSTR lpApplicationName;DWORD lpBinaryType; +int;GetCPInfo;UINT CodePage;LPCPINFO lpCPInfo; +int;GetCPInfoEx;UINT CodePage;DWORD dwFlags;LPCPINFOEX lpCPInfoEx; +int;GetCalendarDateFormatEx;LPCWSTR lpszLocale;DWORD dwFlags;const LPCALDATETIME lpCalDateTime;LPCWSTR lpFormat;LPWSTR lpDateStr;int cchDate; +int;GetCalendarInfo;LCID Locale;CALID Calendar;CALTYPE CalType;LPTSTR lpCalData;int cchData;LPDWORD lpValue; +int;GetCalendarInfoEx;LPCWSTR lpLocaleName;CALID Calendar;LPCWSTR lpReserved;CALTYPE CalType;LPWSTR lpCalData;int cchData;LPDWORD lpValue; +int;GetCalendarSupportedDateRange;CALID Calendar;LPCALDATETIME lpCalMinDateTime;LPCALDATETIME lpCalMaxDateTime; +int;GetCommConfig;HANDLE hCommDev;LPCOMMCONFIG lpCC;LPDWORD lpdwSize; +int;GetCommMask;HANDLE hFile;LPDWORD lpEvtMask; +int;GetCommModemStatus;HANDLE hFile;LPDWORD lpModemStat; +int;GetCommProperties;HANDLE hFile;LPCOMMPROP lpCommProp; +int;GetCommState;HANDLE hFile;LPDCB lpDCB; +int;GetCommTimeouts;HANDLE hFile;LPCOMMTIMEOUTS lpCommTimeouts; +int;GetCommandLine;; +int;GetCommandLineA;; +int;GetCommandLineW;; +int;GetCompressedFileSize;LPCTSTR lpFileName;LPDWORD lpFileSizeHigh; +int;GetCompressedFileSizeTransacted;LPCTSTR lpFileName;LPDWORD lpFileSizeHigh;HANDLE hTransaction; +int;GetComputerName;LPTSTR lpBuffer;LPDWORD lpnSize; +int;GetComputerNameA;LPTSTR lpBuffer;LPDWORD nBufferSize; +int;GetComputerNameEx;COMPUTER_NAME_FORMAT NameType;LPTSTR lpBuffer;LPDWORD lpnSize; +int;GetComputerNameW;LPTSTR lpBuffer;LPDWORD nBufferSize; +int;GetConsoleAlias;LPTSTR lpSource;LPTSTR lpTargetBuffer;DWORD TargetBufferLength;LPTSTR lpExeName; +int;GetConsoleAliasExes;LPTSTR lpExeNameBuffer;DWORD ExeNameBufferLength; +int;GetConsoleAliasExesLength;; +int;GetConsoleAliases;LPTSTR lpAliasBuffer;DWORD AliasBufferLength;LPTSTR lpExeName; +int;GetConsoleAliasesLength;LPTSTR lpExeName; +int;GetConsoleCP;; +int;GetConsoleCursorInfo;HANDLE hConsoleOutput;PCONSOLE_CURSOR_INFO lpConsoleCursorInfo; +int;GetConsoleDisplayMode;LPDWORD lpdwMode; +int;GetConsoleFontSize;HANDLE hConsoleOutput;DWORD nFont; +int;GetConsoleHistoryInfo;PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo; +int;GetConsoleMode;HANDLE hConsoleHandle;DWORD lpMode; +int;GetConsoleOriginalTitle;LPTSTR lpConsoleTitle;DWORD nSize; +int;GetConsoleOutputCP;; +int;GetConsoleProcessList;LPDWORD lpdwProcessList;DWORD dwProcessCount; +int;GetConsoleScreenBufferInfo;HANDLE hConsoleOutput;PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo; +int;GetConsoleScreenBufferInfoEx;HANDLE hConsoleOutput;PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx; +int;GetConsoleSelectionInfo;PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo; +int;GetConsoleTitle;LPTSTR lpConsoleTitle;DWORD nSize; +int;GetConsoleWindow;; +int;GetCurrencyFormat;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const CURRENCYFMT* lpFormat;LPTSTR lpCurrencyStr;int cchCurrency; +int;GetCurrencyFormatA;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const CURRENCYFMT* lpFormat;LPTSTR lpCurrencyStr;int cchCurrency; +int;GetCurrencyFormatEx;LPCWSTR lpLocaleName;DWORD dwFlags;LPCWSTR lpValue;const CURRENCYFMT* lpFormat;LPWSTR lpCurrencyStr;int cchCurrency; +int;GetCurrencyFormatW;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const CURRENCYFMT* lpFormat;LPTSTR lpCurrencyStr;int cchCurrency; +int;GetCurrentActCtx;HANDLE* lphActCtx; +int;GetCurrentConsoleFont;HANDLE hConsoleOutput;BOOL bMaximumWindow;PCONSOLE_FONT_INFO lpConsoleCurrentFont; +int;GetCurrentConsoleFontEx;HANDLE hConsoleOutput;BOOL bMaximumWindow;PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx; +int;GetCurrentDirectory;DWORD nBufferLength;LPTSTR lpBuffer; +int;GetCurrentDirectoryA;DWORD nBufferSize;LPTSTR lpBuffer; +int;GetCurrentDirectoryW;DWORD nBufferSize;LPTSTR lpBuffer; +int;GetCurrentProcess;; +int;GetCurrentProcessId;; +int;GetCurrentProcessorNumber;; +int;GetCurrentProcessorNumberEx;PPROCESSOR_NUMBER ProcNumber; +int;GetCurrentThread;; +int;GetCurrentThreadId;; +int;GetCurrentUmsThread;; +int;GetDateFormat;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpDate;LPCTSTR lpFormat;LPTSTR lpDateStr;int cchDate; +int;GetDateFormatA;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpDate;LPCTSTR lpFormat;LPTSTR lpDateStr;int cchDate; +int;GetDateFormatEx;LPCWSTR lpLocaleName;DWORD dwFlags;const SYSTEMTIME* lpDate;LPCWSTR lpFormat;LPWSTR lpDateStr;int cchDate;LPCWSTR lpCalendar; +int;GetDateFormatW;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpDate;LPCTSTR lpFormat;LPTSTR lpDateStr;int cchDate; +int;GetDefaultCommConfig;LPCTSTR lpszName;LPCOMMCONFIG lpCC;LPDWORD lpdwSize; +int;GetDeviceDriverBaseName;LPVOID ImageBase;LPTSTR lpBaseName;DWORD nSize; +int;GetDeviceDriverFileName;LPVOID ImageBase;LPTSTR lpFilename;DWORD nSize; +int;GetDevicePowerState;HANDLE hDevice;BOOL* pfOn; +int;GetDiskFreeSpace;LPCTSTR lpRootPathName;LPDWORD lpSectorsPerCluster;LPDWORD lpBytesPerSector;LPDWORD lpNumberOfFreeClusters;LPDWORD lpTotalNumberOfClusters; +int;GetDiskFreeSpaceA;LPCTSTR lpRootPathName;LPDWORD lpSectorsPerCluster;LPDWORD lpBytesPerSector;LPDWORD lpNumberOfFreeClusters;LPDWORD lpTotalNumberOfClusters; +int;GetDiskFreeSpaceEx;LPCTSTR lpDirectoryName;PULARGE_INTEGER lpFreeBytesAvailable;PULARGE_INTEGER lpTotalNumberOfBytes;PULARGE_INTEGER lpTotalNumberOfFreeBytes; +int;GetDiskFreeSpaceExA;LPCTSTR lpDirectoryName;PULARGE_INTEGER lpFreeBytesAvailableToCaller;PULARGE_INTEGER lpTotalNumberOfBytes;PULARGE_INTEGER lpTotalNumberOfFreeBytes; +int;GetDiskFreeSpaceExW;LPCTSTR lpDirectoryName;PULARGE_INTEGER lpFreeBytesAvailableToCaller;PULARGE_INTEGER lpTotalNumberOfBytes;PULARGE_INTEGER lpTotalNumberOfFreeBytes; +int;GetDiskFreeSpaceW;LPCTSTR lpRootPathName;LPDWORD lpSectorsPerCluster;LPDWORD lpBytesPerSector;LPDWORD lpNumberOfFreeClusters;LPDWORD lpTotalNumberOfClusters; +int;GetDllDirectory;DWORD nBufferLength;LPTSTR lpBuffer; +int;GetDurationFormat;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpDuration;ULONGLONG ullDuration;LPCWSTR lpFormat;LPWSTR lpDurationStr;int cchDuration; +int;GetDurationFormatEx;LPCWSTR lpLocaleName;DWORD dwFlags;const SYSTEMTIME* lpDuration;ULONGLONG ullDuration;LPCWSTR lpFormat;LPWSTR lpDurationStr;int cchDuration; +int;GetDynamicTimeZoneInformation;PDYNAMIC_TIME_ZONE_INFORMATION pTimeZoneInformation; +int;GetEnabledExtendedFeatures;DWORD64 FeatureMask; +int;GetEnvironmentStrings;; +int;GetEnvironmentStringsW;; +int;GetEnvironmentVariable;LPCTSTR lpName;LPTSTR lpBuffer;DWORD nSize; +int;GetEnvironmentVariableA;LPCTSTR lpName;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetEnvironmentVariableW;LPCTSTR lpName;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetErrorMode;; +int;GetExitCodeProcess;HANDLE hProcess;LPDWORD lpExitCode; +int;GetExitCodeThread;HANDLE hThread;LPDWORD lpExitCode; +int;GetExtendedContextLength;DWORD ContextFlags;PDWORD ContextLength; +int;GetExtendedFeaturesMask;PCONTEXT_EX ContextEx; +int;GetFileAttributes;LPCTSTR lpFileName; +int;GetFileAttributesA;LPCTSTR lpFileName; +int;GetFileAttributesEx;LPCTSTR lpFileName;GET_FILEEX_INFO_LEVELS fInfoLevelId;LPVOID lpFileInformation; +int;GetFileAttributesTransacted;LPCTSTR lpFileName;GET_FILEEX_INFO_LEVELS fInfoLevelId;LPVOID lpFileInformation;HANDLE hTransaction; +int;GetFileAttributesW;LPCTSTR lpFileName; +int;GetFileBandwidthReservation;HANDLE hFile;LPDWORD lpPeriodMilliseconds;LPDWORD lpBytesPerPeriod;LPBOOL pDiscardable;LPDWORD lpTransferSize;LPDWORD lpNumOutstandingRequests; +int;GetFileInformationByHandle;HANDLE hFile;LPBY_HANDLE_FILE_INFORMATION lpFileInformation; +int;GetFileInformationByHandleEx;HANDLE hFile;FILE_INFO_BY_HANDLE_CLASS FileInformationClass;LPVOID lpFileInformation;DWORD dwBufferSize; +int;GetFileSize;HANDLE hFile;LPDWORD lpFileSizeHigh; +int;GetFileSizeEx;HANDLE hFile;PLARGE_INTEGER lpFileSize; +int;GetFileTime;HANDLE hFile;LPFILETIME lpCreationTime;LPFILETIME lpLastAccessTime;LPFILETIME lpLastWriteTime; +int;GetFileType;HANDLE hFile; +int;GetFinalPathNameByHandle;HANDLE hFile;LPTSTR lpszFilePath;DWORD cchFilePath;DWORD dwFlags; +int;GetFirmwareEnvironmentVariable;LPCTSTR lpName;LPCTSTR lpGuid;PVOID pBuffer;DWORD nSize; +int;GetFullPathName;LPCTSTR lpFileName;DWORD nBufferLength;LPTSTR lpBuffer;LPTSTR* lpFilePart; +int;GetFullPathNameA;LPCTSTR lpFileName;DWORD nBufferSize;LPTSTR lpBuffer;LPTSTR* lpFilePart; +int;GetFullPathNameTransacted;LPCTSTR lpFileName;DWORD nBufferLength;LPTSTR lpBuffer;LPTSTR* lpFilePart;HANDLE hTransaction; +int;GetFullPathNameW;LPCTSTR lpFileName;DWORD nBufferSize;LPTSTR lpBuffer;LPTSTR* lpFilePart; +int;GetGeoInfo;GEOID Location;GEOTYPE GeoType;LPTSTR lpGeoData;int cchData;LANGID LangId; +int;GetHandleInformation;HANDLE hObject;LPDWORD lpdwFlags; +int;GetLargePageMinimum;; +int;GetLargestConsoleWindowSize;HANDLE hConsoleOutput; +int;GetLastError;; +int;GetLocalTime;LPSYSTEMTIME lpSystemTime; +int;GetLocaleInfo;LCID Locale;LCTYPE LCType;LPTSTR lpLCData;int cchData; +int;GetLocaleInfoA;LCID Locale;LCTYPE LCType;LPTSTR lpLCData;int cchData; +int;GetLocaleInfoEx;LPCWSTR lpLocaleName;LCTYPE LCType;LPWSTR lpLCData;int cchData; +int;GetLocaleInfoW;LCID Locale;LCTYPE LCType;LPTSTR lpLCData;int cchData; +int;GetLogicalProcessorInformation;PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer;PDWORD ReturnLength; +int;GetLogicalProcessorInformationEx;LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType;PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer;PDWORD ReturnedLength; +int;GetLongPathName;LPCTSTR lpszShortPath;LPTSTR lpszLongPath;DWORD cchBuffer; +int;GetLongPathNameA;LPCTSTR lpszShortPath;LPTSTR lpBuffer;DWORD nBuffer; +int;GetLongPathNameTransacted;LPCTSTR lpszShortPath;LPTSTR lpszLongPath;DWORD cchBuffer;HANDLE hTransaction; +int;GetLongPathNameW;LPCTSTR lpszShortPath;LPTSTR lpBuffer;DWORD nBuffer; +int;GetMailslotInfo;HANDLE hMailslot;LPDWORD lpMaxMessageSize;LPDWORD lpNextSize;LPDWORD lpMessageCount;LPDWORD lpReadTimeout; +int;GetMappedFileName;HANDLE hProcess;LPVOID lpv;LPTSTR lpFilename;DWORD nSize; +int;GetMaximumProcessorCount;WORD GroupNumber; +int;GetMaximumProcessorGroupCount;; +int;GetModuleBaseName;HANDLE hProcess;HMODULE hModule;LPTSTR lpBaseName;DWORD nSize; +int;GetModuleFileName;HMODULE hModule;LPTSTR lpFilename;DWORD nSize; +int;GetModuleFileNameA;HMODULE hModule;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetModuleFileNameEx;HANDLE hProcess;HMODULE hModule;LPTSTR lpFilename;DWORD nSize; +int;GetModuleFileNameExA;HANDLE hProcess;HMODULE hModule;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetModuleFileNameExW;HANDLE hProcess;HMODULE hModule;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetModuleFileNameW;HMODULE hModule;LPTSTR lpBuffer;DWORD nBufferSize; +int;GetModuleHandle;LPCTSTR lpModuleName; +int;GetModuleHandleA;LPCTSTR lpModuleName; +int;GetModuleHandleEx;DWORD dwFlags;LPCTSTR lpModuleName;HMODULE* phModule; +int;GetModuleHandleW;LPCTSTR lpModuleName; +int;GetModuleInformation;HANDLE hProcess;HMODULE hModule;LPMODULEINFO lpmodinfo;DWORD dwSizemodinfo; +int;GetNLSVersion;NLS_FUNCTION Function;LCID Locale;LPNLSVERSIONINFO lpVersionInformation; +int;GetNLSVersionEx;NLS_FUNCTION function;LPCWSTR lpLocaleName;LPNLSVERSIONINFOEX lpVersionInformation; +int;GetNativeSystemInfo;LPSYSTEM_INFO lpSystemInfo; +int;GetNextUmsListItem;PUMS_CONTEXT UmsContext; +int;GetNumaAvailableMemoryNode;UCHAR Node;PULONGLONG AvailableBytes; +int;GetNumaAvailableMemoryNodeEx;USHORT Node;PULONGLONG AvailableBytes; +int;GetNumaHighestNodeNumber;PULONG HighestNodeNumber; +int;GetNumaNodeNumberFromHandle;HANDLE hFile;PUSHORT NodeNumber; +int;GetNumaNodeProcessorMask;UCHAR Node;PULONGLONG ProcessorMask; +int;GetNumaNodeProcessorMaskEx;USHORT Node;PGROUP_AFFINITY ProcessorMask; +int;GetNumaProcessorNode;UCHAR Processor;PUCHAR NodeNumber; +int;GetNumaProcessorNodeEx;PPROCESSOR_NUMBER Processor;PUSHORT NodeNumber; +int;GetNumaProximityNode;ULONG ProximityId;PUCHAR NodeNumber; +int;GetNumaProximityNodeEx;ULONG ProximityId;PUSHORT NodeNumber; +int;GetNumberFormat;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const NUMBERFMT* lpFormat;LPTSTR lpNumberStr;int cchNumber; +int;GetNumberFormatA;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const NUMBERFMT* lpFormat;LPTSTR lpNumberStr;int cchNumber; +int;GetNumberFormatEx;LPCWSTR lpLocaleName;DWORD dwFlags;LPCWSTR lpValue;const NUMBERFMT* lpFormat;LPWSTR lpNumberStr;int cchNumber; +int;GetNumberFormatW;LCID Locale;DWORD dwFlags;LPCTSTR lpValue;const NUMBERFMT* lpFormat;LPTSTR lpNumberStr;int cchNumber; +int;GetNumberOfConsoleInputEvents;HANDLE hConsoleInput;LPDWORD lpcNumberOfEvents; +int;GetNumberOfConsoleMouseButtons;LPDWORD lpNumberOfMouseButtons; +int;GetOEMCP;; +int;GetOverlappedResult;HANDLE hFile;LPOVERLAPPED lpOverlapped;LPDWORD lpNumberOfBytesTransferred;BOOL bWait; +int;GetPerformanceInfo;PPERFORMANCE_INFORMATION pPerformanceInformation;DWORD cb; +int;GetPhysicallyInstalledSystemMemory;PULONGLONG TotalMemoryInKilobytes; +int;GetPriorityClass;HANDLE hProcess; +int;GetPrivateProfileInt;LPCTSTR lpAppName;LPCTSTR lpKeyName;INT nDefault;LPCTSTR lpFileName; +int;GetPrivateProfileIntA;LPCTSTR lpAppName;LPCTSTR lpKeyName;INT nDefault;LPCTSTR lpFileName; +int;GetPrivateProfileIntW;LPCTSTR lpAppName;LPCTSTR lpKeyName;INT nDefault;LPCTSTR lpFileName; +int;GetPrivateProfileSection;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileSectionA;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileSectionNames;LPTSTR lpszReturnBuffer;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileSectionW;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileString;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpReturnedString;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileStringA;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpBuffer;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileStringW;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpBuffer;DWORD nSize;LPCTSTR lpFileName; +int;GetPrivateProfileStruct;LPCTSTR lpszSection;LPCTSTR lpszKey;LPVOID lpStruct;UINT uSizeStruct;LPCTSTR szFile; +int;GetPrivateProfileStructA;LPCTSTR lpszSection;LPCTSTR lpszKey;LPVOID lpStruct;UINT uSizeStruct;LPCTSTR szFile; +int;GetProcAddress;HMODULE hModule;LPCSTR lpProcName; +int;GetProcessAffinityMask;HANDLE hProcess;PDWORD_PTR lpProcessAffinityMask;PDWORD_PTR lpSystemAffinityMask; +int;GetProcessDEPPolicy;HANDLE hProcess;LPDWORD lpFlags;PBOOL lpPermanent; +int;GetProcessGroupAffinity;HANDLE hProcess;PUSHORT GroupCount;PUSHORT GroupArray; +int;GetProcessHandleCount;HANDLE hProcess;PDWORD pdwHandleCount; +int;GetProcessHeap;; +int;GetProcessHeaps;DWORD NumberOfHeaps;PHANDLE ProcessHeaps; +int;GetProcessId;HANDLE Process; +int;GetProcessIdOfThread;HANDLE Thread; +int;GetProcessImageFileName;HANDLE hProcess;LPTSTR lpImageFileName;DWORD nSize; +int;GetProcessIoCounters;HANDLE hProcess;PIO_COUNTERS lpIoCounters; +int;GetProcessMemoryInfo;HANDLE Process;PPROCESS_MEMORY_COUNTERS ppsmemCounters;DWORD cb; +int;GetProcessPriorityBoost;HANDLE hProcess;PBOOL pDisablePriorityBoost; +int;GetProcessShutdownParameters;LPDWORD lpdwLevel;LPDWORD lpdwFlags; +int;GetProcessTimes;HANDLE hProcess;LPFILETIME lpCreationTime;LPFILETIME lpExitTime;LPFILETIME lpKernelTime;LPFILETIME lpUserTime; +int;GetProcessVersion;DWORD ProcessId; +int;GetProcessWorkingSetSize;HANDLE hProcess;PSIZE_T lpMinimumWorkingSetSize;PSIZE_T lpMaximumWorkingSetSize; +int;GetProcessWorkingSetSizeEx;HANDLE hProcess;PSIZE_T lpMinimumWorkingSetSize;PSIZE_T lpMaximumWorkingSetSize;PDWORD Flags; +int;GetProcessorSystemCycleTime;USHORT Group;PSYSTEM_PROCESSOR_CYCLE_TIME_INFORMATION Buffer;PDWORD ReturnedLength; +int;GetProductInfo;DWORD dwOSMajorVersion;DWORD dwOSMinorVersion;DWORD dwSpMajorVersion;DWORD dwSpMinorVersion;DWORD pdwReturnedProductType; +UINT;GetProfileInt;LPCTSTR lpAppName;LPCTSTR lpKeyName;INT nDefault; +UINT;GetProfileIntA;LPCTSTR lpAppName;LPCTSTR lpKeyName;INT nDefault; +UINT;GetProfileIntW;LPCTSTR lpAppName;LPCWSTR lpKeyName;INT nDefault; +int;GetProfileSection;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize; +int;GetProfileSectionA;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize; +int;GetProfileSectionW;LPCTSTR lpAppName;LPTSTR lpReturnedString;DWORD nSize; +int;GetProfileString;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpReturnedString;DWORD nSize; +int;GetProfileStringA;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpReturnedString;DWORD nSize; +int;GetProfileStringW;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpDefault;LPTSTR lpReturnedString;DWORD nSize; +int;GetQueuedCompletionStatus;HANDLE CompletionPort;LPDWORD lpNumberOfBytes;PULONG_PTR lpCompletionKey;LPOVERLAPPED* lpOverlapped;DWORD dwMilliseconds; +int;GetQueuedCompletionStatusEx;HANDLE CompletionPort;LPOVERLAPPED_ENTRY lpCompletionPortEntries;ULONG ulCount;PULONG ulNumEntriesRemoved;DWORD dwMilliseconds;BOOL fAlertable; +int;GetShortPathName;LPCTSTR lpszLongPath;LPTSTR lpszShortPath;DWORD cchBuffer; +int;GetShortPathNameA;LPCTSTR lpszLongPath;LPTSTR lpBuffer;DWORD cchBuffer; +int;GetShortPathNameW;LPCTSTR lpszLongPath;LPTSTR lpBuffer;DWORD cchBuffer; +int;GetStartupInfo;LPSTARTUPINFO lpStartupInfo; +int;GetStartupInfoA;LPSTARTUPINFO lpStartupInfo; +int;GetStartupInfoW;LPSTARTUPINFO lpStartupInfo; +int;GetStdHandle;DWORD nStdHandle; +int;GetStringScripts;DWORD dwFlags;LPCWSTR lpString;int cchString;LPWSTR lpScripts;int cchScripts; +int;GetStringTypeA;LCID Locale;DWORD dwInfoType;LPCSTR lpSrcStr;int cchSrc;LPWORD lpCharType; +int;GetStringTypeEx;LCID Locale;DWORD dwInfoType;LPCTSTR lpSrcStr;int cchSrc;LPWORD lpCharType; +int;GetStringTypeExA;LCID Locale;DWORD dwInfoType;LPCTSTR lpSrcStr;int cchSrc;LPWORD lpCharType; +int;GetStringTypeExW;LCID Locale;DWORD dwInfoType;LPCTSTR lpSrcStr;int cchSrc;LPWORD lpCharType; +int;GetStringTypeW;DWORD Locale;LPCWSTR dwInfoType;int lpSrcStr;LPWORD cchSrc;LPWORD lpCharType; +int;GetSystemDEPPolicy;; +int;GetSystemDefaultLCID;; +int;GetSystemDefaultLangID;; +int;GetSystemDefaultLocaleName;LPWSTR lpLocaleName;int cchLocaleName; +int;GetSystemDirectory;LPTSTR lpBuffer;UINT uSize; +int;GetSystemDirectoryA;LPTSTR lpBuffer;UINT nBufferSize; +int;GetSystemDirectoryW;LPTSTR lpBuffer;UINT nBufferSize; +int;GetSystemFileCacheSize;PSIZE_T lpMinimumFileCacheSize;PSIZE_T lpMaximumFileCacheSize;PDWORD lpFlags; +int;GetSystemFirmwareTable;DWORD FirmwareTableProviderSignature;DWORD FirmwareTableID;PVOID pFirmwareTableBuffer;DWORD BufferSize; +int;GetSystemInfo;LPSYSTEM_INFO lpSystemInfo; +int;GetSystemPowerStatus;LPSYSTEM_POWER_STATUS lpSystemPowerStatus; +int;GetSystemRegistryQuota;PDWORD pdwQuotaAllowed;PDWORD pdwQuotaUsed; +int;GetSystemTime;LPSYSTEMTIME lpSystemTime; +int;GetSystemTimeAdjustment;PDWORD lpTimeAdjustment;PDWORD lpTimeIncrement;PBOOL lpTimeAdjustmentDisabled; +int;GetSystemTimeAsFileTime;LPFILETIME lpSystemTimeAsFileTime; +int;GetSystemTimes;LPFILETIME lpIdleTime;LPFILETIME lpKernelTime;LPFILETIME lpUserTime; +int;GetSystemWindowsDirectory;LPTSTR lpBuffer;UINT uSize; +int;GetSystemWow64Directory;LPTSTR lpBuffer;UINT uSize; +int;GetTapeParameters;HANDLE hDevice;DWORD dwOperation;LPDWORD lpdwSize;LPVOID lpTapeInformation; +int;GetTapePosition;HANDLE hDevice;DWORD dwPositionType;LPDWORD lpdwPartition;LPDWORD lpdwOffsetLow;LPDWORD lpdwOffsetHigh; +int;GetTapeStatus;HANDLE hDevice; +int;GetTempFileName;LPCTSTR lpPathName;LPCTSTR lpPrefixString;UINT uUnique;LPTSTR lpTempFileName; +int;GetTempFileNameA;LPCTSTR lpPathName;LPCTSTR lpPrefixString;UINT uUnique;LPTSTR lpTempFileName; +int;GetTempFileNameW;LPCTSTR lpPathName;LPCTSTR lpPrefixString;UINT uUnique;LPTSTR lpTempFileName; +int;GetTempPath;DWORD nBufferLength;LPTSTR lpBuffer; +int;GetTempPathA;DWORD nBufferSize;LPTSTR lpBuffer; +int;GetTempPathW;DWORD nBufferSize;LPTSTR lpBuffer; +int;GetThreadContext;HANDLE hThread;LPCONTEXT lpContext; +int;GetThreadErrorMode;; +int;GetThreadGroupAffinity;HANDLE hThread;PGROUP_AFFINITY GroupAffinity; +int;GetThreadIOPendingFlag;HANDLE hThread;PBOOL lpIOIsPending; +int;GetThreadId;HANDLE Thread; +int;GetThreadIdealProcessorEx;HANDLE hThread;PPROCESSOR_NUMBER lpIdealProcessor; +int;GetThreadLocale;; +int;GetThreadPriority;HANDLE hThread; +int;GetThreadPriorityBoost;HANDLE hThread;PBOOL pDisablePriorityBoost; +int;GetThreadSelectorEntry;HANDLE hThread;DWORD dwSelector;LPLDT_ENTRY lpSelectorEntry; +int;GetThreadTimes;HANDLE hThread;LPFILETIME lpCreationTime;LPFILETIME lpExitTime;LPFILETIME lpKernelTime;LPFILETIME lpUserTime; +int;GetTickCount;; +int;GetTickCount64;; +int;GetTimeFormat;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpTime;LPCTSTR lpFormat;LPTSTR lpTimeStr;int cchTime; +int;GetTimeFormatA;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpTime;LPCTSTR lpFormat;LPTSTR lpTimeStr;int cchTime; +int;GetTimeFormatEx;LPCWSTR lpLocaleName;DWORD dwFlags;const SYSTEMTIME* lpTime;LPCWSTR lpFormat;LPWSTR lpTimeStr;int cchTime; +int;GetTimeFormatW;LCID Locale;DWORD dwFlags;const SYSTEMTIME* lpTime;LPCTSTR lpFormat;LPTSTR lpTimeStr;int cchTime; +int;GetTimeZoneInformation;LPTIME_ZONE_INFORMATION lpTimeZoneInformation; +int;GetTimeZoneInformationForYear;USHORT wYear;PDYNAMIC_TIME_ZONE_INFORMATION pdtzi;LPTIME_ZONE_INFORMATION ptzi; +int;GetUmsCompletionListEvent;PUMS_COMPLETION_LIST UmsCompletionList;PHANDLE UmsCompletionEvent; +int;GetUserDefaultLCID;; +int;GetUserDefaultLangID;; +int;GetUserDefaultLocaleName;LPWSTR lpLocaleName;int cchLocaleName; +int;GetUserGeoID;GEOCLASS GeoClass; +int;GetVersion;; +bool;GetVersionEx;LPOSVERSIONINFO lpVersionInfo; +bool;GetVersionExA;LPOSVERSIONINFO lpVersionInformation; +bool;GetVersionExW;LPOSVERSIONINFO lpVersionInformation; +int;GetWindowsDirectory;LPTSTR lpBuffer;UINT uSize; +int;GetWindowsDirectoryA;LPTSTR lpBuffer;UINT nBufferSize; +int;GetWindowsDirectoryW;LPTSTR lpBuffer;UINT nBufferSize; +int;GetWriteWatch;DWORD dwFlags;PVOID lpBaseAddress;SIZE_T dwRegionSize;PVOID* lpAddresses;PULONG_PTR lpdwCount;PULONG lpdwGranularity; +int;GetWsChanges;HANDLE hProcess;PPSAPI_WS_WATCH_INFORMATION lpWatchInfo;DWORD cb; +int;GetWsChangesEx;HANDLE hProcess;PPSAPI_WS_WATCH_INFORMATION_EX lpWatchInfoEx;DWORD cb; +int;GlobalAddAtom;LPCTSTR lpString; +int;GlobalAddAtomA;LPCTSTR lpString; +int;GlobalAddAtomW;LPCTSTR lpString; +int;GlobalAlloc;UINT uFlags;SIZE_T dwBytes; +int;GlobalDeleteAtom;ATOM nAtom; +int;GlobalFindAtom;LPCTSTR lpString; +int;GlobalFindAtomA;LPCTSTR AtomName; +int;GlobalFindAtomW;LPCTSTR AtomName; +int;GlobalFlags;HGLOBAL hMem; +int;GlobalFree;HGLOBAL hMem; +int;GlobalGetAtomName;ATOM nAtom;LPTSTR lpBuffer;int nSize; +int;GlobalGetAtomNameA;ATOM nAtom;LPTSTR lpBuffer;int nBufferSize; +int;GlobalGetAtomNameW;ATOM nAtom;LPTSTR lpBuffer;int nBufferSize; +int;GlobalHandle;LPCVOID hMem; +int;GlobalLock;HGLOBAL hMem; +int;GlobalMemoryStatus;LPMEMORYSTATUS lpMemBuffer; +int;GlobalMemoryStatusEx;LPMEMORYSTATUSEX lpBuffer; +int;GlobalReAlloc;HGLOBAL hMem;SIZE_T dwBytes;UINT uFlags; +int;GlobalSize;HGLOBAL hMem; +int;GlobalUnlock;HGLOBAL hMem; +int;Heap32First;LPHEAPENTRY32 lphe;DWORD th32ProcessID;ULONG_PTR th32HeapID; +int;Heap32ListFirst;HANDLE hSnapshot;LPHEAPLIST32 lphl; +int;Heap32ListNext;HANDLE hSnapshot;LPHEAPLIST32 lphl; +int;Heap32Next;LPHEAPENTRY32 lphe; +int;HeapAlloc;HANDLE hHeap;DWORD Flags;SIZE_T HeapSize; +int;HeapCompact;HANDLE hHeap;DWORD dwFlags; +int;HeapCreate;DWORD flOptions;SIZE_T dwInitialSize;SIZE_T dwMaximumSize; +int;HeapDestroy;HANDLE hHeap; +int;HeapFree;HANDLE hHeap; +int;HeapLock;HANDLE hHeap; +int;HeapQueryInformation;HANDLE HeapHandle;HEAP_INFORMATION_CLASS HeapInformationClass;PVOID HeapInformation;SIZE_T HeapInformationLength;PSIZE_T ReturnLength; +int;HeapReAlloc;HANDLE hHeap;DWORD Flags;LPVOID pMemory;SIZE_T NewSize; +int;HeapSetInformation;HANDLE HeapHandle;HEAP_INFORMATION_CLASS HeapInformationClass;PVOID HeapInformation;SIZE_T HeapInformationLength; +int;HeapSize;HANDLE hHeap;DWORD dwFlags;LPCVOID lpMem; +int;HeapUnlock;HANDLE hHeap; +int;HeapValidate;HANDLE hHeap;DWORD dwFlags;LPCVOID lpMem; +int;HeapWalk;HANDLE hHeap;LPPROCESS_HEAP_ENTRY lpEntry; +int;InitAtomTable;DWORD nSize; +int;InitOnceBeginInitialize;LPINIT_ONCE lpInitOnce;DWORD dwFlags;PBOOL fPending;LPVOID* lpContext; +int;InitOnceComplete;LPINIT_ONCE lpInitOnce;DWORD dwFlags;LPVOID lpContext; +int;InitOnceExecuteOnce;PINIT_ONCE InitOnce;PINIT_ONCE_FN InitFn;PVOID Parameter;LPVOID* Context; +int;InitOnceInitialize;PINIT_ONCE InitOnce; +int;InitializeConditionVariable;PCONDITION_VARIABLE ConditionVariable; +int;InitializeCriticalSection;LPCRITICAL_SECTION lpCriticalSection; +int;InitializeCriticalSectionAndSpinCount;LPCRITICAL_SECTION lpCriticalSection; +int;InitializeCriticalSectionEx;LPCRITICAL_SECTION lpCriticalSection;DWORD dwSpinCount;DWORD Flags; +int;InitializeExtendedContext;PVOID Context;DWORD ContextFlags;PCONTEXT_EX* ContextEx; +int;InitializeProcThreadAttributeList;LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;DWORD dwAttributeCount;DWORD dwFlags;PSIZE_T lpSize; +int;InitializeProcessForWsWatch;HANDLE hProcess; +int;InitializeSListHead;PSLIST_HEADER ListHead; +int;InitializeSRWLock;PSRWLOCK SRWLock; +int;InterlockedCompareExchange;LONG volatile* Destination;LONG Exchange;LONG Comperand; +int;InterlockedCompareExchange64;LONGLONG volatile* Destination;LONGLONG Exchange;LONGLONG Comparand; +int;InterlockedDecrement;LONG volatile* lpAddend; +int;InterlockedExchange;DWORD Target;DWORD Value; +int;InterlockedExchange;LONG volatile* Target;LONG Value; +int;InterlockedExchangeAdd;LONG volatile* Addend;LONG Increment; +int;InterlockedFlushSList;PSLIST_HEADER ListHead; +int;InterlockedIncrement;LONG volatile* lpAddend; +int;InterlockedPopEntrySList;PSLIST_HEADER ListHead; +int;InterlockedPushEntrySList;PSLIST_HEADER ListHead;PSLIST_ENTRY ListEntry; +int;IsBadCodePtr;FARPROC lpfn; +int;IsBadReadPtr;const VOID* lp;UINT_PTR ucb; +int;IsBadStringPtr;LPCTSTR lpsz;UINT_PTR ucchMax; +int;IsBadStringPtrA;LPCTSTR lpsz;UINT_PTR ucchMax; +int;IsBadStringPtrW;LPCTSTR lpsz;UINT_PTR ucchMax; +int;IsBadWritePtr;LPVOID lp;UINT_PTR ucb; +int;IsCalendarLeapYear;CALID calId;UINT year;UINT era; +int;IsDBCSLeadByte;BYTE TestChar; +int;IsDBCSLeadByteEx;UINT CodePage;BYTE TestChar; +int;IsDebuggerPresent;; +int;IsNLSDefinedString;NLS_FUNCTION Function;DWORD dwFlags;LPNLSVERSIONINFO lpVersionInformation;LPCWSTR lpString;INT cchStr; +int;IsProcessInJob;HANDLE ProcessHandle;HANDLE JobHandle;PBOOL Result; +int;IsProcessorFeaturePresent;DWORD ProcessorFeature; +int;IsSystemResumeAutomatic;; +int;IsThreadAFiber;; +int;IsThreadpoolTimerSet;PTP_TIMER pti; +int;IsValidCodePage;UINT CodePage; +int;IsValidLanguageGroup;LGRPID LanguageGroup;DWORD dwFlags; +int;IsValidLocale;LCID Locale;DWORD dwFlags; +int;IsValidLocaleName;LPCWSTR lpLocaleName; +int;IsWow64Process;HANDLE hProcess;PBOOL Wow64Process; +int;LCIDToLocaleName;LCID Locale;LPWSTR lpName;int cchName;DWORD dwFlags; +int;LCMapString;LCID Locale;DWORD dwMapFlags;LPCTSTR lpSrcStr;int cchSrc;LPTSTR lpDestStr;int cchDest; +int;LCMapStringA;LCID Locale;DWORD dwCmpFlags;LPCTSTR lpString1;int cchCount1;LPTSTR lpString2;int cchCount2; +int;LCMapStringEx;LPCWSTR lpLocaleName;DWORD dwMapFlags;LPCWSTR lpSrcStr;int cchSrc;LPWSTR lpDestStr;int cchDest;LPNLSVERSIONINFO lpVersionInformation;LPVOID lpReserved;LPARAM lParam; +int;LCMapStringW;LCID Locale;DWORD dwMapFlags;LPCTSTR lpSrcStr;int cchSrc;LPTSTR lpDestStr;int cchDest; +int;LeaveCriticalSection;LPCRITICAL_SECTION lpCriticalSection; +int;LeaveCriticalSectionWhenCallbackReturns;PTP_CALLBACK_INSTANCE pci;PCRITICAL_SECTION pcs; +int;LoadLibrary;LPCTSTR lpFileName; +int;LoadLibraryA;LPCTSTR lpLibFileName; +int;LoadLibraryEx;LPCTSTR lpFileName;HANDLE hFile;DWORD dwFlags; +int;LoadLibraryExA;LPCTSTR pLibFileName;HANDLE hFile;DWORD dwFlags; +int;LoadLibraryExW;LPCTSTR pLibFileName;HANDLE hFile;DWORD dwFlags; +int;LoadLibraryW;LPCTSTR lpLibFileName; +int;LoadModule;LPCSTR lpModuleName;LPVOID lpParameterBlock; +int;LoadResource;HMODULE hModule;HRSRC hResInfo; +HLOCAL;LocalAlloc;UINT uFlags;SIZE_T uBytes; +int;LocalFileTimeToFileTime;const FILETIME* lpLocalFileTime;LPFILETIME lpFileTime; +int;LocalFlags;HLOCAL hMem; +int;LocalFree;HLOCAL hMem; +int;LocalHandle;LPCVOID pMem; +int;LocalLock;HLOCAL hMem; +HLOCAL;LocalReAlloc;HLOCAL hMem; SIZE_T uBytes; UINT uFlags; +int;LocalSize;HLOCAL hMem; +int;LocalUnlock;HLOCAL hMem; +int;LocaleNameToLCID;LPCWSTR lpName;DWORD dwFlags; +int;LocateExtendedFeature;PCONTEXT_EX ContextEx;DWORD FeatureId;PDWORD Length; +int;LocateLegacyContext;PCONTEXT_EX ContextEx;PDWORD Length; +int;LockFile;HANDLE hFile;DWORD dwFileOffsetLow;DWORD dwFileOffsetHigh;DWORD nNumberOfBytesToLockLow;DWORD nNumberOfBytesToLockHigh; +int;LockFileEx;HANDLE hFile;DWORD dwFlags;DWORD dwReserved;DWORD nNumberOfBytesToLockLow;DWORD nNumberOfBytesToLockHigh;LPOVERLAPPED lpOverlapped; +int;LockResource;HGLOBAL hResInfo; +int;MapUserPhysicalPages;PVOID lpAddress;ULONG_PTR NumberOfPages;PULONG_PTR UserPfnArray; +int;MapUserPhysicalPagesScatter;PVOID* VirtualAddresses;ULONG_PTR NumberOfPages;PULONG_PTR PageArray; +int;MapViewOfFile;HANDLE hFileMappingObject;DWORD dwDesiredAccess;DWORD dwFileOffsetHigh;DWORD dwFileOffsetLow;SIZE_T dwNumberOfBytesToMap; +int;MapViewOfFileEx;HANDLE hFileMappingObject;DWORD dwDesiredAccess;DWORD dwFileOffsetHigh;DWORD dwFileOffsetLow;SIZE_T dwNumberOfBytesToMap;LPVOID lpBaseAddress; +int;MapViewOfFileExNuma;HANDLE hFileMappingObject;DWORD dwDesiredAccess;DWORD dwFileOffsetHigh;DWORD dwFileOffsetLow;SIZE_T dwNumberOfBytesToMap;LPVOID lpBaseAddress;DWORD nndPreferred; +int;Module32First;HANDLE hModuleSnap;LPMODULEENTRY32 lpme; +int;Module32FirstW;HANDLE hSnapshot;LPMODULEENTRY32 lpme; +int;Module32Next;HANDLE hModuleSnap;LPMODULEENTRY32 lpme; +int;Module32NextW;HANDLE hSnapshot;LPMODULEENTRY32 lpme; +int;MoveFile;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName; +int;MoveFileA;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName; +int;MoveFileEx;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;DWORD dwFlags; +int;MoveFileTransacted;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;LPPROGRESS_ROUTINE lpProgressRoutine;LPVOID lpData;DWORD dwFlags;HANDLE hTransaction; +int;MoveFileW;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName; +int;MoveFileWithProgress;LPCTSTR lpExistingFileName;LPCTSTR lpNewFileName;LPPROGRESS_ROUTINE lpProgressRoutine;LPVOID lpData;DWORD dwFlags; +int;MultiByteToWideChar;UINT CodePage;DWORD dwFlags;LPCSTR lpMultiByteStr;int cchMultiByte;LPWSTR lpwcBuffer;int nBuffer; +int;NeedCurrentDirectoryForExePath;LPCTSTR ExeName; +int;OpenEvent;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenEventA;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenEventW;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenFile;LPCSTR lpFileName;LPOFSTRUCT lpReOpenBuff;DWORD uStyle; +int;OpenFileById;HANDLE hFile;LPFILE_ID_DESCRIPTOR lpFileID;DWORD dwDesiredAccess;DWORD dwShareMode;LPSECURITY_ATTRIBUTES lpSecurityAttributes;DWORD dwFlags; +int;OpenFileMapping;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenFileMappingA;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenFileMappingW;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenJobObject;DWORD dwDesiredAccess;BOOL bInheritHandles;LPCTSTR lpName; +int;OpenMutex;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenMutexA;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenMutexW;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenPrivateNamespace;LPVOID lpBoundaryDescriptor;LPCTSTR lpAliasPrefix; +int;OpenProcess;DWORD dwDesiredAccess;BOOL bInheritHandle;DWORD dwProcessId; +int;OpenSemaphore;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpName; +int;OpenThread;DWORD dwDesiredAccess;BOOL bInheritHandle;DWORD dwThreadId; +int;OpenWaitableTimer;DWORD dwDesiredAccess;BOOL bInheritHandle;LPCTSTR lpTimerName; +int;OutputDebugString;LPCTSTR lpOutputString; +int;OutputDebugStringA;LPCTSTR lpOutputString; +int;OutputDebugStringW;LPCTSTR lpOutputString; +int;PeekConsoleInput;HANDLE hConsoleInput;PINPUT_RECORD lpBuffer;DWORD nLength;LPDWORD lpNumberOfEventsRead; +int;PostQueuedCompletionStatus;HANDLE CompletionPort;DWORD dwNumberOfBytesTransferred;ULONG_PTR dwCompletionKey;LPOVERLAPPED lpOverlapped; +int;PowerClearRequest;HANDLE PowerRequest;POWER_REQUEST_TYPE RequestType; +int;PowerCreateRequest;PREASON_CONTEXT Context; +int;PowerSetRequest;HANDLE PowerRequest;POWER_REQUEST_TYPE RequestType; +int;PrepareTape;HANDLE hDevice;DWORD dwOperation;BOOL bImmediate; +int;Process32First;HANDLE hSnapshot;LPPROCESSENTRY32 lppe; +int;Process32FirstW;HANDLE hSnapshot;LPPROCESSENTRY32 lppe; +int;Process32Next;HANDLE hSnapshot;LPPROCESSENTRY32 lppe; +int;Process32NextW;HANDLE hSnapshot;LPPROCESSENTRY32 lppe; +int;ProcessIdToSessionId;DWORD dwProcessId;DWORD* pSessionId; +int;PulseEvent;HANDLE hEvent; +int;PurgeComm;HANDLE hFile;DWORD dwFlags; +int;QueryActCtxSettingsW;DWORD dwFlags;HANDLE hActCtx;PCWSTR settingsNameSpace;PCWSTR settingName;PWSTR pvBuffer;SIZE_T dwBuffer;SIZE_T* pdwWrittenOrRequired; +int;QueryActCtxW;DWORD dwFlags;HANDLE hActCtx;PVOID pvSubInstance;UINT ulInfoClass;PVOID pvBuffer;SIZE_T cbBuffer;SIZE_T* pcbWrittenOrRequired; +int;QueryDepthSList;PSLIST_HEADER ListHead; +int;QueryFullProcessImageName;HANDLE hProcess;DWORD dwFlags;LPTSTR lpExeName;PDWORD lpdwSize; +int;QueryIdleProcessorCycleTime;PULONG BufferLength;PULONG64 ProcessorIdleCycleTime; +int;QueryIdleProcessorCycleTimeEx;USHORT Group;PULONG BufferLength;PULONG64 ProcessorIdleCycleTime; +int;QueryInformationJobObject;HANDLE hJob;JOBOBJECTINFOCLASS JobObjectInfoClass;LPVOID lpJobObjectInfo;DWORD cbJobObjectInfoLength;LPDWORD lpReturnLength; +int;QueryMemoryResourceNotification;HANDLE ResourceNotificationHandle;PBOOL ResourceState; +int;QueryPerformanceCounter;LARGE_INTEGER* lpPerformanceCount; +int;QueryPerformanceFrequency;LARGE_INTEGER* lpFrequency; +int;QueryProcessAffinityUpdateMode;HANDLE ProcessHandle;DWORD lpdwFlags; +int;QueryProcessCycleTime;HANDLE ProcessHandle;PULONG64 CycleTime; +int;QueryThreadCycleTime;HANDLE ThreadHandle;PULONG64 CycleTime; +int;QueryThreadpoolStackInformation;PTP_POOL ptpp;PTP_POOL_STACK_INFORMATION ptpsi; +int;QueryUmsThreadInformation;PUMS_CONTEXT UmsThread;UMS_THREAD_INFO_CLASS UmsThreadInfoClass;PVOID UmsThreadInformation;ULONG UmsThreadInformationLength;PULONG ReturnLength; +int;QueryUnbiasedInterruptTime;PULONGLONG UnbiasedTime; +int;QueryWorkingSet;HANDLE hProcess;PVOID pv;DWORD cb; +int;QueryWorkingSetEx;HANDLE hProcess;PVOID pv;DWORD cb; +int;QueueUserAPC;PAPCFUNC pfnAPC;HANDLE hThread;ULONG_PTR dwData; +int;QueueUserWorkItem;LPTHREAD_START_ROUTINE Function;PVOID Context;DWORD Flags; +int;RaiseException;DWORD dwExceptionCode;DWORD dwExceptionFlags;DWORD nNumberOfArguments;const ULONG_PTR* lpArguments; +int;RaiseFailFastException;PEXCEPTION_RECORD pExceptionRecord;PCONTEXT pContextRecord;DWORD dwFlags; +int;ReOpenFile;HANDLE hOriginalFile;DWORD dwDesiredAccess;DWORD dwShareMode;DWORD dwFlags; +int;ReadConsole;HANDLE hConsoleInput;LPVOID lpBuffer;DWORD nNumberOfCharsToRead;LPDWORD lpNumberOfCharsRead;LPVOID pInputControl; +int;ReadConsoleInput;HANDLE hConsoleInput;PINPUT_RECORD lpBuffer;DWORD nLength;LPDWORD lpNumberOfEventsRead; +int;ReadConsoleInputA;HANDLE hConsoleInput;PINPUT_RECORD lpInputRecord;DWORD nLength;LPDWORD lpNumberOfEventsRead; +int;ReadConsoleOutput;HANDLE hConsoleOutput;PCHAR_INFO lpBuffer;COORD dwBufferSize;COORD dwBufferCoord;PSMALL_RECT lpReadRegion; +int;ReadConsoleOutputAttribute;HANDLE hConsoleOutput;LPWORD lpAttribute;DWORD nLength;COORD dwReadCoord;LPDWORD lpNumberOfAttrsRead; +int;ReadConsoleOutputCharacter;HANDLE hConsoleOutput;LPTSTR lpCharacter;DWORD nLength;COORD dwReadCoord;LPDWORD lpNumberOfCharsRead; +int;ReadDirectoryChangesW;HANDLE hDirectory;LPVOID lpBuffer;DWORD nBufferLength;BOOL bWatchSubtree;DWORD dwNotifyFilter;LPDWORD lpBytesReturned;LPOVERLAPPED lpOverlapped;LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; +bool;ReadFile;HANDLE hFile;LPVOID lpBuffer;DWORD nNumberOfBytesToRead;LPDWORD lpNumberOfBytesRead;LPOVERLAPPED lpOverlapped; +int;ReadFileEx;HANDLE hFile;LPVOID lpBuffer;DWORD nNumberOfBytesToRead;LPOVERLAPPED lpOverlapped;LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; +int;ReadFileScatter;HANDLE hFile;FILE_SEGMENT_ELEMENT aSegmentArray;DWORD nNumberOfBytesToRead;LPDWORD lpReserved;LPOVERLAPPED lpOverlapped; +int;ReadProcessMemory;HANDLE hProcess;LPCVOID lpBaseAddress;LPVOID lpStockBuffer;SIZE_T nSize;SIZE_T* lpNumberOfBytesRead; +int;RegisterApplicationRecoveryCallback;APPLICATION_RECOVERY_CALLBACK pRecoveryCallback;PVOID pvParameter;DWORD dwPingInterval;DWORD dwFlags; +int;RegisterApplicationRestart;PCWSTR pwzCommandline;DWORD dwFlags; +int;RegisterWaitForSingleObject;PHANDLE phNewWaitObject;HANDLE hObject;WAITORTIMERCALLBACK Callback;PVOID Context;DWORD dwMilliseconds;DWORD dwFlags; +int;ReleaseActCtx;HANDLE hActCtx; +int;ReleaseMutex;HANDLE hMutex; +int;ReleaseMutexWhenCallbackReturns;PTP_CALLBACK_INSTANCE pci;HANDLE mut; +int;ReleaseSRWLockExclusive;PSRWLOCK SRWLock; +int;ReleaseSRWLockShared;PSRWLOCK SRWLock; +int;ReleaseSemaphore;HANDLE hSemaphore;LONG lReleaseCount;LPLONG lpPreviousCount; +int;ReleaseSemaphoreWhenCallbackReturns;PTP_CALLBACK_INSTANCE pci;HANDLE sem;DWORD crel; +int;RemoveDirectory;LPCTSTR lpPathName; +int;RemoveDirectoryA;LPCTSTR lpPathName; +int;RemoveDirectoryTransacted;LPCTSTR lpPathName;HANDLE hTransaction; +int;RemoveDirectoryW;LPCTSTR lpPathName; +int;RemoveSecureMemoryCacheCallback;PSECURE_MEMORY_CACHE_CALLBACK pfnCallBack; +int;RemoveVectoredContinueHandler;PVOID Handler; +int;RemoveVectoredExceptionHandler;PVOID Handler; +int;ReplaceFile;LPCTSTR lpReplacedFileName;LPCTSTR lpReplacementFileName;LPCTSTR lpBackupFileName;DWORD dwReplaceFlags;LPVOID lpExclude;LPVOID lpReserved; +int;RequestWakeupLatency;LATENCY_TIME latency; +int;ResetEvent;HANDLE hEvent; +int;ResetWriteWatch;LPVOID lpBaseAddress;SIZE_T dwRegionSize; +int;ResolveLocaleName;LPCWSTR lpNameToResolve;LPWSTR lpLocaleName;int cchLocaleName; +int;ResumeThread;HANDLE hThread; +int;RtlAddFunctionTable;PRUNTIME_FUNCTION FunctionTable;DWORD EntryCount;DWORD64 BaseAddress;ULONGLONG TargetGp; +int;RtlCaptureContext;PCONTEXT ContextRecord; +int;RtlCaptureStackBackTrace;ULONG FramesToSkip;ULONG FramesToCapture;PVOID* BackTrace;PULONG BackTraceHash; +int;RtlDeleteFunctionTable;PRUNTIME_FUNCTION FunctionTable; +int;RtlInstallFunctionTableCallback;DWORD64 TableIdentifier;DWORD64 BaseAddress;DWORD Length;PGET_RUNTIME_FUNCTION_CALLBACK Callback;PVOID Context;PCWSTR OutOfProcessCallbackDll; +int;RtlIsValidLocaleName;LPCWSTR LocaleName;ULONG Flags; +int;RtlLookupFunctionEntry;ULONGLONG ControlPC;PULONGLONG ImageBase;PULONGLONG TargetGp; +int;RtlPcToFileHeader;PVOID PcValue;PVOID* BaseOfImage; +int;RtlRestoreContext;PCONTEXT ContextRecord;PEXCEPTION_RECORD ExceptionRecord; +int;ScrollConsoleScreenBuffer;HANDLE hConsoleOutput;const SMALL_RECT* lpScrollRectangle;const SMALL_RECT* lpClipRectangle;COORD dwDestinationOrigin;const CHAR_INFO* lpFill; +int;ScrollConsoleScreenBufferA;HANDLE hConsoleOutput;const SMALL_RECT* lpScrollRectangle;const SMALL_RECT* lpClipRectangle;COORD dwDestinationOrigin;const CHAR_INFO* lpFill; +int;SearchPath;LPCTSTR lpPath;LPCTSTR lpFileName;LPCTSTR lpExtension;DWORD nBufferLength;LPTSTR lpBuffer;LPTSTR* lpFilePart; +int;SearchPathA;LPCTSTR lpPath;LPCTSTR lpFileName;LPCTSTR lpExtension;DWORD nBufferSize;LPTSTR lpStockBuffer;LPTSTR* lpFilePart; +int;SearchPathW;LPCTSTR lpPath;LPCTSTR lpFileName;LPCTSTR lpExtension;DWORD nBufferSize;LPTSTR lpStockBuffer;LPTSTR* lpFilePart; +int;SetCalendarInfo;LCID Locale;CALID Calendar;CALTYPE CalType;LPCTSTR lpCalData; +int;SetCommBreak;HANDLE hFile; +int;SetCommConfig;HANDLE hCommDev;LPCOMMCONFIG lpCC;DWORD dwSize; +int;SetCommMask;HANDLE hFile;DWORD dwEvtMask; +int;SetCommState;HANDLE hFile;LPDCB lpDCB; +int;SetCommTimeouts;HANDLE hFile;LPCOMMTIMEOUTS lpCommTimeouts; +int;SetComputerName;LPCTSTR lpComputerName; +int;SetComputerNameA;LPCTSTR lpComputerName; +int;SetComputerNameEx;COMPUTER_NAME_FORMAT NameType;LPCTSTR lpBuffer; +int;SetComputerNameW;LPCTSTR lpComputerName; +int;SetConsoleActiveScreenBuffer;HANDLE hConsoleOutput; +int;SetConsoleCP;UINT wCodePageID; +int;SetConsoleCtrlHandler;PHANDLER_ROUTINE hRoutine;BOOL Add; +int;SetConsoleCursorInfo;HANDLE hConsoleOutput;const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo; +int;SetConsoleCursorPosition;HANDLE hConsoleOutput;COORD dwCursorPosition; +int;SetConsoleDisplayMode;HANDLE hConsoleOutput;DWORD dwFlags;PCOORD lpNewScreenBufferDimensions; +int;SetConsoleHistoryInfo;PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo; +int;SetConsoleMode;HANDLE hConsoleHandle;DWORD dwMode; +int;SetConsoleOutputCP;UINT wCodePageID; +int;SetConsoleScreenBufferInfoEx;HANDLE hConsoleOutput;PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx; +int;SetConsoleScreenBufferSize;HANDLE hConsoleOutput;COORD dwSize; +int;SetConsoleTextAttribute;HANDLE hConsoleOutput;WORD wAttributes; +int;SetConsoleTitle;LPCTSTR lpConsoleTitle; +int;SetConsoleTitleA;LPCTSTR pConsoleTitle; +int;SetConsoleTitleW;LPCTSTR pConsoleTitle; +int;SetConsoleWindowInfo;HANDLE hConsoleOutput;BOOL bAbsolute;const SMALL_RECT* lpConsoleWindow; +int;SetCriticalSectionSpinCount;LPCRITICAL_SECTION lpCriticalSection;DWORD dwSpinCount; +int;SetCurrentConsoleFontEx;HANDLE hConsoleOutput;BOOL bMaximumWindow;PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx; +int;SetCurrentDirectory;LPCTSTR lpPathName; +int;SetCurrentDirectoryA;LPCTSTR lpPathName; +int;SetCurrentDirectoryW;LPCTSTR lpPathName; +int;SetDefaultCommConfig;LPCTSTR lpszName;LPCOMMCONFIG lpCC;DWORD dwSize; +int;SetDllDirectory;LPCTSTR lpPathName; +int;SetDynamicTimeZoneInformation;const DYNAMIC_TIME_ZONE_INFORMATION* lpTimeZoneInformation; +int;SetEndOfFile;HANDLE hFile; +int;SetEnvironmentVariable;LPCTSTR lpName;LPCTSTR lpValue; +int;SetEnvironmentVariableA;LPCTSTR lpName;LPCTSTR lpValue; +int;SetEnvironmentVariableW;LPCTSTR lpName;LPCTSTR lpValue; +int;SetErrorMode;DWORD uMode; +int;SetEvent;HANDLE hEvent; +int;SetEventWhenCallbackReturns;PTP_CALLBACK_INSTANCE pci;HANDLE evt; +int;SetExtendedFeaturesMask;PCONTEXT_EX ContextEx;DWORD64 FeatureMask; +int;SetFileApisToANSI;; +int;SetFileApisToOEM;; +int;SetFileAttributes;LPCTSTR lpFileName;DWORD dwFileAttributes; +int;SetFileAttributesA;LPCTSTR lpFileName;DWORD dwFileAttributes; +int;SetFileAttributesTransacted;LPCTSTR lpFileName;DWORD dwFileAttributes;HANDLE hTransaction; +int;SetFileAttributesW;LPCTSTR lpFileName;DWORD dwFileAttributes; +int;SetFileBandwidthReservation;HANDLE hFile;DWORD nPeriodMilliseconds;DWORD nBytesPerPeriod;BOOL bDiscardable;LPDWORD lpTransferSize;LPDWORD lpNumOutstandingRequests; +int;SetFileCompletionNotificationModes;HANDLE FileHandle;UCHAR Flags; +int;SetFileInformationByHandle;HANDLE hFile;FILE_INFO_BY_HANDLE_CLASS FileInformationClass;LPVOID lpFileInformation;DWORD dwBufferSize; +int;SetFileIoOverlappedRange;HANDLE FileHandle;PUCHAR OverlappedRangeStart;ULONG Length; +int;SetFilePointer;HANDLE hFile;LONG lDistanceToMove;PLONG lpDistanceToMoveHigh;DWORD dwMoveMethod; +int;SetFilePointerEx;HANDLE hFile;LARGE_INTEGER lDistanceToMove;PLARGE_INTEGER pliNewFilePointer;DWORD dwMoveMethod; +int;SetFileShortName;HANDLE hFile;LPCTSTR lpShortName; +int;SetFileTime;HANDLE hFile;const FILETIME* lpCreationTime;const FILETIME* lpLastAccessTime;const FILETIME* lpLastWriteTime; +int;SetFileValidData;HANDLE hFile;LONGLONG ValidDataLength; +int;SetFirmwareEnvironmentVariable;LPCTSTR lpName;LPCTSTR lpGuid;PVOID pBuffer;DWORD nSize; +int;SetHandleInformation;HANDLE hObject;DWORD dwMask;DWORD dwFlags; +int;SetInformationJobObject;HANDLE hJob;JOBOBJECTINFOCLASS JobObjectInfoClass;LPVOID lpJobObjectInfo;DWORD cbJobObjectInfoLength; +int;SetLastError;DWORD dwErrCode; +int;SetLocalTime;const SYSTEMTIME* lpSystemTime; +int;SetLocaleInfo;LCID Locale;LCTYPE LCType;LPCTSTR lpLCData; +int;SetLocaleInfoA;LCID Locale;LCTYPE LCType;LPCTSTR lpLCData; +int;SetLocaleInfoW;LCID Locale;LCTYPE LCType;LPCTSTR lpLCData; +int;SetMailslotInfo;HANDLE hMailslot;DWORD lReadTimeout; +int;SetPriorityClass;HANDLE hProcess;DWORD dwPriorityClass; +int;SetProcessAffinityMask;HANDLE hProcess;DWORD_PTR dwProcessAffinityMask; +int;SetProcessAffinityUpdateMode;HANDLE ProcessHandle;DWORD dwFlags; +int;SetProcessDEPPolicy;DWORD dwFlags; +int;SetProcessPriorityBoost;HANDLE hProcess;BOOL DisablePriorityBoost; +int;SetProcessShutdownParameters;DWORD dwLevel;DWORD dwFlags; +int;SetProcessWorkingSetSize;HANDLE hProcess;SIZE_T dwMinimumWorkingSetSize;SIZE_T dwMaximumWorkingSetSize; +int;SetProcessWorkingSetSizeEx;HANDLE hProcess;SIZE_T dwMinimumWorkingSetSize;SIZE_T dwMaximumWorkingSetSize;DWORD Flags; +int;SetSearchPathMode;DWORD Flags; +int;SetStdHandle;DWORD nStdHandle;HANDLE hHandle; +int;SetSystemFileCacheSize;SIZE_T MinimumFileCacheSize;SIZE_T MaximumFileCacheSize;DWORD Flags; +int;SetSystemPowerState;BOOL fSuspend;BOOL fForce; +int;SetSystemTime;const SYSTEMTIME* lpSystemTime; +int;SetSystemTimeAdjustment;DWORD dwTimeAdjustment;BOOL bTimeAdjustmentDisabled; +int;SetTapeParameters;HANDLE hDevice;DWORD dwOperation;LPVOID lpTapeInformation; +int;SetTapePosition;HANDLE hDevice;DWORD dwPositionMethod;DWORD dwPartition;DWORD dwOffsetLow;DWORD dwOffsetHigh;BOOL bImmediate; +int;SetThreadAffinityMask;HANDLE hThread;DWORD_PTR dwThreadAffinityMask; +int;SetThreadContext;HANDLE hThread;const CONTEXT* lpContext; +int;SetThreadErrorMode;DWORD dwNewMode;LPDWORD lpOldMode; +int;SetThreadExecutionState;EXECUTION_STATE esFlags; +int;SetThreadGroupAffinity;HANDLE hThread;const GROUP_AFFINITY* GroupAffinity; +int;SetThreadIdealProcessor;HANDLE hThread;DWORD dwIdealProcessor; +int;SetThreadIdealProcessorEx;HANDLE hThread;PPROCESSOR_NUMBER lpIdealProcessor;PPROCESSOR_NUMBER lpPreviousIdealProcessor; +int;SetThreadLocale;LCID Locale; +int;SetThreadPriority;HANDLE hThread;DWORD nPriority; +int;SetThreadPriorityBoost;HANDLE hThread;BOOL DisablePriorityBoost; +int;SetThreadStackGuarantee;PULONG StackSizeInBytes; +int;SetThreadpoolCallbackPriority;PTP_CALLBACK_ENVIRON pcbe;TP_CALLBACK_PRIORITY Priority; +int;SetThreadpoolStackInformation;PTP_POOL ptpp;PTP_POOL_STACK_INFORMATION ptpsi; +int;SetThreadpoolThreadMaximum;PTP_POOL ptpp;DWORD cthrdMost; +int;SetThreadpoolThreadMinimum;PTP_POOL ptpp;DWORD cthrdMic; +int;SetThreadpoolTimer;PTP_TIMER pti;PFILETIME pftDueTime;DWORD msPeriod;DWORD msWindowLength; +int;SetThreadpoolWait;PTP_WAIT pwa;HANDLE h;PFILETIME pftTimeout; +int;SetTimeZoneInformation;const TIME_ZONE_INFORMATION* lpTimeZoneInformation; +int;SetUmsThreadInformation;PUMS_CONTEXT UmsThread;UMS_THREAD_INFO_CLASS UmsThreadInfoClass;PVOID UmsThreadInformation;ULONG UmsThreadInformationLength; +int;SetUnhandledExceptionFilter;LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter; +int;SetUserGeoID;GEOID GeoId; +int;SetWaitableTimer;HANDLE hTimer;const LARGE_INTEGER* pDueTime;LONG lPeriod;PTIMERAPCROUTINE pfnCompletionRoutine;LPVOID lpArgToCompletionRoutine;BOOL fResume; +int;SetWaitableTimerEx;HANDLE hTimer;const LARGE_INTEGER* lpDueTime;LONG lPeriod;PTIMERAPCROUTINE pfnCompletionRoutine;LPVOID lpArgToCompletionRoutine;PREASON_CONTEXT WakeContext;ULONG TolerableDelay; +int;SetupComm;HANDLE hFile;DWORD dwInQueue;DWORD dwOutQueue; +int;SignalObjectAndWait;HANDLE hObjectToSignal;HANDLE hObjectToWaitOn;DWORD dwMilliseconds;BOOL bAlertable; +int;SizeofResource;HMODULE hModule;HRSRC hResInfo; +void;Sleep;DWORD dwMilliseconds; +int;SleepConditionVariableCS;PCONDITION_VARIABLE ConditionVariable;PCRITICAL_SECTION CriticalSection;DWORD dwMilliseconds; +int;SleepConditionVariableSRW;PCONDITION_VARIABLE ConditionVariable;PSRWLOCK SRWLock;DWORD dwMilliseconds;ULONG Flags; +int;SleepEx;DWORD dwMilliseconds;BOOL bAlertable; +int;StartThreadpoolIo;PTP_IO pio; +int;SubmitThreadpoolWork;PTP_WORK pwk; +int;SuspendThread;HANDLE hThread; +int;SwitchToFiber;LPVOID lpFiber; +int;SwitchToThread;; +int;SystemTimeToFileTime;const SYSTEMTIME* lpSystemTime;LPFILETIME lpFileTime; +int;SystemTimeToTzSpecificLocalTime;LPTIME_ZONE_INFORMATION lpTimeZoneInformation;LPSYSTEMTIME lpUniversalTime;LPSYSTEMTIME lpLocalTime; +int;TerminateJobObject;HANDLE hJob;UINT uExitCode; +int;TerminateProcess;HANDLE hProcess;UINT uExitCode; +int;TerminateThread;HANDLE hProcess;DWORD uExitCode; +int;Thread32First;HANDLE hSnapshot;LPTHREADENTRY32 lpte; +int;Thread32Next;HANDLE hSnapshot;LPTHREADENTRY32 lpte; +int;TlsAlloc;; +int;TlsFree;DWORD dwTlsIndex ; +int;TlsGetValue;DWORD dwTlsIndex; +int;TlsSetValue;DWORD dwTlsIndex;LPVOID pTlsValue; +int;Toolhelp32ReadProcessMemory;DWORD th32ProcessID;LPCVOID lpBaseAddress;LPVOID lpBuffer;SIZE_T cbRead;SIZE_T lpNumberOfBytesRead; +int;TransmitCommChar;HANDLE hFile;char cChar; +int;TryAcquireSRWLockExclusive;PSRWLOCK SRWLock; +int;TryAcquireSRWLockShared;PSRWLOCK SRWLock; +int;TryEnterCriticalSection;LPCRITICAL_SECTION lpCriticalSection; +int;TrySubmitThreadpoolCallback;PTP_SIMPLE_CALLBACK pfns;PVOID pv;PTP_CALLBACK_ENVIRON pcbe; +int;TzSpecificLocalTimeToSystemTime;LPTIME_ZONE_INFORMATION lpTimeZoneInformation;LPSYSTEMTIME lpLocalTime;LPSYSTEMTIME lpUniversalTime; +int;UmsThreadYield;PVOID SchedulerParam; +int;UnhandledExceptionFilter;struct _EXCEPTION_POINTERS* pExceptionInfo; +int;UnlockFile;HANDLE hFile;DWORD dwFileOffsetLow;DWORD dwFileOffsetHigh;DWORD nNumberOfBytesToUnlockLow;DWORD nNumberOfBytesToUnlockHigh; +int;UnlockFileEx;HANDLE hFile;DWORD dwReserved;DWORD nNumberOfBytesToUnlockLow;DWORD nNumberOfBytesToUnlockHigh;LPOVERLAPPED lpOverlapped; +int;UnmapViewOfFile;LPCVOID lpBaseAddress; +int;UnregisterApplicationRecoveryCallback;; +int;UnregisterApplicationRestart;; +int;UnregisterWait;HANDLE WaitHandle; +int;UnregisterWaitEx;HANDLE WaitHandle;HANDLE CompletionEvent; +int;UpdateCalendarDayOfWeek;LPCALDATETIME lpCalDateTime; +int;UpdateProcThreadAttribute;LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;DWORD dwFlags;DWORD Attribute;PVOID lpValue;SIZE_T cbSize;PVOID lpPreviousValue;PSIZE_T lpReturnSize; +int;UpdateResource;HANDLE hUpdate;LPCTSTR lpType;LPCTSTR lpName;WORD wLanguage;LPVOID lpData;DWORD cbData; +int;VerLanguageName;DWORD wLang;LPTSTR szLang;DWORD cchLang; +int;VerLanguageNameA;DWORD wLang;LPTSTR szLang;DWORD nSize; +int;VerLanguageNameW;DWORD wLang;LPTSTR szLang;DWORD nSize; +int;VerSetConditionMask;ULONGLONG dwlConditionMask;DWORD dwTypeBitMask;DWORD dwConditionMask; +int;VerifyScripts;DWORD dwFlags;LPCWSTR lpLocaleScripts;int cchLocaleScripts;LPCWSTR lpTestScripts;int cchTestScripts; +int;VerifyVersionInfo;LPOSVERSIONINFOEX lpVersionInfo;DWORD dwTypeMask;DWORDLONG dwlConditionMask; +int;VirtualAlloc;LPVOID lpAddress;SIZE_T dwSize;DWORD flAllocationType;DWORD flProtect; +int;VirtualAllocEx;HANDLE hProcess;LPVOID lpAddress;SIZE_T dwSize;DWORD flAllocationType;DWORD flProtect; +int;VirtualAllocExNuma;HANDLE hProcess;LPVOID lpAddress;SIZE_T dwSize;DWORD flAllocationType;DWORD flProtect;DWORD nndPreferred; +int;VirtualFree;LPVOID lpAddress;SIZE_T dwSize;DWORD FreeType; +int;VirtualFreeEx;HANDLE hProces;LPVOID lpAddress;SIZE_T dwSize;DWORD dwFreeType; +int;VirtualLock;LPVOID lpAddress;SIZE_T dwSize; +int;VirtualProtect;LPVOID lpAddress;SIZE_T dwSize;DWORD flNewProtect;DWORD lpflOldProtect; +int;VirtualProtectEx;HANDLE hProces;LPVOID lpAddress;SIZE_T dwSize;DWORD flNewProtect;DWORD lpflOldProtect; +int;VirtualQuery;LPCVOID lpAddress;PMEMORY_BASIC_INFORMATION pbi_Buffer;SIZE_T dwLength; +int;VirtualQueryEx;HANDLE hProcess;LPCVOID lpAddress;PMEMORY_BASIC_INFORMATION pbi_Buffer;SIZE_T dwLength; +int;VirtualUnlock;LPVOID lpAddress;SIZE_T dwSize; +int;WTSGetActiveConsoleSessionId;; +int;WaitCommEvent;HANDLE hFile;LPDWORD lpEvtMask;LPOVERLAPPED lpOverlapped; +int;WaitForDebugEvent;LPDEBUG_EVENT lpDebugEvent;DWORD dwMilliseconds; +int;WaitForMultipleObjects;DWORD nCount;const HANDLE* lpHandles;BOOL bWaitAll;DWORD dwMilliseconds; +int;WaitForMultipleObjectsEx;DWORD nCount;const HANDLE* lpHandles;BOOL bWaitAll;DWORD dwMilliseconds;BOOL bAlertable; +int;WaitForSingleObject;HANDLE hHandle;DWORD dwMilliseconds; +int;WaitForSingleObjectEx;HANDLE hHandle;DWORD dwMilliseconds;BOOL bAlertable; +int;WaitForThreadpoolIoCallbacks;PTP_IO pio;BOOL fCancelPendingCallbacks; +int;WaitForThreadpoolTimerCallbacks;PTP_TIMER pti;BOOL fCancelPendingCallbacks; +int;WaitForThreadpoolWaitCallbacks;PTP_WAIT pwa;BOOL fCancelPendingCallbacks; +int;WaitForThreadpoolWorkCallbacks;PTP_WORK pwk;BOOL fCancelPendingCallbacks; +int;WakeAllConditionVariable;PCONDITION_VARIABLE ConditionVariable; +int;WakeConditionVariable;PCONDITION_VARIABLE ConditionVariable; +int;WerGetFlags;HANDLE hProcess;PDWORD pdwFlags; +int;WerRegisterFile;PCWSTR pwzFile;WER_REGISTER_FILE_TYPE regFileType;DWORD dwFlags; +int;WerRegisterMemoryBlock;PVOID pvAddress;DWORD dwSize; +int;WerRegisterRuntimeExceptionModule;PCWSTR pwszOutOfProcessCallbackDll;PVOID pContext; +int;WerSetFlags;DWORD dwFlags; +int;WerUnregisterFile;PCWSTR pwzFilePath; +int;WerUnregisterMemoryBlock;PVOID pvAddress; +int;WerUnregisterRuntimeExceptionModule;PCWSTR pwszOutOfProcessCallbackDll;PVOID pContext; +int;WideCharToMultiByte;UINT CodePage;DWORD Options;LPCWSTR WideCharStr;int WideCharCount;LPSTR lpszBuffer;int MultiByteByte;LPCSTR pDefaultChar;LPBOOL pDefaultCharUsed; +int;WinExec;LPCSTR lpCmdLine;UINT uCmdShow; +int;Wow64DisableWow64FsRedirection;PVOID* OldValue; +int;Wow64EnableWow64FsRedirection;BOOLEAN Wow64FsEnableRedirection; +int;Wow64GetThreadContext;HANDLE hThread;PWOW64_CONTEXT lpContext; +int;Wow64GetThreadSelectorEntry;HANDLE hThread;DWORD dwSelector;PWOW64_LDT_ENTRY lpSelectorEntry; +int;Wow64RevertWow64FsRedirection;PVOID OldValue; +int;Wow64SetThreadContext;HANDLE hThread;CONST WOW64_CONTEXT* lpContext; +int;Wow64SuspendThread;HANDLE hThread; +int;WriteConsole;HANDLE hConsoleOutput;LPCTSTR lpBuffer;DWORD nNumberOfCharsToWrite;LPDWORD lpNumberOfCharsWritten;LPVOID lpReserved; +int;WriteConsoleInput;HANDLE hConsoleInput;const INPUT_RECORD* lpBuffer;DWORD nLength;LPDWORD lpNumberOfEventsWritten; +int;WriteConsoleOutput;HANDLE hConsoleOutput;const CHAR_INFO* lpBuffer;COORD dwBufferSize;COORD dwBufferCoord;PSMALL_RECT lpWriteRegion; +int;WriteConsoleOutputA;HANDLE hConsoleOutput;const CHAR_INFO* lpBuffer;COORD dwBufferSize;COORD dwBufferCoord;PSMALL_RECT lpWriteRegion; +int;WriteConsoleOutputAttribute;HANDLE hConsoleOutput;const WORD* lpAttribute;DWORD nLength;COORD dwWriteCoord;LPDWORD lpNumberOfAttrsWritten; +int;WriteConsoleOutputCharacter;HANDLE hConsoleOutput;LPCTSTR lpCharacter;DWORD nLength;COORD dwWriteCoord;LPDWORD lpNumberOfCharsWritten; +BOOL;WriteFile;HANDLE hFile;LPCVOID lpWriteData;DWORD nNumberOfBytesToWrite;LPDWORD lpNumberOfBytesWritten;LPOVERLAPPED lpOverlapped; +int;WriteFileEx;HANDLE hFile;LPCVOID lpWriteData;DWORD nNumberOfBytesToWrite;LPOVERLAPPED lpOverlapped;LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; +int;WriteFileGather;HANDLE hFile;FILE_SEGMENT_ELEMENT lpBuffer;DWORD nNumberOfBytesToWrite;LPDWORD pOverlapped;LPOVERLAPPED lpCompletionRoutine; +int;WriteFileW;HANDLE hFile;LPCVOID lpWriteData;DWORD nNumberOfBytesToWrite;LPDWORD lpNumberOfBytesWritten;LPOVERLAPPED lpOverlapped; +int;WritePrivateProfileSection;LPCTSTR lpAppName;LPCTSTR lpString;LPCTSTR lpFileName; +int;WritePrivateProfileSectionA;LPCTSTR lpAppName;LPCTSTR lpString;LPCTSTR lpFileName; +int;WritePrivateProfileSectionW;LPCTSTR lpAppName;LPCTSTR lpString;LPCTSTR lpFileName; +int;WritePrivateProfileString;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpString;LPCTSTR lpFileName; +int;WritePrivateProfileStringA;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpString;LPCTSTR pFileName; +int;WritePrivateProfileStringW;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpString;LPCTSTR pFileName; +int;WritePrivateProfileStruct;LPCTSTR lpszSection;LPCTSTR lpszKey;LPVOID lpStruct;UINT uSizeStruct;LPCTSTR szFile; +int;WritePrivateProfileStructA;LPCTSTR lpszSection;LPCTSTR lpszKey;LPVOID lpStruct;UINT uSizeStruct;LPCTSTR szFile; +int;WritePrivateProfileStructW;LPCTSTR lpszSection;LPCTSTR lpszKey;LPVOID lpStruct;UINT uSizeStruct;LPCTSTR szFile; +int;WriteProcessMemory;HANDLE hProcess;LPVOID lpBaseAddress;LPCVOID lpStockBuffer;SIZE_T nBufferSize;SIZE_T* lpNumberOfBytesWritten; +int;WriteProfileSection;LPCTSTR lpAppName;LPCTSTR lpString; +int;WriteProfileSectionA;LPCTSTR lpAppName;LPCTSTR lpString; +int;WriteProfileSectionW;LPCTSTR lpAppName;LPCTSTR lpString; +int;WriteProfileString;LPCTSTR lpAppName;LPCTSTR lpKeyName;LPCTSTR lpString; +int;WriteProfileStringA;LPCTSTR lpszSection;LPCTSTR lpszKeyName;LPCTSTR lpszString; +int;WriteProfileStringW;LPCTSTR lpszSection;LPCTSTR lpszKeyName;LPCTSTR lpszString; +int;WriteTapemark;HANDLE hDevice;DWORD dwTapemarkType;DWORD dwTapemarkCount;BOOL bImmediate; +int;ZombifyActCtx;HANDLE hActCtx; +int;_hread;HFILE hFile;DWORD lpBuffer;DWORD nBufferSize; +int;_hwrite;HFILE hFile;DWORD lpBuffer;DWORD nBufferSize; +int;_lclose;HFILE hFile; +int;_lcreat;LPCSTR lpPathName;DWORD iAttribute; +int;_llseek;HFILE hFile;LONG lOffset;int iOrigin; +int;_lopen;LPCSTR lpPathName;int iReadWrite; +int;_lread;HFILE hFile;LPVOID lpBuffer;UINT nBufferSize; +int;_lwrite;HFILE hFile;LPVOID lpBuffer;UINT nBufferSize; +int;lstrcat;LPTSTR String1;LPTSTR String2; +int;lstrcatW;LPTSTR String1;LPTSTR String2; +int;lstrcmp;LPCTSTR string1;LPCTSTR string2; +int;lstrcmpA;LPCTSTR string1;LPCTSTR string2; +int;lstrcmpW;LPCTSTR string1;LPCTSTR string2; +int;lstrcmpi;LPCTSTR string1;LPCTSTR string2; +int;lstrcmpiW;LPCTSTR lpString1;LPCTSTR lpString2; +int;lstrcpy;LPTSTR lpString1;LPTSTR lpString2; +int;lstrcpyW;LPTSTR lpString1;LPTSTR lpString2; +int;lstrcpyn;LPTSTR lpBuffer;LPCTSTR lpstrSrc;int nBuffer; +int;lstrcpynW;LPTSTR lpBuffer;LPCTSTR lpstrSrc;int nBuffer; +int;lstrlen;LPCTSTR lpString; +int;lstrlenA;LPCTSTR lpString; +int;lstrlenW;LPCTSTR lpString; +int;RtlUnwind;PEXCEPTION_REGISTRATION pRegistrationFrame;PVOID returnAddr;PEXCEPTION_RECORD pExcptRec;DWORD _eax_value; +bool;CreatePipe;PHANDLE hReadPipe;PHANDLE hWritePipe;LPSECURITY_ATTRIBUTES lpPipeAttributes;DWORD nSize; +long;SetHandleCount;long wNumber; \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/shell32.txt b/x64_dbg_gui/Project/Data/shell32.txt index 11d0250a..0f491a63 100644 --- a/x64_dbg_gui/Project/Data/shell32.txt +++ b/x64_dbg_gui/Project/Data/shell32.txt @@ -1,246 +1,246 @@ -int AssocCreateForClasses(const ASSOCIATIONELEMENT* rgClasses,ULONG cClasses,REFIID riid,void** ppv); -int AssocGetDetailsOfPropKey(IShellFolder* psf,PCUITEMID_CHILD pidl,PROPERTYKEY* pkey,VARIANT* pv,BOOL* pfFoundPropKey); -int CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder,HWND hwnd,UINT cidl,PCUITEMID_CHILD_ARRAY* apidl,IShellFolder* psf,LPFNDFMCALLBACK lpfn,UINT nKeys,const HKEY* ahkeys,IContextMenu** ppcm); -int CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUIDLIST_RELATIVE_ARRAY apidl,IDataObject** ppdtobj); -int CallCPLEntry16(HINSTANCE hInst,FARPROC16 lpfnEntry,HWND hwndCPL,UINT msg,LPARAM lParam1,LPARAM lParam2); -int CommandLineToArgvW(LPCWSTR lpCmdLine,int* pNumArgs); -int DAD_AutoScroll(HWND hwnd,AUTO_SCROLL_DATA* pad,const POINT* pptNow); -int DAD_DragEnterEx(HWND hwndTarget,const POINT ptStart); -int DAD_DragLeave(); -int DAD_DragMove(POINT pt); -int DAD_SetDragImage(HIMAGELIST him,POINT* pptOffset); -int DAD_ShowDragImage(BOOL fShow); -int DllGetVersion(DLLVERSIONINFO* pDllVersionInfo); -int DoEnvironmentSubst(LPTSTR pszString,UINT cchString); -int DragAcceptFiles(HWND hWnd,BOOL fAccept); -int DragFinish(HDROP hDrop); -int DragQueryFile(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); -int DragQueryFileA(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); -int DragQueryFileW(HDROP hDrop,UINT iFile,LPTSTR lpBuffer,UINT nBuffer); -int DragQueryPoint(HDROP hDrop,LPPOINT lppt); -int DriveType(int iDrive); -int DuplicateIcon(HINSTANCE hInst,HICON hIcon); -int ExtractAssociatedIcon(HINSTANCE hInst,LPTSTR lpIconPath,LPWORD lpiIcon); -int ExtractAssociatedIconA(HINSTANCE hInst,LPTSTR szIconPath,LPWORD lpiIcon); -int ExtractAssociatedIconEx(HINSTANCE hInst,LPTSTR lpIconPath,LPWORD lpiIconIndex,LPWORD lpiIconId); -int ExtractAssociatedIconW(HINSTANCE hInst,LPTSTR szIconPath,LPWORD lpiIcon); -int ExtractIcon(DWORD hInst,DWORD lpszExeFileName,DWORD nIconIndex); -int ExtractIcon(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); -int ExtractIconA(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); -int ExtractIconEx(LPCTSTR lpszFile,int nIconIndex,HICON* phiconLarge,HICON* phiconSmall,UINT nIcons); -int ExtractIconExW(LPCTSTR lpszFile,int nIconIndex,HICON* phiconLarge,HICON* phiconSmall,UINT nIcons); -int ExtractIconW(HINSTANCE hInst,LPCTSTR lpszExeFileName,UINT nIconIndex); -int FileIconInit(BOOL fRestoreCache); -int FindExecutable(LPCTSTR lpFile,LPCTSTR lpDirectory,LPTSTR lpResult); -int GUIDFromString(LPCTSTR psz,LPGUID pguid); -int GetCurrentProcessExplicitAppUserModelID(PWSTR* AppID); -int GetFileNameFromBrowse(HWND hwnd,LPWSTR pszFilePath,UINT cchFilePath,LPCWSTR pszWorkingDir,LPCWSTR pszDefExt,LPCWSTR pszFilters,LPCWSTR szTitle); -int ILAppendID(PIDLIST_RELATIVE pidl,LPSHITEMID pmkid,BOOL fAppend); -int ILClone(PCUIDLIST_RELATIVE pidl); -int ILCloneFirst(PCUIDLIST_RELATIVE pidl); -int ILCombine(PCIDLIST_ABSOLUTE pidl1,PCUIDLIST_RELATIVE pidl2); -int ILCreateFromPath(LPCSTR pszPath); -int ILFindChild(PCIDLIST_ABSOLUTE pidlParent,PCIDLIST_ABSOLUTE pidlChild); -int ILFindLastID(PCUIDLIST_RELATIVE pidl); -int ILFree(PIDLIST_RELATIVE pidl); -int ILGetNext(PCUIDLIST_RELATIVE pidl); -int ILGetSize(PCUIDLIST_RELATIVE pidl); -int ILIsEqual(PCIDLIST_ABSOLUTE pidl1,PCIDLIST_ABSOLUTE pidl2); -int ILIsParent(PCIDLIST_ABSOLUTE pidl1,PCIDLIST_ABSOLUTE pidl2,BOOL fImmediate); -int ILLoadFromStream(IStream* pstm,PIDLIST_RELATIVE* pidl); -int ILRemoveLastID(PUIDLIST_RELATIVE pidl); -int ILSaveToStream(IStream* pstm,PCUIDLIST_RELATIVE pidl); -int InitNetworkAddressControl(); -int IsNetDrive(int iDrive); -int IsUserAnAdmin(); -int LinkWindow_RegisterClass(); -int LinkWindow_UnregisterClass(); -int NTSHChangeNotifyDeregister(ULONG ulID); -int NTSHChangeNotifyRegister(HWND hwnd,int fSources,LONG fEvents,UINT wMsg,int cEntries,SHChangeNotifyEntry* pfsne); -int OpenRegStream(HKEY hkey,LPCWSTR pszSubkey,LPCWSTR pszValue,DWORD grfMode); -int ParseField(LPCTSTR* szData,int n,LPTSTR* szBuf,int iBufLen); -int PathCleanupSpec(LPCWSTR pszDir,LPWSTR pszSpec); -int PathGetShortPath(LPWSTR pszLongPath); -int PathIsExe(LPCWSTR szfile); -int PathIsSlow(LPCTSTR pszFile,DWORD dwFileAttr); -int PathMakeUniqueName(LPWSTR pszUniqueName,UINT cchMax,LPCWSTR pszTemplate,LPCWSTR pszLongPlate,LPCWSTR pszDir); -int PathProcessCommand(LPCWSTR lpSrc,LPWSTR lpDest,int iDestMax,DWORD dwFlags); -int PathResolve(LPWSTR pszPath,LPCWSTR* dirs,UINT fFlags); -int PathYetAnotherMakeUniqueName(LPWSTR pszUniqueName,LPCWSTR pszPath,LPCWSTR pszShort,LPCWSTR pszFileSpec); -int PickIconDlg(HWND hwnd,LPWSTR pszIconPath,UINT cchIconPath,int* piIconIndex); -int PifMgr_CloseProperties(HANDLE hProps,UINT flOpt); -int PifMgr_GetProperties(HANDLE hProps,LPCSTR pszGroup,VOID* lpProps,int cbProps,UINT flOpt); -int PifMgr_OpenProperties(LPCWSTR pszApp,LPCWSTR lpszPIF,UINT hInf,UINT flOpt); -int PifMgr_SetProperties(HANDLE hProps,LPCSTR pszGroup,VOID* lpProps,int cbProps,UINT flOpt); -int ReadCabinetState(CABINETSTATE* pcs,int cLength); -int RealDriveType(int iDrive,BOOL fOKToHitNet); -int RestartDialog(HWND hParent,LPCWSTR pszPrompt,DWORD dwFlags); -int RestartDialogEx(HWND hParent,LPCWSTR pszPrompt,DWORD dwFlags,HWND dwReasonCode); -int SHAddDefaultPropertiesByExt(PCWSTR pszExt,IPropertyStore* pPropStore); -int SHAddFromPropSheetExtArray(HPSXA hpsxa,LPFNADDPROPSHEETPAGE lpfnAddPage,LPARAM lParam); -int SHAddToRecentDocs(UINT uFlags,LPCVOID pv); -int SHAlloc(SIZE_T cb); -int SHAppBarMessage(DWORD dwMessage,PAPPBARDATA pData); -int SHAssocEnumHandlers(LPCWSTR pszExtra,ASSOC_FILTER afFilter,IEnumAssocHandlers** ppEnumHandler); -int SHAssocEnumHandlersForProtocolByApplication(PCWSTR protocol,REFIID riid,void** enumHandlers); -int SHBindToFolderIDListParent(IShellFolder* psfRoot,PCUIDLIST_RELATIVE pidl,REFIID riid,void** ppv,PCUITEMID_CHILD* ppidlLast); -int SHBindToObject(IShellFolder* psf,PCUIDLIST_RELATIVE pidl,IBindCtx* pbc,REFIID riid,void** ppv); -int SHBindToParent(PCIDLIST_ABSOLUTE pidl,REFIID riid,VOID** ppv,PCUITEMID_CHILD* ppidlLast); -int SHBrowseForFolder(LPBROWSEINFO lpbi); -int SHCLSIDFromString(LPCWSTR psz,CLSID* pclsid); -int SHChangeNotification_Lock(HANDLE hChange,DWORD dwProcId,PIDLIST_ABSOLUTE** pppidl,LONG* plEvent); -int SHChangeNotification_Unlock(HANDLE hLock); -int SHChangeNotify(DWORD wEventId,DWORD uFlags,LPCVOID dwItem1,LPCVOID dwItem2); -int SHChangeNotifyDeregister(ULONG ulID); -int SHChangeNotifyRegister(HWND hwnd,int fSources,LONG fEvents,UINT wMsg,int cEntries,const SHChangeNotifyEntry* pshcne); -int SHChangeNotifyRegisterThread(SCNRT_STATUS status); -int SHCloneSpecialIDList(HWND hwndOwner,DWORD csidl,BOOL fCreate); -int SHCoCreateInstance(LPCWSTR pszCLSID,const CLSID* pclsid,IUnknown* pUnkOuter,REFIID riid,void** ppv); -int SHCreateAssociationRegistration(REFIID riid,void** ppv); -int SHCreateDataObject(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUITEMID_CHILD_ARRAY apidl,IDataObject* pdtInner,REFIID riid,void** ppv); -int SHCreateDefaultContextMenu(const DEFCONTEXTMENU* pdcm,REFIID riid,void** ppv); -int SHCreateDefaultExtractIcon(REFIID riid,void** ppv); -int SHCreateDefaultPropertiesOp(IShellItem* psi,IFileOperation** ppFileOp); -int SHCreateDirectory(HWND hwnd,LPCWSTR pszPath); -int SHCreateDirectoryEx(HWND hwnd,LPCTSTR pszPath,const SECURITY_ATTRIBUTES* psa); -int SHCreateFileExtractIconW(LPCWSTR pszFile,DWORD dwFileAttributes,REFIID riid,void** ppv); -int SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl,REFIID riid,void** ppv); -int SHCreateItemFromParsingName(PCWSTR pszPath,IBindCtx* pbc,REFIID riid,void** ppv); -int SHCreateItemFromRelativeName(IShellItem* psiParent,PCWSTR pszName,IBindCtx* pbc,REFIID riid,void** ppv); -int SHCreateItemInKnownFolder(REFKNOWNFOLDERID kfid,KNOWN_FOLDER_FLAG dwKFFlags,PCWSTR pszItem,REFIID riid,void** ppv); -int SHCreateItemWithParent(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psfParent,PCUITEMID_CHILD pidl,REFIID riid,void** ppvItem); -int SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi); -int SHCreatePropSheetExtArray(HKEY hkey,LPCWSTR pszSubkey,UINT max_iface); -int SHCreateQueryCancelAutoPlayMoniker(IMoniker** ppmoniker); -int SHCreateShellFolderView(const SFV_CREATE* pcsfv,IShellView** ppsv); -int SHCreateShellFolderViewEx(LPCSFV pcsfv,IShellView** ppsv); -int SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psfParent,PCUITEMID_CHILD pidl,IShellItem** ppsi); -int SHCreateShellItemArray(PCIDLIST_ABSOLUTE pidlParent,IShellFolder* psf,UINT cidl,PCUITEMID_CHILD_ARRAY ppidl,IShellItemArray** ppsiItemArray); -int SHCreateShellItemArrayFromDataObject(IDataObject* pdo,REFIID riid,void** ppv); -int SHCreateShellItemArrayFromIDLists(UINT cidl,PCIDLIST_ABSOLUTE_ARRAY rgpidl,IShellItemArray** ppsiItemArray); -int SHCreateShellItemArrayFromShellItem(IShellItem* psi,REFIID riid,void** ppv); -int SHCreateStdEnumFmtEtc(UINT cfmt,IEnumFORMATETC** ppenumFormatEtc); -int SHDefExtractIcon(LPCTSTR pszIconFile,int iIndex,UINT uFlags,HICON* phiconLarge,HICON* phiconSmall,UINT nIconSize); -int SHDestroyPropSheetExtArray(HPSXA hpsxa); -int SHDoDragDrop(HWND hwnd,IDataObject* pdtobj,IDropSource* pdsrc,DWORD dwEffect,DWORD* pdwEffect); -int SHEmptyRecycleBin(HWND hwnd,LPCTSTR pszRootPath,DWORD dwFlags); -int SHEnumerateUnreadMailAccountsW(HKEY hKeyUser,DWORD dwIndex,LPWSTR pszMailAddress,int cchMailAddress); -int SHEvaluateSystemCommandTemplate(PCWSTR pszCmdTemplate,PWSTR* ppszApplication,PWSTR* ppszCommandLine,PWSTR* ppszParameters); -int SHExtractIconsW(LPCWSTR pszFileName,int nIconIndex,int cxIcon,int cyIcon,HICON* phIcon,UINT* pIconId,UINT nIcons,UINT flags); -int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp); -int SHFindFiles(PCIDLIST_ABSOLUTE pidlFolder,PCIDLIST_ABSOLUTE pidlSaveFile); -int SHFind_InitMenuPopup(HMENU hmenu,HWND hwnd,UINT idCmdFirst,UINT idCmdLast); -int SHFlushClipboard(); -int SHFlushSFCache(); -int SHFormatDrive(HWND hwnd,UINT drive,UINT fmtID,UINT options); -int SHFree(void* pv); -int SHFreeNameMappings(HANDLE hNameMappings); -int SHGetAttributesFromDataObject(IDataObject* pdo,DWORD dwAttributeMask,DWORD* pdwAttributes,UINT* pcItems); -int SHGetDataFromIDList(IShellFolder* psf,PCUITEMID_CHILD pidl,DWORD nFormat,PVOID pv,int cb); -int SHGetDesktopFolder(IShellFolder** ppshf); -int SHGetDiskFreeSpace(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); -int SHGetDiskFreeSpaceEx(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); -int SHGetDiskFreeSpaceExW(LPCTSTR pszVolume,ULARGE_INTEGER* pqwFreeCaller,ULARGE_INTEGER* pqwTot,ULARGE_INTEGER* pqwFree); -int SHGetDriveMedia(LPCWSTR pszDrive,DWORD* pdwMediaContent); -int SHGetFileInfo(LPCTSTR szPath,DWORD dwFileAttributes,SHFILEINFO* pSFileInfo,UINT cbFileInfo,UINT uFlags); -int SHGetFileInfoW(LPCTSTR szPath,DWORD dwFileAttributes,SHFILEINFO* pSFileInfo,UINT cbFileInfo,UINT uFlags); -int SHGetFolderLocation(HWND hwndOwner,DWORD nFolder,HANDLE hToken,DWORD dwReserved,PIDLIST_ABSOLUTE* ppidl); -int SHGetFolderPath(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwFlags,LPTSTR pszPath); -int SHGetFolderPathA(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwReserved,LPTSTR lpBuffer); -int SHGetFolderPathAndSubDir(HWND hwnd,DWORD csidl,HANDLE hToken,DWORD dwFlags,LPCTSTR pszSubDir,LPTSTR pszPath); -int SHGetFolderPathW(HWND hwndOwner,int nFolder,HANDLE hToken,DWORD dwReserved,LPTSTR lpBuffer); -int SHGetIDListFromObject(IUnknown* punk,PIDLIST_ABSOLUTE* ppidl); -int SHGetIconOverlayIndex(LPCTSTR pszIconPath,int iIconIndex); -int SHGetImageList(int iImageList,REFIID riid,void** ppv); -int SHGetInstanceExplorer(IUnknown** ppunk); -int SHGetItemFromDataObject(IDataObject* pdtobj,DATAOBJ_GET_ITEM_FLAGS dwFlags,REFIID riid,void** ppv); -int SHGetItemFromObject(IUnknown* punk,REFIID riid,void** ppv); -int SHGetKnownFolderIDList(REFKNOWNFOLDERID rfid,KNOWN_FOLDER_FLAG dwFlags,HANDLE hToken,PIDLIST_ABSOLUTE* ppidl); -int SHGetKnownFolderItem(REFKNOWNFOLDERID rfid,KNOWN_FOLDER_FLAG dwFlags,HANDLE hToken,REFIID riid,void** ppv); -int SHGetKnownFolderPath(REFKNOWNFOLDERID rfid,DWORD dwFlags,HANDLE hToken,PWSTR* ppszPath); -int SHGetLocalizedName(LPCWSTR pszPath,LPWSTR pszResModule,UINT cch,int* pidsRes); -int SHGetMalloc(LPMALLOC* ppMalloc); -int SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl,SIGDN sigdnName,PWSTR* ppszName); -int SHGetNameFromPropertyKey(REFPROPERTYKEY propkey,PWSTR* ppszCanonicalName); -int SHGetNewLinkInfo(LPCTSTR pszLinkTo,LPCTSTR pszDir,LPTSTR pszName,BOOL* pfMustCopy,UINT uFlags); -int SHGetPathFromIDList(PCIDLIST_ABSOLUTE pidl,LPTSTR pszPath); -int SHGetPathFromIDListEx(PCIDLIST_ABSOLUTE pidl,PWSTR pszPath,DWORD cchPath,GPFIDL_FLAGS uOpts); -int SHGetPathFromIDListW(PCIDLIST_ABSOLUTE pidlTarget,LPTSTR pszPath); -int SHGetPropertyStoreForWindow(HWND hwnd,REFIID riid,void** ppv); -int SHGetPropertyStoreFromIDList(PCIDLIST_ABSOLUTE pidl,GETPROPERTYSTOREFLAGS flags,REFIID riid,void** ppv); -int SHGetPropertyStoreFromParsingName(PCWSTR pszPath,IBindCtx* pbc,GETPROPERTYSTOREFLAGS flags,REFIID riid,void** ppv); -int SHGetRealIDL(IShellFolder* psf,PCUITEMID_CHILD pidlSimple,PITEMID_CHILD* ppidlReal); -int SHGetSetFolderCustomSettings(LPSHFOLDERCUSTOMSETTINGS pfcs,LPCTSTR pszPath,DWORD dwReadWrite); -int SHGetSetSettings(LPSHELLSTATE lpss,DWORD dwMask,BOOL bSet); -int SHGetSettings(LPSHELLFLAGSTATE lpsfs,DWORD dwMask); -int SHGetShellStyleHInstance(); -int SHGetSpecialFolderLocation(HWND hwndOwner,DWORD nFolder,PIDLIST_ABSOLUTE* pidl); -int SHGetSpecialFolderPath(HWND hwndOwner,LPTSTR lpszPath,DWORD csidl,BOOL fCreate); -int SHGetSpecialFolderPathA(HWND hwnd,LPTSTR pszPath,DWORD csidl,BOOL fCreate); -int SHGetSpecialFolderPathW(HWND hwnd,LPTSTR pszPath,DWORD csidl,BOOL fCreate); -int SHGetStockIconInfo(SHSTOCKICONID siid,UINT uFlags,SHSTOCKICONINFO* psii); -int SHGetTemporaryPropertyForItem(IShellItem* psi,REFPROPERTYKEY pk,PROPVARIANT* ppropvarInk); -int SHGetUnreadMailCountW(HKEY hKeyUser,LPCWSTR pszMailAddress,DWORD* pdwCount,FILETIME* pFileTime,LPCWSTR pszShellExecuteCommand,int cchShellExecuteCommand); -int SHHandleUpdateImage(PCIDLIST_ABSOLUTE pidlExtra); -int SHILCreateFromPath(LPCWSTR pszPath,PIDLIST_ABSOLUTE* ppidl,DWORD* rgflnOut); -int SHInvokePrinterCommand(HWND hwnd,UINT uAction,LPCTSTR lpBuf1,LPCTSTR lpBuf2,BOOL fModal); -int SHIsFileAvailableOffline(LPCWSTR pszPath,LPDWORD pdwStatus); -int SHLimitInputEdit(HWND hwndEdit,IShellFolder* psf); -int SHLoadInProc(REFCLSID rclsid); -int SHLoadNonloadedIconOverlayIdentifiers(); -int SHLoadOLE(LPARAM lParam); -int SHLocalStrDup(LPCWSTR psz,LPWSTR* ppsz); -int SHMapIDListToImageListIndexAsync(IShellTaskScheduler* pts,IShellFolder* psf,LPCITEMIDLIST pidl,UINT flags,PFNASYNCICONTASKBALLBACK pfn,void* pvData,void* pvHint,int* piIndex,int* piIndexSel); -int SHMapPIDLToSystemImageListIndex(IShellFolder* psf,PCUITEMID_CHILD pidl,int* piIndex); -int SHMultiFileProperties(IDataObject* pdtobj,DWORD dwFlags); -int SHObjectProperties(HWND hwnd,DWORD shopObjectType,PCWSTR pszObjectName,PCWSTR pszPropertyPage); -int SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder,UINT cidl,PCUITEMID_CHILD_ARRAY* apidl,DWORD dwFlags); -int SHOpenPropSheetW(LPCWSTR pszCaption,UINT ckeys,const CLSID* pclsidDef,IDataObject* pdtobj,IShellBrowser* psb,LPCWSTR pStartPage); -int SHOpenWithDialog(HWND hwndParent,const OPENASINFO* poainfo); -int SHParseDisplayName(LPCWSTR pszName,IBindCtx* pbc,PIDLIST_ABSOLUTE* ppidl,SFGAOF sfgaoIn,SFGAOF* psfgaoOut); -int SHPathPrepareForWrite(HWND hwnd,IUnknown* punkEnableModless,LPCTSTR pszPath,DWORD dwFlags); -int SHPropStgCreate(IPropertySetStorage* psstg,REFFMTID fmtid,const CLSID* pclsid,DWORD grfFlags,DWORD grfMode,DWORD dwDisposition,IPropertyStorage** ppstg,UINT* puCodePage); -int SHPropStgReadMultiple(IPropertyStorage* pps,UINT uCodePage,ULONG cpspec); -int SHPropStgWriteMultiple(IPropertyStorage* pps,UINT* uCodePage,ULONG cpspec,PROPID propidNameFirst); -int SHQueryRecycleBin(LPCTSTR pszRootPath,LPSHQUERYRBINFO pSHQueryRBInfo); -int SHQueryUserNotificationState(QUERY_USER_NOTIFICATION_STATE* pquns); -int SHRemoveLocalizedName(LPCWSTR pszPath); -int SHReplaceFromPropSheetExtArray(HPSXA hpsxa,UINT uPageID,LPFNADDPROPSHEETPAGE lpfnReplaceWith,LPARAM lParam); -int SHResolveLibrary(IShellItem* psiLibrary); -int SHRestricted(RESTRICTIONS rest); -int SHRunControlPanel(LPCWSTR lpcszCmdLine,HWND hwndMsgParent); -int SHSetDefaultProperties(HWND hwnd,IShellItem* psi,DWORD dwFileOpFlags,IFileOperationProgressSink* pfops); -int SHSetFolderPath(DWORD csidl,HANDLE hToken,DWORD dwFlags,LPCTSTR pszPath); -int SHSetInstanceExplorer(IUnknown* punk); -int SHSetKnownFolderPath(REFKNOWNFOLDERID rfid,DWORD dwFlags,HANDLE hToken,PCWSTR pszPath); -int SHSetLocalizedName(LPCWSTR pszPath,LPCWSTR pszResModule,int idsRes); -int SHSetTemporaryPropertyForItem(IShellItem* psi,REFPROPERTYKEY propkey,REFPROPVARIANT propvar); -int SHSetUnreadMailCountW(LPCWSTR pszMailAddress,DWORD dwCount,LPCWSTR pszShellExecuteCommand); -int SHShellFolderView_Message(HWND hwnd,UINT uMsg,LPARAM lparam); -int SHShowManageLibraryUI(IShellItem* psiLibrary,HWND hwndOwner,LPCWSTR pszTitle,LPCWSTR pszInstruction,LIBRARYMANAGEDIALOGOPTIONS lmdOptions); -int SHSimpleIDListFromPath(LPCWSTR pszPath); -int SHStartNetConnectionDialogW(HWND hwnd,LPCWSTR pszRemoteName,DWORD dwType); -int SHTestTokenMembership(HANDLE hToken,ULONG ulRID); -int SHUnlockShared(void* pvData); -int SHUpdateImage(LPCTSTR pszHashItem,int iIndex,UINT uFlags,int iImageIndex); -int SHValidateUNC(HWND hwndOwner,LPWSTR pszFile,UINT fConnect); -int SetCurrentProcessExplicitAppUserModelID(PCWSTR AppID); -int ShellAbout(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); -int ShellAboutA(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); -int ShellAboutW(HWND hWnd,LPCTSTR szApp,LPCTSTR szOtherStuff,HICON hIcon); -int ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); -int ShellExecuteA(HWND hWnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); -int ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo); -int ShellExecuteExW(LPSHELLEXECUTEINFO lpExecInfo); -int ShellExecuteW(HWND hWnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); -int Shell_GetCachedImageIndex(LPCWSTR pwszIconPath,int iIconIndex,UINT uIconFlags); -int Shell_GetImageLists(HIMAGELIST* phiml,HIMAGELIST* phimlSmall); -int Shell_MergeMenus(HMENU hmDst,HMENU hmSrc,UINT uInsert,UINT uIDAdjust,UINT uIDAdjustMax,ULONG uFlags); -int Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid); -int Shell_NotifyIconGetRect(const NOTIFYICONIDENTIFIER* identifier,RECT* iconLocation); -int Shell_NotifyIconW(DWORD dwMessage,PNOTIFYICONDATA pnid); -int SignalFileOpen(PCIDLIST_ABSOLUTE pidl); -int StgMakeUniqueName(IStorage* pstgParent,PCWSTR pszFileSpec,DWORD grfMode,REFIID riid,void** ppv); -int WOWShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd,void* lpfnCBWinExec); -int Win32DeleteFile(LPCTSTR pszFileName); -int WriteCabinetState(CABINETSTATE* pcs); \ No newline at end of file +int;AssocCreateForClasses;const ASSOCIATIONELEMENT* rgClasses;ULONG cClasses;REFIID riid;void** ppv; +int;AssocGetDetailsOfPropKey;IShellFolder* psf;PCUITEMID_CHILD pidl;PROPERTYKEY* pkey;VARIANT* pv;BOOL* pfFoundPropKey; +int;CDefFolderMenu_Create2;PCIDLIST_ABSOLUTE pidlFolder;HWND hwnd;UINT cidl;PCUITEMID_CHILD_ARRAY* apidl;IShellFolder* psf;LPFNDFMCALLBACK lpfn;UINT nKeys;const HKEY* ahkeys;IContextMenu** ppcm; +int;CIDLData_CreateFromIDArray;PCIDLIST_ABSOLUTE pidlFolder;UINT cidl;PCUIDLIST_RELATIVE_ARRAY apidl;IDataObject** ppdtobj; +int;CallCPLEntry16;HINSTANCE hInst;FARPROC16 lpfnEntry;HWND hwndCPL;UINT msg;LPARAM lParam1;LPARAM lParam2; +int;CommandLineToArgvW;LPCWSTR lpCmdLine;int* pNumArgs; +int;DAD_AutoScroll;HWND hwnd;AUTO_SCROLL_DATA* pad;const POINT* pptNow; +int;DAD_DragEnterEx;HWND hwndTarget;const POINT ptStart; +int;DAD_DragLeave;; +int;DAD_DragMove;POINT pt; +int;DAD_SetDragImage;HIMAGELIST him;POINT* pptOffset; +int;DAD_ShowDragImage;BOOL fShow; +int;DllGetVersion;DLLVERSIONINFO* pDllVersionInfo; +int;DoEnvironmentSubst;LPTSTR pszString;UINT cchString; +int;DragAcceptFiles;HWND hWnd;BOOL fAccept; +int;DragFinish;HDROP hDrop; +int;DragQueryFile;HDROP hDrop;UINT iFile;LPTSTR lpBuffer;UINT nBuffer; +int;DragQueryFileA;HDROP hDrop;UINT iFile;LPTSTR lpBuffer;UINT nBuffer; +int;DragQueryFileW;HDROP hDrop;UINT iFile;LPTSTR lpBuffer;UINT nBuffer; +int;DragQueryPoint;HDROP hDrop;LPPOINT lppt; +int;DriveType;int iDrive; +int;DuplicateIcon;HINSTANCE hInst;HICON hIcon; +int;ExtractAssociatedIcon;HINSTANCE hInst;LPTSTR lpIconPath;LPWORD lpiIcon; +int;ExtractAssociatedIconA;HINSTANCE hInst;LPTSTR szIconPath;LPWORD lpiIcon; +int;ExtractAssociatedIconEx;HINSTANCE hInst;LPTSTR lpIconPath;LPWORD lpiIconIndex;LPWORD lpiIconId; +int;ExtractAssociatedIconW;HINSTANCE hInst;LPTSTR szIconPath;LPWORD lpiIcon; +int;ExtractIcon;DWORD hInst;DWORD lpszExeFileName;DWORD nIconIndex; +int;ExtractIcon;HINSTANCE hInst;LPCTSTR lpszExeFileName;UINT nIconIndex; +int;ExtractIconA;HINSTANCE hInst;LPCTSTR lpszExeFileName;UINT nIconIndex; +int;ExtractIconEx;LPCTSTR lpszFile;int nIconIndex;HICON* phiconLarge;HICON* phiconSmall;UINT nIcons; +int;ExtractIconExW;LPCTSTR lpszFile;int nIconIndex;HICON* phiconLarge;HICON* phiconSmall;UINT nIcons; +int;ExtractIconW;HINSTANCE hInst;LPCTSTR lpszExeFileName;UINT nIconIndex; +int;FileIconInit;BOOL fRestoreCache; +int;FindExecutable;LPCTSTR lpFile;LPCTSTR lpDirectory;LPTSTR lpResult; +int;GUIDFromString;LPCTSTR psz;LPGUID pguid; +int;GetCurrentProcessExplicitAppUserModelID;PWSTR* AppID; +int;GetFileNameFromBrowse;HWND hwnd;LPWSTR pszFilePath;UINT cchFilePath;LPCWSTR pszWorkingDir;LPCWSTR pszDefExt;LPCWSTR pszFilters;LPCWSTR szTitle; +int;ILAppendID;PIDLIST_RELATIVE pidl;LPSHITEMID pmkid;BOOL fAppend; +int;ILClone;PCUIDLIST_RELATIVE pidl; +int;ILCloneFirst;PCUIDLIST_RELATIVE pidl; +int;ILCombine;PCIDLIST_ABSOLUTE pidl1;PCUIDLIST_RELATIVE pidl2; +int;ILCreateFromPath;LPCSTR pszPath; +int;ILFindChild;PCIDLIST_ABSOLUTE pidlParent;PCIDLIST_ABSOLUTE pidlChild; +int;ILFindLastID;PCUIDLIST_RELATIVE pidl; +int;ILFree;PIDLIST_RELATIVE pidl; +int;ILGetNext;PCUIDLIST_RELATIVE pidl; +int;ILGetSize;PCUIDLIST_RELATIVE pidl; +int;ILIsEqual;PCIDLIST_ABSOLUTE pidl1;PCIDLIST_ABSOLUTE pidl2; +int;ILIsParent;PCIDLIST_ABSOLUTE pidl1;PCIDLIST_ABSOLUTE pidl2;BOOL fImmediate; +int;ILLoadFromStream;IStream* pstm;PIDLIST_RELATIVE* pidl; +int;ILRemoveLastID;PUIDLIST_RELATIVE pidl; +int;ILSaveToStream;IStream* pstm;PCUIDLIST_RELATIVE pidl; +int;InitNetworkAddressControl;; +int;IsNetDrive;int iDrive; +int;IsUserAnAdmin;; +int;LinkWindow_RegisterClass;; +int;LinkWindow_UnregisterClass;; +int;NTSHChangeNotifyDeregister;ULONG ulID; +int;NTSHChangeNotifyRegister;HWND hwnd;int fSources;LONG fEvents;UINT wMsg;int cEntries;SHChangeNotifyEntry* pfsne; +int;OpenRegStream;HKEY hkey;LPCWSTR pszSubkey;LPCWSTR pszValue;DWORD grfMode; +int;ParseField;LPCTSTR* szData;int n;LPTSTR* szBuf;int iBufLen; +int;PathCleanupSpec;LPCWSTR pszDir;LPWSTR pszSpec; +int;PathGetShortPath;LPWSTR pszLongPath; +int;PathIsExe;LPCWSTR szfile; +int;PathIsSlow;LPCTSTR pszFile;DWORD dwFileAttr; +int;PathMakeUniqueName;LPWSTR pszUniqueName;UINT cchMax;LPCWSTR pszTemplate;LPCWSTR pszLongPlate;LPCWSTR pszDir; +int;PathProcessCommand;LPCWSTR lpSrc;LPWSTR lpDest;int iDestMax;DWORD dwFlags; +int;PathResolve;LPWSTR pszPath;LPCWSTR* dirs;UINT fFlags; +int;PathYetAnotherMakeUniqueName;LPWSTR pszUniqueName;LPCWSTR pszPath;LPCWSTR pszShort;LPCWSTR pszFileSpec; +int;PickIconDlg;HWND hwnd;LPWSTR pszIconPath;UINT cchIconPath;int* piIconIndex; +int;PifMgr_CloseProperties;HANDLE hProps;UINT flOpt; +int;PifMgr_GetProperties;HANDLE hProps;LPCSTR pszGroup;VOID* lpProps;int cbProps;UINT flOpt; +int;PifMgr_OpenProperties;LPCWSTR pszApp;LPCWSTR lpszPIF;UINT hInf;UINT flOpt; +int;PifMgr_SetProperties;HANDLE hProps;LPCSTR pszGroup;VOID* lpProps;int cbProps;UINT flOpt; +int;ReadCabinetState;CABINETSTATE* pcs;int cLength; +int;RealDriveType;int iDrive;BOOL fOKToHitNet; +int;RestartDialog;HWND hParent;LPCWSTR pszPrompt;DWORD dwFlags; +int;RestartDialogEx;HWND hParent;LPCWSTR pszPrompt;DWORD dwFlags;HWND dwReasonCode; +int;SHAddDefaultPropertiesByExt;PCWSTR pszExt;IPropertyStore* pPropStore; +int;SHAddFromPropSheetExtArray;HPSXA hpsxa;LPFNADDPROPSHEETPAGE lpfnAddPage;LPARAM lParam; +int;SHAddToRecentDocs;UINT uFlags;LPCVOID pv; +int;SHAlloc;SIZE_T cb; +int;SHAppBarMessage;DWORD dwMessage;PAPPBARDATA pData; +int;SHAssocEnumHandlers;LPCWSTR pszExtra;ASSOC_FILTER afFilter;IEnumAssocHandlers** ppEnumHandler; +int;SHAssocEnumHandlersForProtocolByApplication;PCWSTR protocol;REFIID riid;void** enumHandlers; +int;SHBindToFolderIDListParent;IShellFolder* psfRoot;PCUIDLIST_RELATIVE pidl;REFIID riid;void** ppv;PCUITEMID_CHILD* ppidlLast; +int;SHBindToObject;IShellFolder* psf;PCUIDLIST_RELATIVE pidl;IBindCtx* pbc;REFIID riid;void** ppv; +int;SHBindToParent;PCIDLIST_ABSOLUTE pidl;REFIID riid;VOID** ppv;PCUITEMID_CHILD* ppidlLast; +int;SHBrowseForFolder;LPBROWSEINFO lpbi; +int;SHCLSIDFromString;LPCWSTR psz;CLSID* pclsid; +int;SHChangeNotification_Lock;HANDLE hChange;DWORD dwProcId;PIDLIST_ABSOLUTE** pppidl;LONG* plEvent; +int;SHChangeNotification_Unlock;HANDLE hLock; +int;SHChangeNotify;DWORD wEventId;DWORD uFlags;LPCVOID dwItem1;LPCVOID dwItem2; +int;SHChangeNotifyDeregister;ULONG ulID; +int;SHChangeNotifyRegister;HWND hwnd;int fSources;LONG fEvents;UINT wMsg;int cEntries;const SHChangeNotifyEntry* pshcne; +int;SHChangeNotifyRegisterThread;SCNRT_STATUS status; +int;SHCloneSpecialIDList;HWND hwndOwner;DWORD csidl;BOOL fCreate; +int;SHCoCreateInstance;LPCWSTR pszCLSID;const CLSID* pclsid;IUnknown* pUnkOuter;REFIID riid;void** ppv; +int;SHCreateAssociationRegistration;REFIID riid;void** ppv; +int;SHCreateDataObject;PCIDLIST_ABSOLUTE pidlFolder;UINT cidl;PCUITEMID_CHILD_ARRAY apidl;IDataObject* pdtInner;REFIID riid;void** ppv; +int;SHCreateDefaultContextMenu;const DEFCONTEXTMENU* pdcm;REFIID riid;void** ppv; +int;SHCreateDefaultExtractIcon;REFIID riid;void** ppv; +int;SHCreateDefaultPropertiesOp;IShellItem* psi;IFileOperation** ppFileOp; +int;SHCreateDirectory;HWND hwnd;LPCWSTR pszPath; +int;SHCreateDirectoryEx;HWND hwnd;LPCTSTR pszPath;const SECURITY_ATTRIBUTES* psa; +int;SHCreateFileExtractIconW;LPCWSTR pszFile;DWORD dwFileAttributes;REFIID riid;void** ppv; +int;SHCreateItemFromIDList;PCIDLIST_ABSOLUTE pidl;REFIID riid;void** ppv; +int;SHCreateItemFromParsingName;PCWSTR pszPath;IBindCtx* pbc;REFIID riid;void** ppv; +int;SHCreateItemFromRelativeName;IShellItem* psiParent;PCWSTR pszName;IBindCtx* pbc;REFIID riid;void** ppv; +int;SHCreateItemInKnownFolder;REFKNOWNFOLDERID kfid;KNOWN_FOLDER_FLAG dwKFFlags;PCWSTR pszItem;REFIID riid;void** ppv; +int;SHCreateItemWithParent;PCIDLIST_ABSOLUTE pidlParent;IShellFolder* psfParent;PCUITEMID_CHILD pidl;REFIID riid;void** ppvItem; +int;SHCreateProcessAsUserW;PSHCREATEPROCESSINFOW pscpi; +int;SHCreatePropSheetExtArray;HKEY hkey;LPCWSTR pszSubkey;UINT max_iface; +int;SHCreateQueryCancelAutoPlayMoniker;IMoniker** ppmoniker; +int;SHCreateShellFolderView;const SFV_CREATE* pcsfv;IShellView** ppsv; +int;SHCreateShellFolderViewEx;LPCSFV pcsfv;IShellView** ppsv; +int;SHCreateShellItem;PCIDLIST_ABSOLUTE pidlParent;IShellFolder* psfParent;PCUITEMID_CHILD pidl;IShellItem** ppsi; +int;SHCreateShellItemArray;PCIDLIST_ABSOLUTE pidlParent;IShellFolder* psf;UINT cidl;PCUITEMID_CHILD_ARRAY ppidl;IShellItemArray** ppsiItemArray; +int;SHCreateShellItemArrayFromDataObject;IDataObject* pdo;REFIID riid;void** ppv; +int;SHCreateShellItemArrayFromIDLists;UINT cidl;PCIDLIST_ABSOLUTE_ARRAY rgpidl;IShellItemArray** ppsiItemArray; +int;SHCreateShellItemArrayFromShellItem;IShellItem* psi;REFIID riid;void** ppv; +int;SHCreateStdEnumFmtEtc;UINT cfmt;IEnumFORMATETC** ppenumFormatEtc; +int;SHDefExtractIcon;LPCTSTR pszIconFile;int iIndex;UINT uFlags;HICON* phiconLarge;HICON* phiconSmall;UINT nIconSize; +int;SHDestroyPropSheetExtArray;HPSXA hpsxa; +int;SHDoDragDrop;HWND hwnd;IDataObject* pdtobj;IDropSource* pdsrc;DWORD dwEffect;DWORD* pdwEffect; +int;SHEmptyRecycleBin;HWND hwnd;LPCTSTR pszRootPath;DWORD dwFlags; +int;SHEnumerateUnreadMailAccountsW;HKEY hKeyUser;DWORD dwIndex;LPWSTR pszMailAddress;int cchMailAddress; +int;SHEvaluateSystemCommandTemplate;PCWSTR pszCmdTemplate;PWSTR* ppszApplication;PWSTR* ppszCommandLine;PWSTR* ppszParameters; +int;SHExtractIconsW;LPCWSTR pszFileName;int nIconIndex;int cxIcon;int cyIcon;HICON* phIcon;UINT* pIconId;UINT nIcons;UINT flags; +int;SHFileOperation;LPSHFILEOPSTRUCT lpFileOp; +int;SHFindFiles;PCIDLIST_ABSOLUTE pidlFolder;PCIDLIST_ABSOLUTE pidlSaveFile; +int;SHFind_InitMenuPopup;HMENU hmenu;HWND hwnd;UINT idCmdFirst;UINT idCmdLast; +int;SHFlushClipboard;; +int;SHFlushSFCache;; +int;SHFormatDrive;HWND hwnd;UINT drive;UINT fmtID;UINT options; +int;SHFree;void* pv; +int;SHFreeNameMappings;HANDLE hNameMappings; +int;SHGetAttributesFromDataObject;IDataObject* pdo;DWORD dwAttributeMask;DWORD* pdwAttributes;UINT* pcItems; +int;SHGetDataFromIDList;IShellFolder* psf;PCUITEMID_CHILD pidl;DWORD nFormat;PVOID pv;int cb; +int;SHGetDesktopFolder;IShellFolder** ppshf; +int;SHGetDiskFreeSpace;LPCTSTR pszVolume;ULARGE_INTEGER* pqwFreeCaller;ULARGE_INTEGER* pqwTot;ULARGE_INTEGER* pqwFree; +int;SHGetDiskFreeSpaceEx;LPCTSTR pszVolume;ULARGE_INTEGER* pqwFreeCaller;ULARGE_INTEGER* pqwTot;ULARGE_INTEGER* pqwFree; +int;SHGetDiskFreeSpaceExW;LPCTSTR pszVolume;ULARGE_INTEGER* pqwFreeCaller;ULARGE_INTEGER* pqwTot;ULARGE_INTEGER* pqwFree; +int;SHGetDriveMedia;LPCWSTR pszDrive;DWORD* pdwMediaContent; +int;SHGetFileInfo;LPCTSTR szPath;DWORD dwFileAttributes;SHFILEINFO* pSFileInfo;UINT cbFileInfo;UINT uFlags; +int;SHGetFileInfoW;LPCTSTR szPath;DWORD dwFileAttributes;SHFILEINFO* pSFileInfo;UINT cbFileInfo;UINT uFlags; +int;SHGetFolderLocation;HWND hwndOwner;DWORD nFolder;HANDLE hToken;DWORD dwReserved;PIDLIST_ABSOLUTE* ppidl; +int;SHGetFolderPath;HWND hwndOwner;int nFolder;HANDLE hToken;DWORD dwFlags;LPTSTR pszPath; +int;SHGetFolderPathA;HWND hwndOwner;int nFolder;HANDLE hToken;DWORD dwReserved;LPTSTR lpBuffer; +int;SHGetFolderPathAndSubDir;HWND hwnd;DWORD csidl;HANDLE hToken;DWORD dwFlags;LPCTSTR pszSubDir;LPTSTR pszPath; +int;SHGetFolderPathW;HWND hwndOwner;int nFolder;HANDLE hToken;DWORD dwReserved;LPTSTR lpBuffer; +int;SHGetIDListFromObject;IUnknown* punk;PIDLIST_ABSOLUTE* ppidl; +int;SHGetIconOverlayIndex;LPCTSTR pszIconPath;int iIconIndex; +int;SHGetImageList;int iImageList;REFIID riid;void** ppv; +int;SHGetInstanceExplorer;IUnknown** ppunk; +int;SHGetItemFromDataObject;IDataObject* pdtobj;DATAOBJ_GET_ITEM_FLAGS dwFlags;REFIID riid;void** ppv; +int;SHGetItemFromObject;IUnknown* punk;REFIID riid;void** ppv; +int;SHGetKnownFolderIDList;REFKNOWNFOLDERID rfid;KNOWN_FOLDER_FLAG dwFlags;HANDLE hToken;PIDLIST_ABSOLUTE* ppidl; +int;SHGetKnownFolderItem;REFKNOWNFOLDERID rfid;KNOWN_FOLDER_FLAG dwFlags;HANDLE hToken;REFIID riid;void** ppv; +int;SHGetKnownFolderPath;REFKNOWNFOLDERID rfid;DWORD dwFlags;HANDLE hToken;PWSTR* ppszPath; +int;SHGetLocalizedName;LPCWSTR pszPath;LPWSTR pszResModule;UINT cch;int* pidsRes; +int;SHGetMalloc;LPMALLOC* ppMalloc; +int;SHGetNameFromIDList;PCIDLIST_ABSOLUTE pidl;SIGDN sigdnName;PWSTR* ppszName; +int;SHGetNameFromPropertyKey;REFPROPERTYKEY propkey;PWSTR* ppszCanonicalName; +int;SHGetNewLinkInfo;LPCTSTR pszLinkTo;LPCTSTR pszDir;LPTSTR pszName;BOOL* pfMustCopy;UINT uFlags; +int;SHGetPathFromIDList;PCIDLIST_ABSOLUTE pidl;LPTSTR pszPath; +int;SHGetPathFromIDListEx;PCIDLIST_ABSOLUTE pidl;PWSTR pszPath;DWORD cchPath;GPFIDL_FLAGS uOpts; +int;SHGetPathFromIDListW;PCIDLIST_ABSOLUTE pidlTarget;LPTSTR pszPath; +int;SHGetPropertyStoreForWindow;HWND hwnd;REFIID riid;void** ppv; +int;SHGetPropertyStoreFromIDList;PCIDLIST_ABSOLUTE pidl;GETPROPERTYSTOREFLAGS flags;REFIID riid;void** ppv; +int;SHGetPropertyStoreFromParsingName;PCWSTR pszPath;IBindCtx* pbc;GETPROPERTYSTOREFLAGS flags;REFIID riid;void** ppv; +int;SHGetRealIDL;IShellFolder* psf;PCUITEMID_CHILD pidlSimple;PITEMID_CHILD* ppidlReal; +int;SHGetSetFolderCustomSettings;LPSHFOLDERCUSTOMSETTINGS pfcs;LPCTSTR pszPath;DWORD dwReadWrite; +int;SHGetSetSettings;LPSHELLSTATE lpss;DWORD dwMask;BOOL bSet; +int;SHGetSettings;LPSHELLFLAGSTATE lpsfs;DWORD dwMask; +int;SHGetShellStyleHInstance;; +int;SHGetSpecialFolderLocation;HWND hwndOwner;DWORD nFolder;PIDLIST_ABSOLUTE* pidl; +int;SHGetSpecialFolderPath;HWND hwndOwner;LPTSTR lpszPath;DWORD csidl;BOOL fCreate; +int;SHGetSpecialFolderPathA;HWND hwnd;LPTSTR pszPath;DWORD csidl;BOOL fCreate; +int;SHGetSpecialFolderPathW;HWND hwnd;LPTSTR pszPath;DWORD csidl;BOOL fCreate; +int;SHGetStockIconInfo;SHSTOCKICONID siid;UINT uFlags;SHSTOCKICONINFO* psii; +int;SHGetTemporaryPropertyForItem;IShellItem* psi;REFPROPERTYKEY pk;PROPVARIANT* ppropvarInk; +int;SHGetUnreadMailCountW;HKEY hKeyUser;LPCWSTR pszMailAddress;DWORD* pdwCount;FILETIME* pFileTime;LPCWSTR pszShellExecuteCommand;int cchShellExecuteCommand; +int;SHHandleUpdateImage;PCIDLIST_ABSOLUTE pidlExtra; +int;SHILCreateFromPath;LPCWSTR pszPath;PIDLIST_ABSOLUTE* ppidl;DWORD* rgflnOut; +int;SHInvokePrinterCommand;HWND hwnd;UINT uAction;LPCTSTR lpBuf1;LPCTSTR lpBuf2;BOOL fModal; +int;SHIsFileAvailableOffline;LPCWSTR pszPath;LPDWORD pdwStatus; +int;SHLimitInputEdit;HWND hwndEdit;IShellFolder* psf; +int;SHLoadInProc;REFCLSID rclsid; +int;SHLoadNonloadedIconOverlayIdentifiers;; +int;SHLoadOLE;LPARAM lParam; +int;SHLocalStrDup;LPCWSTR psz;LPWSTR* ppsz; +int;SHMapIDListToImageListIndexAsync;IShellTaskScheduler* pts;IShellFolder* psf;LPCITEMIDLIST pidl;UINT flags;PFNASYNCICONTASKBALLBACK pfn;void* pvData;void* pvHint;int* piIndex;int* piIndexSel; +int;SHMapPIDLToSystemImageListIndex;IShellFolder* psf;PCUITEMID_CHILD pidl;int* piIndex; +int;SHMultiFileProperties;IDataObject* pdtobj;DWORD dwFlags; +int;SHObjectProperties;HWND hwnd;DWORD shopObjectType;PCWSTR pszObjectName;PCWSTR pszPropertyPage; +int;SHOpenFolderAndSelectItems;PCIDLIST_ABSOLUTE pidlFolder;UINT cidl;PCUITEMID_CHILD_ARRAY* apidl;DWORD dwFlags; +int;SHOpenPropSheetW;LPCWSTR pszCaption;UINT ckeys;const CLSID* pclsidDef;IDataObject* pdtobj;IShellBrowser* psb;LPCWSTR pStartPage; +int;SHOpenWithDialog;HWND hwndParent;const OPENASINFO* poainfo; +int;SHParseDisplayName;LPCWSTR pszName;IBindCtx* pbc;PIDLIST_ABSOLUTE* ppidl;SFGAOF sfgaoIn;SFGAOF* psfgaoOut; +int;SHPathPrepareForWrite;HWND hwnd;IUnknown* punkEnableModless;LPCTSTR pszPath;DWORD dwFlags; +int;SHPropStgCreate;IPropertySetStorage* psstg;REFFMTID fmtid;const CLSID* pclsid;DWORD grfFlags;DWORD grfMode;DWORD dwDisposition;IPropertyStorage** ppstg;UINT* puCodePage; +int;SHPropStgReadMultiple;IPropertyStorage* pps;UINT uCodePage;ULONG cpspec; +int;SHPropStgWriteMultiple;IPropertyStorage* pps;UINT* uCodePage;ULONG cpspec;PROPID propidNameFirst; +int;SHQueryRecycleBin;LPCTSTR pszRootPath;LPSHQUERYRBINFO pSHQueryRBInfo; +int;SHQueryUserNotificationState;QUERY_USER_NOTIFICATION_STATE* pquns; +int;SHRemoveLocalizedName;LPCWSTR pszPath; +int;SHReplaceFromPropSheetExtArray;HPSXA hpsxa;UINT uPageID;LPFNADDPROPSHEETPAGE lpfnReplaceWith;LPARAM lParam; +int;SHResolveLibrary;IShellItem* psiLibrary; +int;SHRestricted;RESTRICTIONS rest; +int;SHRunControlPanel;LPCWSTR lpcszCmdLine;HWND hwndMsgParent; +int;SHSetDefaultProperties;HWND hwnd;IShellItem* psi;DWORD dwFileOpFlags;IFileOperationProgressSink* pfops; +int;SHSetFolderPath;DWORD csidl;HANDLE hToken;DWORD dwFlags;LPCTSTR pszPath; +int;SHSetInstanceExplorer;IUnknown* punk; +int;SHSetKnownFolderPath;REFKNOWNFOLDERID rfid;DWORD dwFlags;HANDLE hToken;PCWSTR pszPath; +int;SHSetLocalizedName;LPCWSTR pszPath;LPCWSTR pszResModule;int idsRes; +int;SHSetTemporaryPropertyForItem;IShellItem* psi;REFPROPERTYKEY propkey;REFPROPVARIANT propvar; +int;SHSetUnreadMailCountW;LPCWSTR pszMailAddress;DWORD dwCount;LPCWSTR pszShellExecuteCommand; +int;SHShellFolderView_Message;HWND hwnd;UINT uMsg;LPARAM lparam; +int;SHShowManageLibraryUI;IShellItem* psiLibrary;HWND hwndOwner;LPCWSTR pszTitle;LPCWSTR pszInstruction;LIBRARYMANAGEDIALOGOPTIONS lmdOptions; +int;SHSimpleIDListFromPath;LPCWSTR pszPath; +int;SHStartNetConnectionDialogW;HWND hwnd;LPCWSTR pszRemoteName;DWORD dwType; +int;SHTestTokenMembership;HANDLE hToken;ULONG ulRID; +int;SHUnlockShared;void* pvData; +int;SHUpdateImage;LPCTSTR pszHashItem;int iIndex;UINT uFlags;int iImageIndex; +int;SHValidateUNC;HWND hwndOwner;LPWSTR pszFile;UINT fConnect; +int;SetCurrentProcessExplicitAppUserModelID;PCWSTR AppID; +int;ShellAbout;HWND hWnd;LPCTSTR szApp;LPCTSTR szOtherStuff;HICON hIcon; +int;ShellAboutA;HWND hWnd;LPCTSTR szApp;LPCTSTR szOtherStuff;HICON hIcon; +int;ShellAboutW;HWND hWnd;LPCTSTR szApp;LPCTSTR szOtherStuff;HICON hIcon; +int;ShellExecute;HWND hwnd;LPCTSTR lpOperation;LPCTSTR lpFile;LPCTSTR lpParameters;LPCTSTR lpDirectory;INT nShowCmd; +int;ShellExecuteA;HWND hWnd;LPCTSTR lpOperation;LPCTSTR lpFile;LPCTSTR lpParameters;LPCTSTR lpDirectory;INT nShowCmd; +int;ShellExecuteEx;LPSHELLEXECUTEINFO lpExecInfo; +int;ShellExecuteExW;LPSHELLEXECUTEINFO lpExecInfo; +int;ShellExecuteW;HWND hWnd;LPCTSTR lpOperation;LPCTSTR lpFile;LPCTSTR lpParameters;LPCTSTR lpDirectory;INT nShowCmd; +int;Shell_GetCachedImageIndex;LPCWSTR pwszIconPath;int iIconIndex;UINT uIconFlags; +int;Shell_GetImageLists;HIMAGELIST* phiml;HIMAGELIST* phimlSmall; +int;Shell_MergeMenus;HMENU hmDst;HMENU hmSrc;UINT uInsert;UINT uIDAdjust;UINT uIDAdjustMax;ULONG uFlags; +int;Shell_NotifyIcon;DWORD dwMessage;PNOTIFYICONDATA pnid; +int;Shell_NotifyIconGetRect;const NOTIFYICONIDENTIFIER* identifier;RECT* iconLocation; +int;Shell_NotifyIconW;DWORD dwMessage;PNOTIFYICONDATA pnid; +int;SignalFileOpen;PCIDLIST_ABSOLUTE pidl; +int;StgMakeUniqueName;IStorage* pstgParent;PCWSTR pszFileSpec;DWORD grfMode;REFIID riid;void** ppv; +int;WOWShellExecute;HWND hwnd;LPCTSTR lpOperation;LPCTSTR lpFile;LPCTSTR lpParameters;LPCTSTR lpDirectory;INT nShowCmd;void* lpfnCBWinExec; +int;Win32DeleteFile;LPCTSTR pszFileName; +int;WriteCabinetState;CABINETSTATE* pcs; \ No newline at end of file diff --git a/x64_dbg_gui/Project/Data/stdio.txt b/x64_dbg_gui/Project/Data/stdio.txt index 0f206671..50e599b0 100644 --- a/x64_dbg_gui/Project/Data/stdio.txt +++ b/x64_dbg_gui/Project/Data/stdio.txt @@ -1,61 +1,61 @@ -int printf(constchar *, ...); -int _scanf(char * format, ...); -char * strchr(char *,char); -void * memcpy(void *, constvoid *, size_t); -int memcmp(constvoid *, constvoid *, size_t); -void * memset(void *,int, size_t); -char * _strset(char *,int); -char * strcpy(char *, constchar *); -char * strcat(char *, constchar *); -int strcmp(constchar *, constchar *); -size_t strlen(constchar *); -int _chdir(constchar *); -char * _getcwd(char *,int); -int _mkdir(constchar *); -int _rmdir(constchar *); -char * _fullpath(char *, constchar *, size_t); -void _splitpath(constchar *,char *,char *,char *,char *); -void _makepath(char *, constchar *, constchar *, constchar *, constchar *); -long _findfirst(constchar *, struct _finddata_t *); -int _findnext(long, struct _finddata_t *); -long _findfirst(constchar *, DWORD *); -int _findnext(long, DWORD *); -int _findclose(long); -void * memccpy(void *, constvoid *,int, unsignedint); -int memicmp(constvoid *, constvoid *, unsignedint); -void * memccpy(void *, constvoid *,int, DWORD); -int memicmp(constvoid *, constvoid *, DWORD); -int strcmpi(constchar *, constchar *); -int stricmp(constchar *, constchar *); -char * strdup(constchar *); -char * strlwr(char *); -int strnicmp(constchar *, constchar *, size_t); -char * strnset(char *,int, size_t); -char * strrev(char *); -char * strset(char *,int); -char * strupr(char *); -char * strchr(constchar *,int); -int _strcmpi(constchar *, constchar *); -int _stricmp(constchar *, constchar *); -int strcoll(constchar *, constchar *); -int _stricoll(constchar *, constchar *); -int _strncoll(constchar *, constchar *, size_t); -int _strnicoll(constchar *, constchar *, size_t); -size_t strcspn(constchar *, constchar *); -char * _strdup(constchar *); -char * _strerror(constchar *); -char * strerror(int); -char * _strlwr(char *); -char * strncat(char *, constchar *, size_t); -int strncmp(constchar *, constchar *, size_t); -int _strnicmp(constchar *, constchar *, size_t); -char * strncpy(char *, constchar *, size_t); -char * _strnset(char *,int, size_t); -char * strpbrk(constchar *, constchar *); -char * strrchr(constchar *,int); -char * _strrev(char *); -size_t strspn(constchar *, constchar *); -char * strstr(constchar *, constchar *); -char * strtok(char *, constchar *); -char * _strupr(char *); -size_t strxfrm (char *, constchar *, size_t); +int printf;constchar *; ...; +int;_scanf;char * format; ...; +char *;strchr;char *;char; +void *; memcpy;void *; constvoid *; size_t; +int;;memcmp;constvoid *; constvoid *; size_t; +void *; memset;void *;int; size_t; +char *; _strset;char *;int; +char *; strcpy;char *; constchar *; +char *; strcat;char *; constchar *; +int;;strcmp;constchar *; constchar *; +size_t; strlen;constchar *; +int;_chdir;constchar *; +char *;_getcwd;char *;int; +int;_mkdir;constchar *; +int;_rmdir;constchar *; +char *;_fullpath;char *; constchar *; size_t; +void;_splitpath;constchar *;char *;char *;char *;char *; +void;_makepath;char *; constchar *; constchar *; constchar *; constchar *; +long;_findfirst;constchar *; struct _finddata_t *; +int;_findnext;long; struct _finddata_t *; +long;_findfirst;constchar *; DWORD *; +int;_findnext;long; DWORD *; +int;_findclose;long; +void *;memccpy;void *; constvoid *;int; unsignedint; +int;memicmp;constvoid *; constvoid *; unsignedint; +void *;memccpy;void *; constvoid *;int; DWORD; +int;memicmp;constvoid *; constvoid *; DWORD; +int;strcmpi;constchar *; constchar *; +int;stricmp;constchar *; constchar *; +char *;strdup;constchar *; +char *;strlwr;char *; +int;strnicmp;constchar *; constchar *; size_t; +char *;strnset;char *;int; size_t; +char *;strrev;char *; +char *;strset;char *;int; +char *;strupr;char *; +char *; strchr;constchar *;int; +int;_strcmpi;constchar *; constchar *; +int;_stricmp;constchar *; constchar *; +int;strcoll;constchar *; constchar *; +int;_stricoll;constchar *; constchar *; +int;_strncoll;constchar *; constchar *; size_t; +int;_strnicoll;constchar *; constchar *; size_t; +size_t; strcspn;constchar *; constchar *; +char *; _strdup;constchar *; +char *; _strerror;constchar *; +char *; strerror;int; +char *; _strlwr;char *; +char *; strncat;char *; constchar *; size_t; +int;;strncmp;constchar *; constchar *; size_t; +int;;_strnicmp;constchar *; constchar *; size_t; +char *; strncpy;char *; constchar *; size_t; +char *; _strnset;char *;int; size_t; +char *; strpbrk;constchar *; constchar *; +char *; strrchr;constchar *;int; +char *; _strrev;char *; +size_t; strspn;constchar *; constchar *; +char *; strstr;constchar *; constchar *; +char *; strtok;char *; constchar *; +char *; _strupr;char *; +size_t; strxfrm ;char *; constchar *; size_t; diff --git a/x64_dbg_gui/Project/Data/user32.txt b/x64_dbg_gui/Project/Data/user32.txt index dac74ceb..eab1f296 100644 --- a/x64_dbg_gui/Project/Data/user32.txt +++ b/x64_dbg_gui/Project/Data/user32.txt @@ -1,719 +1,719 @@ -BOOL DestroyWindow(HWND hWnd); -BOOL EndDialog(HWND hDlg,int nResult); -BOOL EndPaint(HWND hWnd,const PAINTSTRUCT *lpPaint); -BOOL GetClientRect(HWND hWnd,LPRECT lpRect); -BOOL GetWindowRect(HWND hWnd,RECT * lpRect); -BOOL ShowWindow(HWND hWnd,int nCmdShow); -BOOL TranslateMessage(const MSG *lpMsg); -BOOL UpdateWindow(HWND hWnd); -COLORREF SetPixel(HDC,int,int,COLORREF); -HDC BeginPaint(HWND hWnd,PAINTSTRUCT *lpPaint); -HLOCAL LocalFree(HLOCAL hMem); -HMODULE GetModuleHandleA(LPCSTR lpModuleName); -int DrawTextA(HDC hDC,LPCSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); -void PostQuitMessage(int nExitCode); -void GetStartupInfo(LPSTARTUPINFO lpStartupInfo); -void GetStartupInfoA(LPSTARTUPINFO lpStartupInfo); -void GetStartupInfoW(LPSTARTUPINFO lpStartupInfo); -int EditWndProc(DWORD hWnd,DWORD uMsg,DWORD wParam,DWORD lParam); -int ActivateKeyboardLayout(KeyboardLayoutHandle hkl,UINT Flags); -int AddClipboardFormatListener(HWND hwnd); -int AdjustWindowRect(LPRECT lpRect,DWORD dwWinStyle,BOOL bMenu); -int AdjustWindowRectEx(LPRECT lpRect,DWORD dwWinStyle,BOOL bMenu,DWORD dwEsStyle); -int AllowActivateDetachQueuesSetFocus(); -int AllowSetForegroundWindow(DWORD dwProcessId); -int AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags); -int AnyPopup(); -int AppendMenu(HMENU hMenu,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); -int AppendMenuA(HMENU hMenu,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); -int AppendMenuW(HMENU hMenu,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); -int ArrangeIconicWindows(HWND hwnd); -int AttachThreadInput(DWORD idAttach,DWORD idAttachTo,BOOL fAttach); -int BeginDeferWindowPos(int nNumWindows); -int BeginPaint(HWND hwnd,LPPAINTSTRUCT lpPaint); -int BlockInput(BOOL fBlockIt); -int BringWindowToTop(HWND hWnd); -int BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM Param); -int BroadcastSystemMessageEx(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam,PBSMINFO pBSMInfo); -int CalculatePopupWindowPosition(const POINT* anchorPoint,const SIZE* windowSize,UINT flags,RECT* excludeRect,RECT* popupWindowPosition); -int CallMsgFilter(LPMSG lpMsg,int nCode); -int CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam); -int CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int CallWindowProcA(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int CallWindowProcW(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int CascadeWindows(HWND hwndParent,UINT wHow,const RECT* lpRect,UINT cKids,const HWND* lpKids); -int ChangeClipboardChain(HWND hWndRemove,HWND hWndNewNext); -int ChangeDisplaySettings(DEVMODE* lpDevMode,DWORD dwflags); -int ChangeDisplaySettingsEx(LPCTSTR lpszDeviceName,DEVMODE* lpDevMode,HWND hwnd,DWORD dwflags,LPVOID lParam); -int ChangeWindowMessageFilter(UINT message,DWORD dwFlag); -int ChangeWindowMessageFilterEx(HWND hWnd,UINT message,DWORD action,PCHANGEFILTERSTRUCT pChangeFilterStruct); -int CharLower(LPTSTR lpsz); -int CharLowerA(LPTSTR lpsz); -int CharLowerBuff(LPTSTR lpsz,DWORD cchLength); -int CharLowerBuffA(LPTSTR lpsz,DWORD cchLength); -int CharLowerBuffW(LPTSTR lpsz,DWORD cchLength); -int CharLowerW(LPTSTR lpsz); -int CharNext(LPCTSTR lpsz); -int CharNextA(LPCTSTR lpsz); -int CharNextExA(WORD CodePage,LPCSTR lpCurrentChar,DWORD dwFlags); -int CharNextW(LPCTSTR lpsz); -int CharPrev(LPCTSTR lpszStart,LPCTSTR lpszCurrent); -int CharPrevA(LPCTSTR lpszStart,LPCTSTR lpszCurrent); -int CharPrevExA(WORD CodePage,LPCSTR lpStart,LPCSTR lpCurrentChar,DWORD dwFlags); -int CharToOem(LPCTSTR lpszSrc,LPSTR lpszDst); -int CharToOemA(LPCTSTR lpszSrc,LPSTR lpszDst); -int CharToOemBuff(LPCTSTR lpszSrc,LPSTR lpszDst,DWORD cchDstLength); -int CharToOemW(LPCTSTR lpszSrc,LPSTR lpszDst); -int CharUpper(LPTSTR lpsz); -int CharUpperA(LPTSTR lpsz); -int CharUpperBuff(LPTSTR lpsz,DWORD cchLength); -int CharUpperBuffA(LPTSTR lpsz,DWORD cchLength); -int CharUpperBuffW(LPTSTR lpsz,DWORD cchLength); -int CharUpperW(LPTSTR lpsz); -int CheckDlgButton(HWND hDlg,int nIDButton,UINT uCheck); -int CheckMenuItem(HMENU hmenu,UINT uIDCheckItem,UINT uCheck); -int CheckMenuRadioItem(HMENU hmenu,UINT idFirst,UINT idLast,UINT idCheck,DWORD uFlags); -int CheckRadioButton(HWND hDlg,int nIDFirstButton,int nIDLastButton,int nIDCheckButton); -int ChildWindowFromPoint(HWND hWndParent,POINT Point); -int ChildWindowFromPointEx(HWND hwndParent,POINT pt,UINT uFlags); -int ClientToScreen(HWND hWnd,LPPOINT lpPoint); -int ClipCursor(const RECT* lpRect); -int CloseClipboard(); -int CloseDesktop(HDESK hDesktop); -int CloseGestureInfoHandle(HGESTUREINFO hGestureInfo); -int CloseTouchInputHandle(HTOUCHINPUT hTouchInput); -int CloseWindow(HWND hWnd); -int CloseWindowStation(HWINSTA hWinSta); -int CopyAcceleratorTable(HACCEL hAccelSrc,LPACCEL lpAccelDst,int cAccelEntries); -int CopyAcceleratorTableA(HACCEL hAccelSrc,LPACCEL IpAcceIDst,int cAccelEntries); -int CopyAcceleratorTableW(HACCEL hAccelSrc,LPACCEL IpAcceIDst,int cAccelEntries); -int CopyCursor(HCURSOR pcur); -int CopyIcon(HICON hIcon); -int CopyImage(HANDLE hImage,UINT uType,int cxDesired,int cyDesired,UINT fuFlags); -int CopyRect(LPRECT lprcDst,const RECT* lprcSrc); -int CountClipboardFormats(); -int CreateAcceleratorTable(LPACCEL lpaccl,int cEntries); -int CreateAcceleratorTableW(LPACCEL lpaccl,int cEntries); -int CreateCaret(HWND hWnd,HBITMAP hBitmap,int nWidth,int nHeight); -int CreateCursor(HINSTANCE hInst,int xHotSpot,int yHotSpot,int nWidth,int nHeight,const VOID* pvANDPlane,const VOID* pvXORPlane); -int CreateDesktop(LPCTSTR lpszDesktop,LPCTSTR lpszDevice,LPDEVMODE pDevmode,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa); -int CreateDesktopEx(LPCTSTR lpszDesktop,LPCTSTR lpszDevice,LPDEVMODE pDevmode,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa,ULONG ulHeapSize,PVOID pvoid); -int CreateDialogIndirectParam(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM lParamInit); -int CreateDialogIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFun,LPARAM lParamInit); -int CreateDialogIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATE lpTemplate,HWND hWndParent,DLGPROC lpDialogFun,LPARAM lParamInit); -int CreateDialogParam(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM lParamInit); -int CreateDialogParamA(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); -int CreateDialogParamW(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); -int CreateIcon(HINSTANCE hInstance,int nWidth,int Height,BYTE cPlanes,BYTE cBitsPixel,const BYTE* lpbANDbits,const BYTE* lpbXORbits); -int CreateIconFromResource(PBYTE presbits,DWORD dwResSize,BOOL fIcon,DWORD dwVersion); -int CreateIconFromResourceEx(PBYTE pbIconBits,DWORD cbIconBits,BOOL fIcon,DWORD dwVersion,int cxDesired,int cyDesired,UINT uFlags); -int CreateIconIndirect(PICONINFO piconinfo); -int CreateMDIWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); -int CreateMDIWindowA(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); -int CreateMDIWindowW(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HINSTANCE hInstance,LPARAM lParam); -int CreateMenu(); -int CreatePopupMenu(); -int CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); -HWND CreateWindowEx(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); -HWND CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); -HWND CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent ,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam); -int CreateWindowStation(LPCTSTR lpwinsta,DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa); -int DdeAbandonTransaction(DWORD idInst,HCONV hConv,DWORD idTransaction); -int DdeAccessData(HDDEDATA hData,LPDWORD pcbDataSize); -int DdeAddData(HDDEDATA hData,LPBYTE pSrc,DWORD cb,DWORD cbOff); -int DdeClientTransaction(LPBYTE pData,DWORD cbData,HCONV hConv,HSZ hszItem,UINT wFmt,UINT wType,DWORD dwTimeout,LPDWORD pdwResult); -int DdeCmpStringHandles(HSZ hsz1,HSZ hsz2); -int DdeConnect(DWORD idInst,HSZ hszService,HSZ hszTopic,PCONVCONTEXT pCC); -int DdeConnectList(DWORD idInst,HSZ hszService,HSZ hszTopic,HCONVLIST hConvList,PCONVCONTEXT pCC); -int DdeCreateDataHandle(DWORD idInst,LPBYTE pSrc,DWORD cb,DWORD cbOff,HSZ hszItem,UINT wFmt,UINT afCmd); -int DdeCreateStringHandle(DWORD idInst,LPTSTR psz,int iCodePage); -int DdeDisconnect(HCONV hConv); -int DdeDisconnectList(HCONVLIST hConvList); -int DdeEnableCallback(DWORD idInst,HCONV hConv,UINT wCmd); -int DdeFreeDataHandle(HDDEDATA hData); -int DdeFreeStringHandle(DWORD idInst,HSZ hsz); -int DdeGetData(HDDEDATA hData,LPBYTE pDst,DWORD cbMax,DWORD cbOff); -int DdeGetLastError(DWORD idInst); -int DdeImpersonateClient(HCONV hConv); -int DdeInitialize(LPDWORD pidInst,PFNCALLBACK pfnCallback,DWORD afCmd,DWORD ulRes); -int DdeKeepStringHandle(DWORD idInst,HSZ hsz); -int DdeNameService(DWORD idInst,UINT hsz1,UINT hsz2,UINT afCmd); -int DdePostAdvise(DWORD idInst,HSZ hszTopic,HSZ hszItem); -int DdeQueryConvInfo(HCONV hConv,DWORD idTransaction,PCONVINFO pConvInfo); -int DdeQueryNextServer(HCONVLIST hConvList,HCONV hConvPrev); -int DdeQueryString(DWORD idInst,HSZ hsz,LPTSTR psz,DWORD cchMax,int iCodePage); -int DdeReconnect(HCONV hConv); -int DdeSetQualityOfService(HWND hwndClient,const SECURITY_QUALITY_OF_SERVICE* pqosNew,PSECURITY_QUALITY_OF_SERVICE pqosPrev); -int DdeSetUserHandle(HCONV hConv,DWORD id,DWORD_PTR hUser); -int DdeUnaccessData(HDDEDATA hData); -int DdeUninitialize(DWORD idInst); -int DefDlgProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam); -int DefDlgProcW(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam); -int DefFrameProc(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); -int DefFrameProcA(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); -int DefFrameProcW(HWND hWnd,HWND hWndMDIClient,UINT uMsg,WPARAM wParam,LPARAM lParam); -int DefMDIChildProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); -int DefMDIChildProcA(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); -int DefRawInputProc(PRAWINPUT* paRawInput,INT nInput,UINT cbSizeHeader); -LRESULT DefWindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -LRESULT DefWindowProcA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -LRESULT DefWindowProcW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int DeferWindowPos(HDWP hWinPosInfo,HWND hWnd,HWND hWndInsertAfter,int x,int y,int cx,int cy,UINT uFlags); -int DeleteMenu(HMENU hMenu,UINT uPosition,UINT uFlags); -int DeregisterShellHookWindow(HWND hWnd); -int DestroyAcceleratorTable(HACCEL hAccel); -int DestroyCaret(); -int DestroyCursor(HCURSOR hCursor); -int DestroyIcon(HICON hIcon); -int DestroyMenu(HMENU hMenu); -int DestroyWindow(HWND hWnd); -int DialogBoxIndirectParam(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); -int DialogBoxIndirectParamA(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC pDialogFunc,LPARAM dwInitParam); -int DialogBoxIndirectParamW(HINSTANCE hInstance,LPCDLGTEMPLATE hDialogTemplate,HWND hWndParent,DLGPROC pDialogFunc,LPARAM dwInitParam); -int DialogBoxParam(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam); -int DialogBoxParamA(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWnd,DLGPROC lpDialogFunc,LPARAM dwInitParam); -int DialogBoxParamW(HINSTANCE hInstance,LPCTSTR lpTemplateName,HWND hWnd,DLGPROC lpDialogFunc,LPARAM dwInitParam); -long DispatchMessage(const MSG *lpMsg); -long DispatchMessageA(const MSG *lpMsg); -long DispatchMessageW(const MSG *lpMsg); -int DlgDirList(HWND hDlg,LPTSTR lpPathSpec,int nIDListBox,int nIDStaticPath,UINT uFileType); -int DlgDirListComboBox(HWND hDlg,LPTSTR lpPathSpec,int nIDComboBox,int nIDStaticPath,UINT uFiletype); -int DlgDirSelectComboBoxEx(HWND hDlg,LPTSTR lpString,int nCount,int nIDComboBox); -int DlgDirSelectEx(HWND hDlg,LPTSTR lpString,int nCount,int nIDListBox); -int DragDetect(HWND hwnd,POINT pt); -int DrawAnimatedRects(HWND hWnd,int dAni,const RECT* lprcFrom,const RECT* lprcTo); -int DrawCaption(HWND hwnd,HDC hdc,LPCRECT lprc,UINT uFlags); -int DrawEdge(HDC hDC,LPRECT qrc,UINT edge,UINT grfFlags); -int DrawFocusRect(HDC hDC,const RECT* lprc); -int DrawFrameControl(HDC hDC,LPRECT lprc,UINT uType,UINT uState); -int DrawIcon(HDC hDC,int X,int Y,HICON hIcon); -int DrawIconEx(HDC hDC,int xLeft,int yTop,HICON hIcon,int cxWidth,int cyWidth,UINT istepIfAniCur,HBRUSH hbrFlickerFreeDraw,UINT diFlags); -int DrawMenuBar(HWND hWnd); -int DrawState(HDC hdc,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int x,int y,int cx,int cy,UINT fuFlags); -int DrawStateA(HDC hDC,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int X,int Y,int cx,int cy,UINT fuFlags); -int DrawStateW(HDC hDC,HBRUSH hbr,DRAWSTATEPROC lpOutputFunc,LPARAM lData,WPARAM wData,int X,int Y,int cx,int cy,UINT fuFlags); -int DrawText(HDC hDC,LPCTSTR lpchText,int nCount,LPRECT lpRect,UINT uFormat); -int DrawTextA(HDC hDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); -int DrawTextEx(HDC hdc,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); -int DrawTextExA(HDC hDC,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); -int DrawTextExW(HDC hDC,LPTSTR lpchText,int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams); -int DrawTextW(HDC hDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat); -int EmptyClipboard(); -int EnableMenuItem(HMENU hMenu,UINT uIDEnableItem,UINT uEnable); -int EnableScrollBar(HWND hWnd,UINT WSBflags,UINT wArrows); -int EnableWindow(HWND hWnd,BOOL bEnable); -int EndDeferWindowPos(HDWP hWinPosInfo); -int EndDialog(HWND hDlg,INT_PTR nResult); -int EndMenu(); -int EndPaint(HWND hWnd,const PAINTSTRUCT* lpPaint); -int EndTask(HWND hWnd,BOOL fShutDown,BOOL fForce); -int EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc,LPARAM lParam); -int EnumClipboardFormats(UINT format); -int EnumDesktopWindows(HDESK hDesktop,WNDENUMPROC lpfn,LPARAM lParam); -int EnumDesktops(HWINSTA hwinsta,DESKTOPENUMPROC lpEnumFunc,LPARAM lParam); -int EnumDisplayDevices(LPCTSTR lpReserved,DWORD iDeviceNum,PDISPLAY_DEVICE pDisplayDevice,DWORD dwFlags); -int EnumDisplayMonitors(DWORD hDesktop,DWORD lpfn,DWORD lParam); -int EnumDisplayMonitors(HDC hdc,LPCRECT lprcClip,MONITORENUMPROC lpfnEnum,LPARAM dwData); -int EnumDisplaySettings(LPCTSTR lpszDeviceName,int iModeNum,DEVMODE* lpDevMode); -int EnumDisplaySettingsA(LPCTSTR lpszDeviceName,int iModeNum,DEVMODE* lpDevMode); -int EnumDisplaySettingsEx(LPCTSTR lpszDeviceName,DWORD iModeNum,DEVMODE* lpDevMode,DWORD dwFlags); -int EnumProps(HWND hWnd,PROPENUMPROC lpEnumFunc); -int EnumPropsEx(HWND hWnd,PROPENUMPROCEX lpEnumFunc,LPARAM lParam); -int EnumThreadWindows(DWORD dwThreadId,WNDENUMPROC lpfn,LPARAM lParam); -int EnumWindowStations(WINSTAENUMPROC lpEnumFunc,LPARAM lParam); -int EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam); -int EqualRect(const RECT* lprc1,const RECT* lprc2); -int ExcludeUpdateRgn(HDC hDC,HWND hWnd); -int ExitWindowsEx(UINT uFlags,DWORD dwReserved); -int FillRect(HDC hDC,const RECT* lprc,HBRUSH hbr); -int FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName); -int FindWindowA(LPCTSTR lpClassName,LPCTSTR lpWindowName); -int FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow); -int FindWindowExA(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR pszWindow); -int FindWindowExW(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR pszWindow); -int FindWindowW(LPCTSTR lpClassName,LPCTSTR lpWindowName); -int FlashWindow(HWND hWnd,BOOL bInvert); -int FlashWindowEx(PFLASHWINFO pfwi); -int FrameRect(HDC hDC,const RECT* lprc,HBRUSH hbr); -int FreeDDElParam(UINT msg,LPARAM lParam); -int GetActiveWindow(); -int GetAltTabInfo(HWND hwnd,int iItem,PALTTABINFO pati,LPTSTR pszItemText,UINT cchItemText); -int GetAncestor(HWND hwnd,DWORD gaFlags); -int GetAsyncKeyState(int vKey); -int GetCapture(); -int GetCaretBlinkTime(); -int GetCaretPos(LPPOINT lpPoint); -int GetClassInfo(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); -int GetClassInfoA(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); -int GetClassInfoEx(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); -int GetClassInfoExA(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); -int GetClassInfoExW(HINSTANCE hinst,LPCTSTR lpszClass,LPWNDCLASSEX lpwcx); -int GetClassInfoW(HINSTANCE hInstance,LPCTSTR lpClassName,LPWNDCLASS lpWndClass); -int GetClassLong(HWND hWnd,int nIndex); -int GetClassLongA(HWND hWnd,int nIndex); -int GetClassLongW(HWND hWnd,int nIndex); -int GetClassName(HWND hWnd,LPTSTR lpClassName,int nMaxCount); -int GetClassNameA(HWND hWnd,LPTSTR lpBuffer,int nBufferSize); -int GetClassNameW(HWND hWnd,LPTSTR lpBuffer,int nBufferSize); -int GetClassWord(HWND hWnd,int nIndex); -int GetClientRect(HWND hWnd,LPRECT lpRect); -int GetClipCursor(LPRECT lpRect); -int GetClipboardData(UINT uFormat); -int GetClipboardFormatName(UINT format,LPTSTR lpszFormatName,int cchMaxCount); -int GetClipboardFormatNameA(UINT format,LPTSTR lpBuffer,int cchMaxCount); -int GetClipboardOwner(); -int GetClipboardSequenceNumber(); -int GetClipboardViewer(); -int GetComboBoxInfo(HWND hWndCombo,PCOMBOBOXINFO pcbi); -int GetCursor(); -int GetCursorInfo(PCURSORINFO pci); -int GetCursorPos(LPPOINT lpPoint); -int GetDC(HWND hwnd); -int GetDCEx(HWND hWnd,HRGN hrgnClip,UINT flags); -HWND GetDesktopWindow(); -int GetDialogBaseUnits(); -int GetDlgCtrlID(HWND hwndCtl); -int GetDlgItem(HWND hDlg,int nIDDlgItem); -int GetDlgItemInt(HWND hDlg,int nIDDlgItem,BOOL* lpTranslated,BOOL bSigned); -int GetDlgItemText(HWND hDlg,int nIDDlgItem,LPTSTR lpString,int nMaxCount); -int GetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPTSTR lpBuffer,int nBufferSize); -int GetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPTSTR lpBuffer,int nBufferSize); -int GetDoubleClickTime(); -int GetFocus(); -int GetForegroundWindow(); -int GetGUIThreadInfo(DWORD idThread,LPGUITHREADINFO lpgui); -int GetGestureConfig(HWND hwnd,DWORD dwReserved,DWORD dwFlags,PUINT pcIDs,PGESTURECONFIG pGestureConfig,UINT cbSize); -int GetGestureExtraArgs(HGESTUREINFO hGestureInfo,UINT cbExtraArgs,PBYTE pExtraArgs); -int GetGestureInfo(HGESTUREINFO hGestureInfo,PGESTUREINFO pGestureInfo); -int GetGuiResources(HANDLE hProcess,DWORD uiFlags); -int GetIconInfo(HICON hIcon,PICONINFO piconinfo); -int GetIconInfoEx(HICON hIcon,PICONINFOEX piconinfoex); -int GetInputState(); -int GetKBCodePage(); -int GetKeyNameText(LONG lParam,LPTSTR lpString,int nSize); -int GetKeyNameTextA(LONG lParam,LPTSTR lpString,int nSize); -int GetKeyNameTextW(LONG lParam,LPTSTR lpString,int nSize); -int GetKeyState(int nVirtKey); -int GetKeyboardLayout(DWORD dwLayout); -int GetKeyboardLayoutList(int nBuff,HKL* lpList); -int GetKeyboardLayoutName(LPTSTR pwszKLID); -int GetKeyboardLayoutNameA(LPTSTR pwszKLID); -int GetKeyboardLayoutNameW(LPTSTR pwszKLID); -int GetKeyboardState(PBYTE lpKeyState); -int GetKeyboardType(int nTypeFlag); -int GetLastActivePopup(HWND hWnd); -int GetLastInputInfo(PLASTINPUTINFO plii); -int GetLayeredWindowAttributes(HWND hwnd,COLORREF* pcrKey,BYTE* pbAlpha,DWORD pdwFlags); -int GetListBoxInfo(HWND hwnd); -int GetMenu(HWND hWnd); -int GetMenuBarInfo(HWND hwnd,UINT idObject,LONG idItem,PMENUBARINFO pmbi); -int GetMenuCheckMarkDimensions(); -int GetMenuContextHelpId(HMENU hmenu); -int GetMenuDefaultItem(HMENU hMenu,UINT fByPos,UINT gmdiFlags); -int GetMenuInfo(HMENU hMenu,LPCMENUINFO lpcMenuInfo); -int GetMenuItemCount(HMENU hMenu); -int GetMenuItemID(HMENU hMenu,int nPos); -int GetMenuItemInfo(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int GetMenuItemInfoA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int GetMenuItemInfoW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int GetMenuItemRect(HWND hWnd,HMENU hMenu,UINT uItem,LPRECT lprcItem); -int GetMenuState(HMENU hMenu,UINT uId,UINT uFlags); -int GetMenuString(HMENU hMenu,UINT uIDItem,LPTSTR lpString,int nMaxCount,UINT uFlag); -int GetMenuStringA(HMENU hMenu,UINT uIDItem,LPTSTR lpBuffer,int nBufferSize,UINT uFlag); -int GetMenuStringW(HMENU hMenu,UINT uIDItem,LPTSTR lpBuffer,int nBufferSize,UINT uFlag); -bool GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); -BOOL GetMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); -int GetMessageExtraInfo(); -int GetMessagePos(); -int GetMessageTime(); -BOOL GetMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); -int GetMonitorInfo(HMONITOR hMonitor,LPMONITORINFO lpmi); -int GetMonitorInfoW(HMONITOR hMonitor,LPMONITORINFO lpMonitorIfno); -int GetMouseMovePointsEx(UINT cbSize,LPMOUSEMOVEPOINT lppt,LPMOUSEMOVEPOINT lpptBuf,int nBufPoints,DWORD resolution); -int GetNextDlgGroupItem(HWND hDlg,HWND hCtl,BOOL bPrevious); -int GetNextDlgTabItem(HWND hDlg,HWND hCtl,BOOL bPrevious); -int GetOpenClipboardWindow(); -int GetParent(HWND hWnd); -int GetPhysicalCursorPos(LPPOINT lpPoint); -int GetPriorityClipboardFormat(UINT* paFormatPriorityList,int cFormats); -int GetProcessDefaultLayout(DWORD* pdwDefaultLayout); -int GetProcessWindowStation(); -int GetProp(HWND hWnd,LPCTSTR lpString); -int GetPropA(HWND hWnd,LPCTSTR lpString); -int GetPropW(HWND hWnd,LPCTSTR lpString); -int GetQueueStatus(DWORD flags); -int GetRawInputBuffer(PRAWINPUT pData,PUINT pcbSize,UINT cbSizeHeader); -int GetRawInputData(HRAWINPUT hRawInput,UINT uiCommand,LPVOID pData,PUINT pcbSize,UINT cbSizeHeader); -int GetRawInputDeviceInfo(HANDLE hDevice,UINT uiCommand,LPVOID pData,PUINT pcbSize); -int GetRawInputDeviceList(PRAWINPUTDEVICELIST pRawInputDeviceList,PUINT puiNumDevices,UINT cbSize); -int GetRegisteredRawInputDevices(PRAWINPUTDEVICE pRawInputDevices,PUINT puiNumDevices,UINT cbSize); -int GetScrollBarInfo(HWND hWnd,UINT fnBar,PSCROLLBARINFO lpsi); -int GetScrollInfo(HWND hWnd,int fnBar,LPSCROLLINFO lpScorllInfo); -int GetScrollPos(HWND hWnd,int nBar); -int GetScrollRange(HWND hWnd,int nBar,LPINT lpMinPos,LPINT lpMaxPos); -int GetShellWindow(); -int GetSubMenu(HMENU hMenu,int nPos); -int GetSysColor(int nIndex); -int GetSysColorBrush(int nIndex); -int GetSystemMenu(HWND hWnd,BOOL bRevert); -int GetSystemMetrics(int nIndex); -int GetTabbedTextExtent(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); -int GetTabbedTextExtentA(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); -int GetTabbedTextExtentW(HDC hDC,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions); -int GetThreadDesktop(DWORD dwThreadId); -int GetTitleBarInfo(HWND hwnd,PTITLEBARINFO pti); -int GetTopWindow(HWND hWnd); -int GetTouchInputInfo(HTOUCHINPUT hTouchInput,UINT cInputs,PTOUCHINPUT pInputs,int cbSize); -int GetUpdateRect(HWND hWnd,LPRECT lpRect,BOOL bErase); -int GetUpdateRgn(HWND hWnd,HRGN hRgn,BOOL bErase); -int GetUpdatedClipboardFormats(PUINT lpuiFormats,UINT cFormats,PUINT pcFormatsOut); -int GetUserObjectInformation(HANDLE hObj,UINT nIndex,PVOID pvInfo,DWORD nLength,LPDWORD lpnLengthNeeded); -int GetUserObjectInformationA(HANDLE hActiveDesktop,UINT nIndex,PVOID pvInfo,DWORD nBuffLen,LPDWORD dwSize); -int GetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSD,DWORD nLength,LPDWORD lpnLengthNeeded); -int GetWindow(HWND hWnd,UINT uCmd); -int GetWindowContextHelpId(HWND hWnd); -int GetWindowDC(HWND hWnd); -int GetWindowDisplayAffinity(HWND hWnd,DWORD* dwAffinity); -int GetWindowInfo(HWND hwnd,PWINDOWINFO pwi); -int GetWindowLong(HWND hWnd,int nIndex); -int GetWindowLongA(HWND hWnd,int nIndex); -int GetWindowLongW(HWND hWnd,int nIndex); -int GetWindowModuleFileName(HWND hwnd,LPTSTR lpszFileName,UINT cchFileNameMax); -int GetWindowPlacement(HWND hWnd,WINDOWPLACEMENT* lpwndpl); -int GetWindowRect(HWND hWnd,LPRECT lpRect); -int GetWindowRgn(HWND hWnd,HRGN hRgn); -int GetWindowRgnBox(HWND hWnd,LPRECT lprc); -int GetWindowText(HWND hWnd,LPTSTR lpString,int nMaxCount); -int GetWindowTextA(HWND hWnd,LPTSTR lpString,int nMaxCount); -int GetWindowTextLength(HWND hWnd); -int GetWindowTextLengthA(HWND hWnd); -int GetWindowTextLengthW(HWND hWnd); -int GetWindowTextW(HWND hWnd,LPTSTR lpString,int nMaxCount); -int GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId); -int GrayString(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); -int GrayStringA(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); -int GrayStringW(HDC hDC,HBRUSH hBrush,GRAYSTRINGPROC lpOutputFunc,LPARAM lpData,int nCount,int X,int Y,int nWidth,int nHeight); -int HideCaret(HWND hWnd); -int HiliteMenuItem(HWND hwnd,HMENU hmenu,UINT uItemHilite,UINT uHilite); -int ImpersonateDdeClientWindow(HWND hWndClient,HWND hWndServer); -int InSendMessage(); -int InSendMessageEx(LPVOID lpReserved); -int InflateRect(LPRECT lpRect,int x,int y); -int InsertMenu(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); -int InsertMenuA(HMENU hMenu,UINT nPosition,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); -int InsertMenuItem(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); -int InsertMenuItemA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); -int InsertMenuItemW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPCMENUITEMINFO lpmii); -int InsertMenuW(HMENU hMenu,UINT nPosition,UINT wFlags,UINT_PTR wIDNewItem,LPCTSTR lpNewItem); -int InternalGetWindowText(HWND hWnd,LPWSTR lpString,int nMaxCount); -int IntersectRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); -int InvalidateRect(HWND hWnd,const RECT* lpRect,BOOL bErase); -int InvalidateRgn(HWND hWnd,HRGN hRgn,BOOL bErase); -int InvertRect(HDC hDC,const RECT* lprc); -int IsCharAlpha(TCHAR ch); -int IsCharAlphaNumeric(TCHAR ch); -int IsCharAlphaNumericA(TCHAR char); -int IsCharAlphaNumericW(TCHAR char); -int IsCharLower(TCHAR ch); -int IsCharLowerA(TCHAR char); -int IsCharUpper(TCHAR ch); -int IsChild(HWND hWndParent,HWND hWnd); -int IsClipboardFormatAvailable(UINT format); -BOOL IsDialogMessage(HWND hDlg,LPMSG lpMsg); -BOOL IsDialogMessageA(HWND hDlg,LPMSG lpMsg); -BOOL IsDialogMessageW(HWND hDlg,LPMSG lpMsg); -int IsDlgButtonChecked(HWND hDlg,int nIDButton); -int IsGUIThread(BOOL bConvert); -int IsHungAppWindow(HWND hWnd); -int IsIconic(HWND hWnd); -int IsMenu(HMENU hMenu); -int IsProcessDPIAware(); -int IsRectEmpty(const RECT* lprc); -int IsTouchWindow(HWND hWnd,PULONG pulFlags); -int IsWinEventHookInstalled(DWORD event); -int IsWindow(HWND hWnd); -int IsWindowEnabled(HWND hWnd); -int IsWindowUnicode(HWND hWnd); -int IsWindowVisible(HWND hWnd); -int IsWow64Message(); -int IsZoomed(HWND hWnd); -int KillTimer(HWND hWnd,UINT_PTR nIDEvent); -HACCEL LoadAccelerators(HINSTANCE hInstance,LPCSTR lpTableName); -HACCEL LoadAcceleratorsA(HINSTANCE hInstance,LPCSTR lpTableName); -HACCEL LoadAcceleratorsW(HINSTANCE hInstance,LPCWSTR lpTableName); -int LoadBitmap(HINSTANCE hInstance,LPCTSTR lpBitmapName); -int LoadBitmapA(HINSTANCE hInstance,LPCTSTR lpBitmapName); -int LoadBitmapW(HINSTANCE hInstance,LPCTSTR lpBitmapName); -HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName); -HCURSOR LoadCursorA(HINSTANCE hInstance,LPCTSTR lpCursorName); -int LoadCursorFromFile(LPCTSTR lpFileName); -int LoadCursorFromFileA(LPCTSTR lpFileName); -int LoadCursorFromFileW(LPCTSTR lpFileName); -HCURSOR LoadCursorW(HINSTANCE hInstance,LPCTSTR lpCursorName); -HICON LoadIcon(HINSTANCE hInstance,LPCSTR lpIconName); -HICON LoadIconA(HINSTANCE hInstance,LPCSTR lpIconName); -HICON LoadIconW(HINSTANCE hInstance,LPCSTR lpIconName); -int LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad); -int LoadImageA(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int Width,int Height,UINT Options); -int LoadImageW(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int Width,int Height,UINT Options); -int LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags); -int LoadKeyboardLayoutA(LPCTSTR lpwszKLID,UINT Flags); -int LoadKeyboardLayoutW(LPCTSTR lpwszKLID,UINT Flags); -int LoadMenu(HINSTANCE hInstance,LPCTSTR lpMenuName); -int LoadMenuA(HINSTANCE hInstance,LPCTSTR lpMenuName); -int LoadMenuIndirect(CONST MENUTEMPLATE* lpMenuTemplate); -int LoadMenuIndirectA(CONST MENUTEMPLATE* lpMenuTemplate); -int LoadMenuIndirectW(CONST MENUTEMPLATE* lpMenuTemplate); -int LoadMenuW(HINSTANCE hInstance,LPCTSTR lpMenuName); -int LoadString(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); -int LoadStringA(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); -int LoadStringW(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax); -int LockSetForegroundWindow(UINT uLockCode); -int LockWindowUpdate(HWND hWndLock); -int LockWorkStation(); -int LogicalToPhysicalPoint(HWND hWnd,LPPOINT lpPoint); -int LookupIconIdFromDirectory(PBYTE presbits,BOOL fIcon); -int LookupIconIdFromDirectoryEx(PBYTE presbits,BOOL fIcon,int cxDesired,int cyDesired,UINT Flags); -int MapDialogRect(HWND hDlg,LPRECT IpRect); -int MapVirtualKey(UINT uCode,UINT uMapType); -int MapVirtualKeyA(UINT uCode,UINT uMapType); -int MapVirtualKeyEx(UINT uCode,UINT uMapType,HKL dwhkl); -int MapVirtualKeyExA(UINT uCode,UINT uMapType,HKL dwhkl); -int MapVirtualKeyExW(UINT uCode,UINT uMapType,HKL dwhkl); -int MapVirtualKeyW(UINT uCode,UINT uMapType); -int MapWindowPoints(HWND hWndFrom,HWND hWndTo,LPPOINT lpPoints,UINT cPoints); -int MenuItemFromPoint(HWND hWnd,HMENU hMenu,POINT ptScreen); -int MessageBeep(UINT uType); -int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); -int MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); -int MessageBoxEx(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); -int MessageBoxExA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); -int MessageBoxExW(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId); -int MessageBoxIndirect(const LPMSGBOXPARAMS lpMsgBoxParams); -int MessageBoxIndirectA(const LPMSGBOXPARAMS lpMsgBoxParams); -int MessageBoxIndirectW(const LPMSGBOXPARAMS lpMsgBoxParamsW); -int MessageBoxTimeout(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType,WORD wLanguageId,DWORD dwMilliseconds); -int MessageBoxW(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); -int ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); -int ModifyMenuA(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); -int ModifyMenuW(HMENU hMenu,UINT uPosition,UINT uFlags,UINT_PTR uIDNewItem,LPCTSTR lpNewItem); -int MonitorFromPoint(POINT pt,DWORD dwFlags); -int MonitorFromRect(LPCRECT lprc,DWORD dwFlags); -int MonitorFromWindow(DWORD hWnd,DWORD dwFlags); -int MonitorFromWindow(HWND hwnd,DWORD dwFlags); -int MoveWindow(HWND hWnd,int X,int Y,int nWidth,int nHeight,BOOL bRepaint); -int MsgWaitForMultipleObjects(DWORD nCount,const HANDLE* pHandles,BOOL fWaitAll,DWORD dwMilliseconds,DWORD dwWakeMask); -int MsgWaitForMultipleObjectsEx(DWORD nCount,const HANDLE* pHandles,DWORD dwMilliseconds,DWORD dwWakeMask,DWORD dwFlags); -int NotifyWinEvent(DWORD event,HWND hwnd,LONG idObject,LONG idChild); -int OemKeyScan(WORD wOemChar); -int OemToChar(LPCSTR lpszSrc,LPTSTR lpszDst); -int OemToCharA(LPCSTR lpszSrc,LPTSTR lpszDst); -int OemToCharBuff(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); -int OemToCharBuffA(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); -int OemToCharBuffW(LPCTSTR lpszSrc,LPTSTR lpszDst,DWORD cchDstLength); -int OemToCharW(LPCSTR lpszSrc,LPTSTR lpszDst); -int OffsetRect(LPRECT lprc,int dx,int dy); -int OpenClipboard(HWND hWndNewOwner); -int OpenDesktop(LPTSTR lpszDesktop,DWORD dwFlags,BOOL fInherit,DWORD dwDesiredAccess); -int OpenIcon(HWND hWnd); -int OpenInputDesktop(DWORD dwFlags,BOOL fInherit,DWORD dwDesiredAccess); -int OpenWindowStation(LPTSTR lpszWinSta,BOOL fInherit,DWORD dwDesiredAccess); -int PackDDElParam(UINT msg,UINT_PTR uiLo,UINT_PTR uiHi); -int PaintDesktop(HDC hDC); -int PeekMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); -int PeekMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); -int PeekMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); -int PhysicalToLogicalPoint(HWND hWnd,LPPOINT lpPoint); -int PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int PostMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); -int PostMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); -int PostQuitMessage(int nExitCode); -int PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); -int PostThreadMessageA(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); -int PostThreadMessageW(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam); -int PrintWindow(HWND hwnd,HDC hdcBlt,UINT nFlags); -int PrivateExtractIcons(LPCTSTR lpszFile,int nIconIndex,int cxIcon,int cyIcon,HICON* phicon,UINT* piconid,UINT nIcons,UINT flags); -int PtInRect(const RECT* lprc,POINT pt); -int RealChildWindowFromPoint(HWND hwndParent,POINT ptParentClientCoords); -int RealGetWindowClass(HWND hwnd,LPTSTR pszType,UINT cchType); -int RedrawWindow(HWND hWnd,const RECT* lprcUpdate,HRGN hrgnUpdate,UINT flags); -ATOM RegisterClass(CONST WNDCLASS* lpWndClass); -ATOM RegisterClassA(CONST WNDCLASS* lpWndClass); -ATOM RegisterClassW(const WNDCLASS* lpWndClass); -ATOM RegisterClassEx(CONST WNDCLASSEX* lpwcx); -ATOM RegisterClassExA(CONST WNDCLASSEX* lpWndClassEx); -ATOM RegisterClassExW(CONST WNDCLASSEX* lpWndClassEx); -int RegisterClassW(CONST WNDCLASS* lpWndClass); -int RegisterClipboardFormat(LPCTSTR lpszFormat); -int RegisterClipboardFormatA(LPCTSTR lpszFormat); -int RegisterClipboardFormatW(LPCTSTR lpszFormat); -int RegisterDeviceNotification(HANDLE hRecipient,LPVOID NotificationFilter,UINT Flags); -int RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk); -int RegisterPowerSettingNotification(HANDLE hRecipient,LPCGUID PowerSettingGuid,UINT Flags); -int RegisterRawInputDevices(PCRAWINPUTDEVICE pRawInputDevices,UINT uiNumDevices,UINT cbSize); -int RegisterShellHookWindow(HWND hWnd); -int RegisterTouchWindow(HWND hWnd,ULONG ulFlags); -int RegisterWindowMessage(LPCTSTR lpString); -int RegisterWindowMessageA(LPCTSTR lpString); -int RegisterWindowMessageW(LPCTSTR lpString); -int ReleaseCapture(); -int ReleaseDC(HWND hWnd,HDC hDC); -int RemoveClipboardFormatListener(HWND hwnd); -int RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlags); -int RemoveProp(HWND hWnd,LPCTSTR lpString); -int RemovePropA(HWND hWnd,LPCTSTR lpString); -int RemovePropW(HWND hWnd,LPCTSTR lpString); -int ReplyMessage(LRESULT lResult); -int ReuseDDElParam(LPARAM lParam,UINT msgIn,UINT msgOut,UINT_PTR uiLo,UINT_PTR uiHi); -int ScreenToClient(HWND hWnd,LPPOINT lpPoint); -int ScrollDC(HDC hDC,int dx,int dy,const RECT* lprcScroll,const RECT* lprcClip,HRGN hrgnUpdate,LPRECT lprcUpdate); -int ScrollWindow(HWND hWnd,int XAmount,int YAmount,const RECT* lpRect,const RECT* lpClipRect); -int ScrollWindowEx(HWND hWnd,int dx,int dy,const RECT* prcScroll,const RECT* prcClip,HRGN hrgnUpdate,LPRECT prcUpdate,UINT flags); -int SendDlgItemMessage(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam); -int SendDlgItemMessageA(HWND hDlg,int nIDDlgItem,UINT Msg,WPARAM wParam,LPARAM lParam); -int SendInput(UINT nInputs,LPINPUT pInputs,int cbSize); -int SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int SendMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); -int SendMessageCallback(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpCallBack,ULONG_PTR dwData); -int SendMessageCallbackA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData); -int SendMessageCallbackW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData); -int SendMessageTimeout(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); -int SendMessageTimeoutA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); -int SendMessageTimeoutW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult); -int SendMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM Param); -int SendNotifyMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int SendNotifyMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int SendNotifyMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); -int SetActiveWindow(HWND hWnd); -int SetCapture(HWND hWnd); -int SetCaretBlinkTime(UINT uMSeconds); -int SetCaretPos(int X,int Y); -int SetClassLong(HWND hWnd,int nIndex,LONG dwNewLong); -int SetClassLongA(HWND hWnd,int nIndex,LONG dwNewLong); -int SetClassLongW(HWND hWnd,int nIndex,LONG dwNewLong); -int SetClassWord(HWND hWnd,int nIndex,WORD wNewWord); -int SetClipboardData(UINT uFormat,HANDLE hMem); -int SetClipboardViewer(HWND hWndNewViewer); -int SetCursor(HCURSOR hCursor); -int SetCursorPos(int X,int Y); -int SetDlgItemInt(HWND hDlg,int nIDDlgItem,UINT uValue,BOOL bSigned); -int SetDlgItemText(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); -int SetDlgItemTextA(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); -int SetDlgItemTextW(HWND hDlg,int nIDDlgItem,LPCTSTR lpString); -int SetDoubleClickTime(UINT uInterval); -int SetFocus(HWND hWnd); -int SetForegroundWindow(HWND hWnd); -int SetGestureConfig(HWND hwnd,DWORD dwReserved,UINT cIDs,PGESTURECONFIG pGestureConfig,UINT cbSize); -int SetKeyboardState(LPBYTE lpKeyState); -int SetLastErrorEx(DWORD dwErrCode,DWORD dwType); -int SetLayeredWindowAttributes(HWND hWnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags); -int SetMenu(HWND hWnd,HMENU hMenu); -int SetMenuContextHelpId(HMENU hmenu,DWORD dwContextHelpId); -int SetMenuDefaultItem(HMENU hMenu,UINT uItem,UINT fByPos); -int SetMenuInfo(HMENU hmenu,LPCMENUINFO lpcmi); -int SetMenuItemBitmaps(HMENU hMenu,UINT uPosition,UINT uFlags,HBITMAP hBitmapUnchecked,HBITMAP hBitmapChecked); -int SetMenuItemInfo(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int SetMenuItemInfoA(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int SetMenuItemInfoW(HMENU hMenu,UINT uItem,BOOL fByPosition,LPMENUITEMINFO lpmii); -int SetMessageExtraInfo(LPARAM lParam); -int SetParent(HWND hWndChild,HWND hWndNewParent); -int SetPhysicalCursorPos(int X,int Y); -int SetProcessDPIAware(); -int SetProcessDefaultLayout(DWORD dwDefaultLayout); -int SetProcessWindowStation(HWINSTA hWinSta); -int SetProp(HWND hWnd,LPCTSTR lpString,HANDLE hData); -int SetPropA(HWND hWnd,LPCTSTR lpString,HANDLE hData); -int SetPropW(HWND hWnd,LPCTSTR lpString,HANDLE hData); -int SetRect(LPRECT lprc,int xLeft,int yTop,int xRight,int yBottom); -int SetRectEmpty(LPRECT lprc); -int SetScrollInfo(HWND hWnd,int fnBar,LPCSCROLLINFO lpsi,BOOL fRedraw); -int SetScrollPos(HWND hWnd,int nBar,int nPos,BOOL bRedraw); -int SetScrollRange(HWND hWnd,int nBar,int nMinPos,int nMaxPos,BOOL bRedraw); -int SetSysColors(int cElements,const INT* lpaElements,const COLORREF* lpaRgbValues); -int SetSystemCursor(HCURSOR hcur,DWORD id); -int SetThreadDesktop(HDESK hDesktop); -int SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse,TIMERPROC lpTimerFunc); -int SetUserObjectInformation(HANDLE hObj,int nIndex,PVOID pvInfo,DWORD nLength); -int SetUserObjectSecurity(HANDLE hObj,PSECURITY_INFORMATION pSIRequested,PSECURITY_DESCRIPTOR pSID); -int SetWinEventHook(UINT eventMin,UINT eventMax,HMODULE hmodWinEventProc,WINEVENTPROC lpfnWinEventProc,DWORD idProcess,DWORD idThread,DWORD dwflags); -int SetWindowContextHelpId(HWND hWnd,DWORD dwContextHelpId); -int SetWindowDisplayAffinity(HWND hWnd,DWORD dwAffinity); -int SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong); -int SetWindowLongA(HWND hWnd,int nIndex,LONG dwNewLong); -int SetWindowLongW(HWND hWnd,int nIndex,LONG dwNewLong); -int SetWindowPlacement(HWND hWnd,WINDOWPLACEMENT* lpwndpl); -int SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx,int cy,UINT uFlags); -int SetWindowRgn(HWND hWnd,HRGN hRgn,BOOL bRedraw); -int SetWindowText(HWND hWnd,LPCTSTR lpString); -int SetWindowTextA(HWND hwnd,LPCTSTR lpString); -int SetWindowTextW(HWND hwnd,LPCTSTR lpString); -int SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); -int SetWindowsHookExA(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); -int SetWindowsHookExW(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); -int ShowCaret(HWND hWnd); -int ShowCursor(BOOL bShow); -int ShowOwnedPopups(HWND hWnd,BOOL fShow); -int ShowScrollBar(HWND hWnd,int wBar,BOOL bShow); -int ShowWindow(HWND hWnd,int nCmdShow); -int ShowWindowAsync(HWND hWnd,int nCmdShow); -int ShutdownBlockReasonCreate(HWND hWnd,LPCWSTR pwszReason); -int ShutdownBlockReasonDestroy(HWND hWnd); -int ShutdownBlockReasonQuery(HWND hWnd,LPWSTR pwszBuff,DWORD* pcchBuff); -int SoundSentry(); -int SubtractRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); -int SwapMouseButton(BOOL fSwap); -int SwitchDesktop(HDESK hDesktop); -int SwitchToThisWindow(HWND hWnd,BOOL fAltTab); -int SystemParametersInfo(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); -int SystemParametersInfoA(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); -int SystemParametersInfoW(long uiAction,UINT uiParam,PVOID pvParam,long fWinIni); -int TabbedTextOut(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); -int TabbedTextOutA(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); -int TabbedTextOutW(HDC hDC,int X,int Y,LPCTSTR lpString,int nCount,int nTabPositions,const LPINT lpnTabStopPositions,int nTabOrigin); -int TileWindows(HWND hwndParent,UINT wHow,RECT* lpRect,UINT cKids,const HWND* lpKids); -int ToAscii(UINT uVirtKey,UINT uScanCode,PBYTE lpKeyState,LPWORD lpChar,UINT uFlags); -int ToAsciiEx(UINT uVirtKey,UINT uScanCode,PBYTE lpKeyState,LPWORD lpChar,UINT uFlags,HKL dwhkl); -int ToUnicode(UINT wVirtKey,UINT wScanCode,const PBYTE lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags); -int ToUnicodeEx(UINT wVirtKey,UINT wScanCode,const PBYTE lpKeyState,LPWSTR pwszBuff,int cchBuff,UINT wFlags,HKL dwhkl); -int TrackMouseEvent(LPTRACKMOUSEEVENT pTrackMouseEvent); -int TrackPopupMenu(HMENU hMenu,UINT uFlags,int X,int Y,int nReserved,HWND hWnd,CONST RECT* prcRect); -int TrackPopupMenuEx(HMENU hmenu,UINT fuFlags,int x,int Y,HWND hWnd,LPTPMPARAMS lptpm); -int TranslateAcceleratorA(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); -int TranslateAcceleratorW(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); -int TranslateAccelerator(HWND hWnd,HACCEL hAccTable,LPMSG lpMsg); -int TranslateMDISysAccel(HWND hWndClient,LPMSG lpMsg); -int TranslateMessage(const MSG* lpMsg); -int UnhookWinEvent(HWINEVENTHOOK hWinEventHook); -int UnhookWindowsHookEx(HHOOK hhk); -int UnionRect(LPRECT lprcDst,const RECT* lprcSrc1,const RECT* lprcSrc2); -int UnloadKeyboardLayout(HKL hkl); -int UnpackDDElParam(UINT msg,LPARAM lParam,PUINT_PTR puiLo,PUINT_PTR puiHi); -int UnregisterClass(LPCTSTR lpClassName,HINSTANCE hInstance); -int UnregisterClassA(DWORD lpClassName,DWORD hInstance); -int UnregisterClassA(LPCTSTR lpClassName,HINSTANCE hInstance); -int UnregisterClassW(LPCTSTR lpClassName,HINSTANCE hInstance); -int UnregisterDeviceNotification(HDEVNOTIFY Handle); -int UnregisterHotKey(HWND hWnd,int id); -int UnregisterPowerSettingNotification(HPOWERNOTIFY Handle); -int UnregisterTouchWindow(HWND hWnd); -int UpdateLayeredWindow(HWND hwnd,HDC hdcDst,POINT* pptDst,SIZE* psize,HDC hdcSrc,POINT* pptSrc,COLORREF crKey,BLENDFUNCTION* pblend,DWORD dwFlags); -int UpdateLayeredWindowIndirect(HWND hwnd,const UPDATELAYEREDWINDOWINFO* pULWInfo); -int UpdateWindow(HWND hWnd); -int UserHandleGrantAccess(HANDLE hUserHandle,HANDLE hJob,BOOL bGrant); -int ValidateRect(HWND hWnd,const RECT* lpRect); -int ValidateRgn(HWND hWnd,HRGN hRgn); -int VkKeyScan(TCHAR ch); -int VkKeyScanA(TCHAR ch); -int VkKeyScanEx(TCHAR ch,HKL dwhkl); -int VkKeyScanW(TCHAR ch); -int WaitForInputIdle(HANDLE hProcess,DWORD dwMilliseconds); -int WaitMessage(); -int WinHelp(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR dwData); -int WinHelpA(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR wData); -int WinHelpW(HWND hWndMain,LPCTSTR lpszHelp,UINT uCommand,ULONG_PTR wData); -int WindowFromDC(HDC hDC); -int WindowFromPhysicalPoint(POINT Point); -int WindowFromPoint(POINT Point); -int keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,ULONG_PTR dwExtraInfo); -int mouse_event(DWORD dwFlags,DWORD dx,DWORD dy,DWORD dwData,ULONG_PTR dwExtraInfo); -int toascii(DWORD char); \ No newline at end of file +BOOL;DestroyWindow;HWND hWnd; +BOOL;EndDialog;HWND hDlg;int nResult; +BOOL;EndPaint;HWND hWnd;const PAINTSTRUCT *lpPaint; +BOOL;GetClientRect;HWND hWnd;LPRECT lpRect; +BOOL;GetWindowRect;HWND hWnd;RECT * lpRect; +BOOL;ShowWindow;HWND hWnd;int nCmdShow; +BOOL;TranslateMessage;const MSG *lpMsg; +BOOL;UpdateWindow;HWND hWnd; +COLORREF;SetPixel;HDC;int;int;COLORREF; +HDC;BeginPaint;HWND hWnd;PAINTSTRUCT *lpPaint; +HLOCAL;LocalFree;HLOCAL hMem; +HMODULE;GetModuleHandleA;LPCSTR lpModuleName; +int;DrawTextA;HDC hDC;LPCSTR lpString;int nCount;LPRECT lpRect;UINT uFormat; +void;PostQuitMessage;int nExitCode; +void;GetStartupInfo;LPSTARTUPINFO lpStartupInfo; +void;GetStartupInfoA;LPSTARTUPINFO lpStartupInfo; +void;GetStartupInfoW;LPSTARTUPINFO lpStartupInfo; +int;EditWndProc;DWORD hWnd;DWORD uMsg;DWORD wParam;DWORD lParam; +int;ActivateKeyboardLayout;KeyboardLayoutHandle hkl;UINT Flags; +int;AddClipboardFormatListener;HWND hwnd; +int;AdjustWindowRect;LPRECT lpRect;DWORD dwWinStyle;BOOL bMenu; +int;AdjustWindowRectEx;LPRECT lpRect;DWORD dwWinStyle;BOOL bMenu;DWORD dwEsStyle; +int;AllowActivateDetachQueuesSetFocus;; +int;AllowSetForegroundWindow;DWORD dwProcessId; +int;AnimateWindow;HWND hWnd;DWORD dwTime;DWORD dwFlags; +int;AnyPopup;; +int;AppendMenu;HMENU hMenu;UINT uFlags;UINT_PTR uIDNewItem;LPCTSTR lpNewItem; +int;AppendMenuA;HMENU hMenu;UINT wFlags;UINT_PTR wIDNewItem;LPCTSTR lpNewItem; +int;AppendMenuW;HMENU hMenu;UINT wFlags;UINT_PTR wIDNewItem;LPCTSTR lpNewItem; +int;ArrangeIconicWindows;HWND hwnd; +int;AttachThreadInput;DWORD idAttach;DWORD idAttachTo;BOOL fAttach; +int;BeginDeferWindowPos;int nNumWindows; +int;BeginPaint;HWND hwnd;LPPAINTSTRUCT lpPaint; +int;BlockInput;BOOL fBlockIt; +int;BringWindowToTop;HWND hWnd; +int;BroadcastSystemMessage;DWORD dwFlags;LPDWORD lpdwRecipients;UINT uiMessage;WPARAM wParam;LPARAM Param; +int;BroadcastSystemMessageEx;DWORD dwFlags;LPDWORD lpdwRecipients;UINT uiMessage;WPARAM wParam;LPARAM lParam;PBSMINFO pBSMInfo; +int;CalculatePopupWindowPosition;const POINT* anchorPoint;const SIZE* windowSize;UINT flags;RECT* excludeRect;RECT* popupWindowPosition; +int;CallMsgFilter;LPMSG lpMsg;int nCode; +int;CallNextHookEx;HHOOK hhk;int nCode;WPARAM wParam;LPARAM lParam; +int;CallWindowProc;WNDPROC lpPrevWndFunc;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;CallWindowProcA;WNDPROC lpPrevWndFunc;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;CallWindowProcW;WNDPROC lpPrevWndFunc;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;CascadeWindows;HWND hwndParent;UINT wHow;const RECT* lpRect;UINT cKids;const HWND* lpKids; +int;ChangeClipboardChain;HWND hWndRemove;HWND hWndNewNext; +int;ChangeDisplaySettings;DEVMODE* lpDevMode;DWORD dwflags; +int;ChangeDisplaySettingsEx;LPCTSTR lpszDeviceName;DEVMODE* lpDevMode;HWND hwnd;DWORD dwflags;LPVOID lParam; +int;ChangeWindowMessageFilter;UINT message;DWORD dwFlag; +int;ChangeWindowMessageFilterEx;HWND hWnd;UINT message;DWORD action;PCHANGEFILTERSTRUCT pChangeFilterStruct; +int;CharLower;LPTSTR lpsz; +int;CharLowerA;LPTSTR lpsz; +int;CharLowerBuff;LPTSTR lpsz;DWORD cchLength; +int;CharLowerBuffA;LPTSTR lpsz;DWORD cchLength; +int;CharLowerBuffW;LPTSTR lpsz;DWORD cchLength; +int;CharLowerW;LPTSTR lpsz; +int;CharNext;LPCTSTR lpsz; +int;CharNextA;LPCTSTR lpsz; +int;CharNextExA;WORD CodePage;LPCSTR lpCurrentChar;DWORD dwFlags; +int;CharNextW;LPCTSTR lpsz; +int;CharPrev;LPCTSTR lpszStart;LPCTSTR lpszCurrent; +int;CharPrevA;LPCTSTR lpszStart;LPCTSTR lpszCurrent; +int;CharPrevExA;WORD CodePage;LPCSTR lpStart;LPCSTR lpCurrentChar;DWORD dwFlags; +int;CharToOem;LPCTSTR lpszSrc;LPSTR lpszDst; +int;CharToOemA;LPCTSTR lpszSrc;LPSTR lpszDst; +int;CharToOemBuff;LPCTSTR lpszSrc;LPSTR lpszDst;DWORD cchDstLength; +int;CharToOemW;LPCTSTR lpszSrc;LPSTR lpszDst; +int;CharUpper;LPTSTR lpsz; +int;CharUpperA;LPTSTR lpsz; +int;CharUpperBuff;LPTSTR lpsz;DWORD cchLength; +int;CharUpperBuffA;LPTSTR lpsz;DWORD cchLength; +int;CharUpperBuffW;LPTSTR lpsz;DWORD cchLength; +int;CharUpperW;LPTSTR lpsz; +int;CheckDlgButton;HWND hDlg;int nIDButton;UINT uCheck; +int;CheckMenuItem;HMENU hmenu;UINT uIDCheckItem;UINT uCheck; +int;CheckMenuRadioItem;HMENU hmenu;UINT idFirst;UINT idLast;UINT idCheck;DWORD uFlags; +int;CheckRadioButton;HWND hDlg;int nIDFirstButton;int nIDLastButton;int nIDCheckButton; +int;ChildWindowFromPoint;HWND hWndParent;POINT Point; +int;ChildWindowFromPointEx;HWND hwndParent;POINT pt;UINT uFlags; +int;ClientToScreen;HWND hWnd;LPPOINT lpPoint; +int;ClipCursor;const RECT* lpRect; +int;CloseClipboard;; +int;CloseDesktop;HDESK hDesktop; +int;CloseGestureInfoHandle;HGESTUREINFO hGestureInfo; +int;CloseTouchInputHandle;HTOUCHINPUT hTouchInput; +int;CloseWindow;HWND hWnd; +int;CloseWindowStation;HWINSTA hWinSta; +int;CopyAcceleratorTable;HACCEL hAccelSrc;LPACCEL lpAccelDst;int cAccelEntries; +int;CopyAcceleratorTableA;HACCEL hAccelSrc;LPACCEL IpAcceIDst;int cAccelEntries; +int;CopyAcceleratorTableW;HACCEL hAccelSrc;LPACCEL IpAcceIDst;int cAccelEntries; +int;CopyCursor;HCURSOR pcur; +int;CopyIcon;HICON hIcon; +int;CopyImage;HANDLE hImage;UINT uType;int cxDesired;int cyDesired;UINT fuFlags; +int;CopyRect;LPRECT lprcDst;const RECT* lprcSrc; +int;CountClipboardFormats;; +int;CreateAcceleratorTable;LPACCEL lpaccl;int cEntries; +int;CreateAcceleratorTableW;LPACCEL lpaccl;int cEntries; +int;CreateCaret;HWND hWnd;HBITMAP hBitmap;int nWidth;int nHeight; +int;CreateCursor;HINSTANCE hInst;int xHotSpot;int yHotSpot;int nWidth;int nHeight;const VOID* pvANDPlane;const VOID* pvXORPlane; +int;CreateDesktop;LPCTSTR lpszDesktop;LPCTSTR lpszDevice;LPDEVMODE pDevmode;DWORD dwFlags;DWORD dwDesiredAccess;LPSECURITY_ATTRIBUTES lpsa; +int;CreateDesktopEx;LPCTSTR lpszDesktop;LPCTSTR lpszDevice;LPDEVMODE pDevmode;DWORD dwFlags;DWORD dwDesiredAccess;LPSECURITY_ATTRIBUTES lpsa;ULONG ulHeapSize;PVOID pvoid; +int;CreateDialogIndirectParam;HINSTANCE hInstance;LPCDLGTEMPLATE lpTemplate;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM lParamInit; +int;CreateDialogIndirectParamA;HINSTANCE hInstance;LPCDLGTEMPLATE lpTemplate;HWND hWndParent;DLGPROC lpDialogFun;LPARAM lParamInit; +int;CreateDialogIndirectParamW;HINSTANCE hInstance;LPCDLGTEMPLATE lpTemplate;HWND hWndParent;DLGPROC lpDialogFun;LPARAM lParamInit; +int;CreateDialogParam;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM lParamInit; +int;CreateDialogParamA;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM dwInitParam; +int;CreateDialogParamW;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM dwInitParam; +int;CreateIcon;HINSTANCE hInstance;int nWidth;int Height;BYTE cPlanes;BYTE cBitsPixel;const BYTE* lpbANDbits;const BYTE* lpbXORbits; +int;CreateIconFromResource;PBYTE presbits;DWORD dwResSize;BOOL fIcon;DWORD dwVersion; +int;CreateIconFromResourceEx;PBYTE pbIconBits;DWORD cbIconBits;BOOL fIcon;DWORD dwVersion;int cxDesired;int cyDesired;UINT uFlags; +int;CreateIconIndirect;PICONINFO piconinfo; +int;CreateMDIWindow;LPCTSTR lpClassName;LPCTSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent;HINSTANCE hInstance;LPARAM lParam; +int;CreateMDIWindowA;LPCTSTR lpClassName;LPCTSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent;HINSTANCE hInstance;LPARAM lParam; +int;CreateMDIWindowW;LPCTSTR lpClassName;LPCTSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent;HINSTANCE hInstance;LPARAM lParam; +int;CreateMenu;; +int;CreatePopupMenu;; +int;CreateWindow;LPCTSTR lpClassName;LPCTSTR lpWindowName;DWORD dwStyle;int x;int y;int nWidth;int nHeight;HWND hWndParent;HMENU hMenu;HINSTANCE hInstance;LPVOID lpParam; +HWND;CreateWindowEx;DWORD dwExStyle;LPCSTR lpClassName;LPCSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent;HMENU hMenu;HINSTANCE hInstance;LPVOID lpParam; +HWND;CreateWindowExA;DWORD dwExStyle;LPCSTR lpClassName;LPCSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent;HMENU hMenu;HINSTANCE hInstance;LPVOID lpParam; +HWND;CreateWindowExW;DWORD dwExStyle;LPCWSTR lpClassName;LPCWSTR lpWindowName;DWORD dwStyle;int X;int Y;int nWidth;int nHeight;HWND hWndParent ;HMENU hMenu;HINSTANCE hInstance;LPVOID lpParam; +int;CreateWindowStation;LPCTSTR lpwinsta;DWORD dwFlags;DWORD dwDesiredAccess;LPSECURITY_ATTRIBUTES lpsa; +int;DdeAbandonTransaction;DWORD idInst;HCONV hConv;DWORD idTransaction; +int;DdeAccessData;HDDEDATA hData;LPDWORD pcbDataSize; +int;DdeAddData;HDDEDATA hData;LPBYTE pSrc;DWORD cb;DWORD cbOff; +int;DdeClientTransaction;LPBYTE pData;DWORD cbData;HCONV hConv;HSZ hszItem;UINT wFmt;UINT wType;DWORD dwTimeout;LPDWORD pdwResult; +int;DdeCmpStringHandles;HSZ hsz1;HSZ hsz2; +int;DdeConnect;DWORD idInst;HSZ hszService;HSZ hszTopic;PCONVCONTEXT pCC; +int;DdeConnectList;DWORD idInst;HSZ hszService;HSZ hszTopic;HCONVLIST hConvList;PCONVCONTEXT pCC; +int;DdeCreateDataHandle;DWORD idInst;LPBYTE pSrc;DWORD cb;DWORD cbOff;HSZ hszItem;UINT wFmt;UINT afCmd; +int;DdeCreateStringHandle;DWORD idInst;LPTSTR psz;int iCodePage; +int;DdeDisconnect;HCONV hConv; +int;DdeDisconnectList;HCONVLIST hConvList; +int;DdeEnableCallback;DWORD idInst;HCONV hConv;UINT wCmd; +int;DdeFreeDataHandle;HDDEDATA hData; +int;DdeFreeStringHandle;DWORD idInst;HSZ hsz; +int;DdeGetData;HDDEDATA hData;LPBYTE pDst;DWORD cbMax;DWORD cbOff; +int;DdeGetLastError;DWORD idInst; +int;DdeImpersonateClient;HCONV hConv; +int;DdeInitialize;LPDWORD pidInst;PFNCALLBACK pfnCallback;DWORD afCmd;DWORD ulRes; +int;DdeKeepStringHandle;DWORD idInst;HSZ hsz; +int;DdeNameService;DWORD idInst;UINT hsz1;UINT hsz2;UINT afCmd; +int;DdePostAdvise;DWORD idInst;HSZ hszTopic;HSZ hszItem; +int;DdeQueryConvInfo;HCONV hConv;DWORD idTransaction;PCONVINFO pConvInfo; +int;DdeQueryNextServer;HCONVLIST hConvList;HCONV hConvPrev; +int;DdeQueryString;DWORD idInst;HSZ hsz;LPTSTR psz;DWORD cchMax;int iCodePage; +int;DdeReconnect;HCONV hConv; +int;DdeSetQualityOfService;HWND hwndClient;const SECURITY_QUALITY_OF_SERVICE* pqosNew;PSECURITY_QUALITY_OF_SERVICE pqosPrev; +int;DdeSetUserHandle;HCONV hConv;DWORD id;DWORD_PTR hUser; +int;DdeUnaccessData;HDDEDATA hData; +int;DdeUninitialize;DWORD idInst; +int;DefDlgProc;HWND hDlg;UINT Msg;WPARAM wParam;LPARAM lParam; +int;DefDlgProcW;HWND hDlg;UINT Msg;WPARAM wParam;LPARAM lParam; +int;DefFrameProc;HWND hWnd;HWND hWndMDIClient;UINT uMsg;WPARAM wParam;LPARAM lParam; +int;DefFrameProcA;HWND hWnd;HWND hWndMDIClient;UINT uMsg;WPARAM wParam;LPARAM lParam; +int;DefFrameProcW;HWND hWnd;HWND hWndMDIClient;UINT uMsg;WPARAM wParam;LPARAM lParam; +int;DefMDIChildProc;HWND hWnd;UINT uMsg;WPARAM wParam;LPARAM lParam; +int;DefMDIChildProcA;HWND hWnd;UINT uMsg;WPARAM wParam;LPARAM lParam; +int;DefRawInputProc;PRAWINPUT* paRawInput;INT nInput;UINT cbSizeHeader; +LRESULT;DefWindowProc;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +LRESULT;DefWindowProcA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +LRESULT;DefWindowProcW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;DeferWindowPos;HDWP hWinPosInfo;HWND hWnd;HWND hWndInsertAfter;int x;int y;int cx;int cy;UINT uFlags; +int;DeleteMenu;HMENU hMenu;UINT uPosition;UINT uFlags; +int;DeregisterShellHookWindow;HWND hWnd; +int;DestroyAcceleratorTable;HACCEL hAccel; +int;DestroyCaret;; +int;DestroyCursor;HCURSOR hCursor; +int;DestroyIcon;HICON hIcon; +int;DestroyMenu;HMENU hMenu; +int;DestroyWindow;HWND hWnd; +int;DialogBoxIndirectParam;HINSTANCE hInstance;LPCDLGTEMPLATE hDialogTemplate;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM dwInitParam; +int;DialogBoxIndirectParamA;HINSTANCE hInstance;LPCDLGTEMPLATE hDialogTemplate;HWND hWndParent;DLGPROC pDialogFunc;LPARAM dwInitParam; +int;DialogBoxIndirectParamW;HINSTANCE hInstance;LPCDLGTEMPLATE hDialogTemplate;HWND hWndParent;DLGPROC pDialogFunc;LPARAM dwInitParam; +int;DialogBoxParam;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWndParent;DLGPROC lpDialogFunc;LPARAM dwInitParam; +int;DialogBoxParamA;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWnd;DLGPROC lpDialogFunc;LPARAM dwInitParam; +int;DialogBoxParamW;HINSTANCE hInstance;LPCTSTR lpTemplateName;HWND hWnd;DLGPROC lpDialogFunc;LPARAM dwInitParam; +long;DispatchMessage;const MSG *lpMsg; +long;DispatchMessageA;const MSG *lpMsg; +long;DispatchMessageW;const MSG *lpMsg; +int;DlgDirList;HWND hDlg;LPTSTR lpPathSpec;int nIDListBox;int nIDStaticPath;UINT uFileType; +int;DlgDirListComboBox;HWND hDlg;LPTSTR lpPathSpec;int nIDComboBox;int nIDStaticPath;UINT uFiletype; +int;DlgDirSelectComboBoxEx;HWND hDlg;LPTSTR lpString;int nCount;int nIDComboBox; +int;DlgDirSelectEx;HWND hDlg;LPTSTR lpString;int nCount;int nIDListBox; +int;DragDetect;HWND hwnd;POINT pt; +int;DrawAnimatedRects;HWND hWnd;int dAni;const RECT* lprcFrom;const RECT* lprcTo; +int;DrawCaption;HWND hwnd;HDC hdc;LPCRECT lprc;UINT uFlags; +int;DrawEdge;HDC hDC;LPRECT qrc;UINT edge;UINT grfFlags; +int;DrawFocusRect;HDC hDC;const RECT* lprc; +int;DrawFrameControl;HDC hDC;LPRECT lprc;UINT uType;UINT uState; +int;DrawIcon;HDC hDC;int X;int Y;HICON hIcon; +int;DrawIconEx;HDC hDC;int xLeft;int yTop;HICON hIcon;int cxWidth;int cyWidth;UINT istepIfAniCur;HBRUSH hbrFlickerFreeDraw;UINT diFlags; +int;DrawMenuBar;HWND hWnd; +int;DrawState;HDC hdc;HBRUSH hbr;DRAWSTATEPROC lpOutputFunc;LPARAM lData;WPARAM wData;int x;int y;int cx;int cy;UINT fuFlags; +int;DrawStateA;HDC hDC;HBRUSH hbr;DRAWSTATEPROC lpOutputFunc;LPARAM lData;WPARAM wData;int X;int Y;int cx;int cy;UINT fuFlags; +int;DrawStateW;HDC hDC;HBRUSH hbr;DRAWSTATEPROC lpOutputFunc;LPARAM lData;WPARAM wData;int X;int Y;int cx;int cy;UINT fuFlags; +int;DrawText;HDC hDC;LPCTSTR lpchText;int nCount;LPRECT lpRect;UINT uFormat; +int;DrawTextA;HDC hDC;LPCTSTR lpString;int nCount;LPRECT lpRect;UINT uFormat; +int;DrawTextEx;HDC hdc;LPTSTR lpchText;int cchText;LPRECT lprc;UINT dwDTFormat;LPDRAWTEXTPARAMS lpDTParams; +int;DrawTextExA;HDC hDC;LPTSTR lpchText;int cchText;LPRECT lprc;UINT dwDTFormat;LPDRAWTEXTPARAMS lpDTParams; +int;DrawTextExW;HDC hDC;LPTSTR lpchText;int cchText;LPRECT lprc;UINT dwDTFormat;LPDRAWTEXTPARAMS lpDTParams; +int;DrawTextW;HDC hDC;LPCTSTR lpString;int nCount;LPRECT lpRect;UINT uFormat; +int;EmptyClipboard;; +int;EnableMenuItem;HMENU hMenu;UINT uIDEnableItem;UINT uEnable; +int;EnableScrollBar;HWND hWnd;UINT WSBflags;UINT wArrows; +int;EnableWindow;HWND hWnd;BOOL bEnable; +int;EndDeferWindowPos;HDWP hWinPosInfo; +int;EndDialog;HWND hDlg;INT_PTR nResult; +int;EndMenu;; +int;EndPaint;HWND hWnd;const PAINTSTRUCT* lpPaint; +int;EndTask;HWND hWnd;BOOL fShutDown;BOOL fForce; +int;EnumChildWindows;HWND hWndParent;WNDENUMPROC lpEnumFunc;LPARAM lParam; +int;EnumClipboardFormats;UINT format; +int;EnumDesktopWindows;HDESK hDesktop;WNDENUMPROC lpfn;LPARAM lParam; +int;EnumDesktops;HWINSTA hwinsta;DESKTOPENUMPROC lpEnumFunc;LPARAM lParam; +int;EnumDisplayDevices;LPCTSTR lpReserved;DWORD iDeviceNum;PDISPLAY_DEVICE pDisplayDevice;DWORD dwFlags; +int;EnumDisplayMonitors;DWORD hDesktop;DWORD lpfn;DWORD lParam; +int;EnumDisplayMonitors;HDC hdc;LPCRECT lprcClip;MONITORENUMPROC lpfnEnum;LPARAM dwData; +int;EnumDisplaySettings;LPCTSTR lpszDeviceName;int iModeNum;DEVMODE* lpDevMode; +int;EnumDisplaySettingsA;LPCTSTR lpszDeviceName;int iModeNum;DEVMODE* lpDevMode; +int;EnumDisplaySettingsEx;LPCTSTR lpszDeviceName;DWORD iModeNum;DEVMODE* lpDevMode;DWORD dwFlags; +int;EnumProps;HWND hWnd;PROPENUMPROC lpEnumFunc; +int;EnumPropsEx;HWND hWnd;PROPENUMPROCEX lpEnumFunc;LPARAM lParam; +int;EnumThreadWindows;DWORD dwThreadId;WNDENUMPROC lpfn;LPARAM lParam; +int;EnumWindowStations;WINSTAENUMPROC lpEnumFunc;LPARAM lParam; +int;EnumWindows;WNDENUMPROC lpEnumFunc;LPARAM lParam; +int;EqualRect;const RECT* lprc1;const RECT* lprc2; +int;ExcludeUpdateRgn;HDC hDC;HWND hWnd; +int;ExitWindowsEx;UINT uFlags;DWORD dwReserved; +int;FillRect;HDC hDC;const RECT* lprc;HBRUSH hbr; +int;FindWindow;LPCTSTR lpClassName;LPCTSTR lpWindowName; +int;FindWindowA;LPCTSTR lpClassName;LPCTSTR lpWindowName; +int;FindWindowEx;HWND hwndParent;HWND hwndChildAfter;LPCTSTR lpszClass;LPCTSTR lpszWindow; +int;FindWindowExA;HWND hwndParent;HWND hwndChildAfter;LPCTSTR lpszClass;LPCTSTR pszWindow; +int;FindWindowExW;HWND hwndParent;HWND hwndChildAfter;LPCTSTR lpszClass;LPCTSTR pszWindow; +int;FindWindowW;LPCTSTR lpClassName;LPCTSTR lpWindowName; +int;FlashWindow;HWND hWnd;BOOL bInvert; +int;FlashWindowEx;PFLASHWINFO pfwi; +int;FrameRect;HDC hDC;const RECT* lprc;HBRUSH hbr; +int;FreeDDElParam;UINT msg;LPARAM lParam; +int;GetActiveWindow;; +int;GetAltTabInfo;HWND hwnd;int iItem;PALTTABINFO pati;LPTSTR pszItemText;UINT cchItemText; +int;GetAncestor;HWND hwnd;DWORD gaFlags; +int;GetAsyncKeyState;int vKey; +int;GetCapture;; +int;GetCaretBlinkTime;; +int;GetCaretPos;LPPOINT lpPoint; +int;GetClassInfo;HINSTANCE hInstance;LPCTSTR lpClassName;LPWNDCLASS lpWndClass; +int;GetClassInfoA;HINSTANCE hInstance;LPCTSTR lpClassName;LPWNDCLASS lpWndClass; +int;GetClassInfoEx;HINSTANCE hinst;LPCTSTR lpszClass;LPWNDCLASSEX lpwcx; +int;GetClassInfoExA;HINSTANCE hinst;LPCTSTR lpszClass;LPWNDCLASSEX lpwcx; +int;GetClassInfoExW;HINSTANCE hinst;LPCTSTR lpszClass;LPWNDCLASSEX lpwcx; +int;GetClassInfoW;HINSTANCE hInstance;LPCTSTR lpClassName;LPWNDCLASS lpWndClass; +int;GetClassLong;HWND hWnd;int nIndex; +int;GetClassLongA;HWND hWnd;int nIndex; +int;GetClassLongW;HWND hWnd;int nIndex; +int;GetClassName;HWND hWnd;LPTSTR lpClassName;int nMaxCount; +int;GetClassNameA;HWND hWnd;LPTSTR lpBuffer;int nBufferSize; +int;GetClassNameW;HWND hWnd;LPTSTR lpBuffer;int nBufferSize; +int;GetClassWord;HWND hWnd;int nIndex; +int;GetClientRect;HWND hWnd;LPRECT lpRect; +int;GetClipCursor;LPRECT lpRect; +int;GetClipboardData;UINT uFormat; +int;GetClipboardFormatName;UINT format;LPTSTR lpszFormatName;int cchMaxCount; +int;GetClipboardFormatNameA;UINT format;LPTSTR lpBuffer;int cchMaxCount; +int;GetClipboardOwner;; +int;GetClipboardSequenceNumber;; +int;GetClipboardViewer;; +int;GetComboBoxInfo;HWND hWndCombo;PCOMBOBOXINFO pcbi; +int;GetCursor;; +int;GetCursorInfo;PCURSORINFO pci; +int;GetCursorPos;LPPOINT lpPoint; +int;GetDC;HWND hwnd; +int;GetDCEx;HWND hWnd;HRGN hrgnClip;UINT flags; +HWND;GetDesktopWindow;; +int;GetDialogBaseUnits;; +int;GetDlgCtrlID;HWND hwndCtl; +int;GetDlgItem;HWND hDlg;int nIDDlgItem; +int;GetDlgItemInt;HWND hDlg;int nIDDlgItem;BOOL* lpTranslated;BOOL bSigned; +int;GetDlgItemText;HWND hDlg;int nIDDlgItem;LPTSTR lpString;int nMaxCount; +int;GetDlgItemTextA;HWND hDlg;int nIDDlgItem;LPTSTR lpBuffer;int nBufferSize; +int;GetDlgItemTextW;HWND hDlg;int nIDDlgItem;LPTSTR lpBuffer;int nBufferSize; +int;GetDoubleClickTime;; +int;GetFocus;; +int;GetForegroundWindow;; +int;GetGUIThreadInfo;DWORD idThread;LPGUITHREADINFO lpgui; +int;GetGestureConfig;HWND hwnd;DWORD dwReserved;DWORD dwFlags;PUINT pcIDs;PGESTURECONFIG pGestureConfig;UINT cbSize; +int;GetGestureExtraArgs;HGESTUREINFO hGestureInfo;UINT cbExtraArgs;PBYTE pExtraArgs; +int;GetGestureInfo;HGESTUREINFO hGestureInfo;PGESTUREINFO pGestureInfo; +int;GetGuiResources;HANDLE hProcess;DWORD uiFlags; +int;GetIconInfo;HICON hIcon;PICONINFO piconinfo; +int;GetIconInfoEx;HICON hIcon;PICONINFOEX piconinfoex; +int;GetInputState;; +int;GetKBCodePage;; +int;GetKeyNameText;LONG lParam;LPTSTR lpString;int nSize; +int;GetKeyNameTextA;LONG lParam;LPTSTR lpString;int nSize; +int;GetKeyNameTextW;LONG lParam;LPTSTR lpString;int nSize; +int;GetKeyState;int nVirtKey; +int;GetKeyboardLayout;DWORD dwLayout; +int;GetKeyboardLayoutList;int nBuff;HKL* lpList; +int;GetKeyboardLayoutName;LPTSTR pwszKLID; +int;GetKeyboardLayoutNameA;LPTSTR pwszKLID; +int;GetKeyboardLayoutNameW;LPTSTR pwszKLID; +int;GetKeyboardState;PBYTE lpKeyState; +int;GetKeyboardType;int nTypeFlag; +int;GetLastActivePopup;HWND hWnd; +int;GetLastInputInfo;PLASTINPUTINFO plii; +int;GetLayeredWindowAttributes;HWND hwnd;COLORREF* pcrKey;BYTE* pbAlpha;DWORD pdwFlags; +int;GetListBoxInfo;HWND hwnd; +int;GetMenu;HWND hWnd; +int;GetMenuBarInfo;HWND hwnd;UINT idObject;LONG idItem;PMENUBARINFO pmbi; +int;GetMenuCheckMarkDimensions;; +int;GetMenuContextHelpId;HMENU hmenu; +int;GetMenuDefaultItem;HMENU hMenu;UINT fByPos;UINT gmdiFlags; +int;GetMenuInfo;HMENU hMenu;LPCMENUINFO lpcMenuInfo; +int;GetMenuItemCount;HMENU hMenu; +int;GetMenuItemID;HMENU hMenu;int nPos; +int;GetMenuItemInfo;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;GetMenuItemInfoA;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;GetMenuItemInfoW;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;GetMenuItemRect;HWND hWnd;HMENU hMenu;UINT uItem;LPRECT lprcItem; +int;GetMenuState;HMENU hMenu;UINT uId;UINT uFlags; +int;GetMenuString;HMENU hMenu;UINT uIDItem;LPTSTR lpString;int nMaxCount;UINT uFlag; +int;GetMenuStringA;HMENU hMenu;UINT uIDItem;LPTSTR lpBuffer;int nBufferSize;UINT uFlag; +int;GetMenuStringW;HMENU hMenu;UINT uIDItem;LPTSTR lpBuffer;int nBufferSize;UINT uFlag; +bool;GetMessage;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax; +BOOL;GetMessageA;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax; +int;GetMessageExtraInfo;; +int;GetMessagePos;; +int;GetMessageTime;; +BOOL;GetMessageW;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax; +int;GetMonitorInfo;HMONITOR hMonitor;LPMONITORINFO lpmi; +int;GetMonitorInfoW;HMONITOR hMonitor;LPMONITORINFO lpMonitorIfno; +int;GetMouseMovePointsEx;UINT cbSize;LPMOUSEMOVEPOINT lppt;LPMOUSEMOVEPOINT lpptBuf;int nBufPoints;DWORD resolution; +int;GetNextDlgGroupItem;HWND hDlg;HWND hCtl;BOOL bPrevious; +int;GetNextDlgTabItem;HWND hDlg;HWND hCtl;BOOL bPrevious; +int;GetOpenClipboardWindow;; +int;GetParent;HWND hWnd; +int;GetPhysicalCursorPos;LPPOINT lpPoint; +int;GetPriorityClipboardFormat;UINT* paFormatPriorityList;int cFormats; +int;GetProcessDefaultLayout;DWORD* pdwDefaultLayout; +int;GetProcessWindowStation;; +int;GetProp;HWND hWnd;LPCTSTR lpString; +int;GetPropA;HWND hWnd;LPCTSTR lpString; +int;GetPropW;HWND hWnd;LPCTSTR lpString; +int;GetQueueStatus;DWORD flags; +int;GetRawInputBuffer;PRAWINPUT pData;PUINT pcbSize;UINT cbSizeHeader; +int;GetRawInputData;HRAWINPUT hRawInput;UINT uiCommand;LPVOID pData;PUINT pcbSize;UINT cbSizeHeader; +int;GetRawInputDeviceInfo;HANDLE hDevice;UINT uiCommand;LPVOID pData;PUINT pcbSize; +int;GetRawInputDeviceList;PRAWINPUTDEVICELIST pRawInputDeviceList;PUINT puiNumDevices;UINT cbSize; +int;GetRegisteredRawInputDevices;PRAWINPUTDEVICE pRawInputDevices;PUINT puiNumDevices;UINT cbSize; +int;GetScrollBarInfo;HWND hWnd;UINT fnBar;PSCROLLBARINFO lpsi; +int;GetScrollInfo;HWND hWnd;int fnBar;LPSCROLLINFO lpScorllInfo; +int;GetScrollPos;HWND hWnd;int nBar; +int;GetScrollRange;HWND hWnd;int nBar;LPINT lpMinPos;LPINT lpMaxPos; +int;GetShellWindow;; +int;GetSubMenu;HMENU hMenu;int nPos; +int;GetSysColor;int nIndex; +int;GetSysColorBrush;int nIndex; +int;GetSystemMenu;HWND hWnd;BOOL bRevert; +int;GetSystemMetrics;int nIndex; +int;GetTabbedTextExtent;HDC hDC;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions; +int;GetTabbedTextExtentA;HDC hDC;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions; +int;GetTabbedTextExtentW;HDC hDC;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions; +int;GetThreadDesktop;DWORD dwThreadId; +int;GetTitleBarInfo;HWND hwnd;PTITLEBARINFO pti; +int;GetTopWindow;HWND hWnd; +int;GetTouchInputInfo;HTOUCHINPUT hTouchInput;UINT cInputs;PTOUCHINPUT pInputs;int cbSize; +int;GetUpdateRect;HWND hWnd;LPRECT lpRect;BOOL bErase; +int;GetUpdateRgn;HWND hWnd;HRGN hRgn;BOOL bErase; +int;GetUpdatedClipboardFormats;PUINT lpuiFormats;UINT cFormats;PUINT pcFormatsOut; +int;GetUserObjectInformation;HANDLE hObj;UINT nIndex;PVOID pvInfo;DWORD nLength;LPDWORD lpnLengthNeeded; +int;GetUserObjectInformationA;HANDLE hActiveDesktop;UINT nIndex;PVOID pvInfo;DWORD nBuffLen;LPDWORD dwSize; +int;GetUserObjectSecurity;HANDLE hObj;PSECURITY_INFORMATION pSIRequested;PSECURITY_DESCRIPTOR pSD;DWORD nLength;LPDWORD lpnLengthNeeded; +int;GetWindow;HWND hWnd;UINT uCmd; +int;GetWindowContextHelpId;HWND hWnd; +int;GetWindowDC;HWND hWnd; +int;GetWindowDisplayAffinity;HWND hWnd;DWORD* dwAffinity; +int;GetWindowInfo;HWND hwnd;PWINDOWINFO pwi; +int;GetWindowLong;HWND hWnd;int nIndex; +int;GetWindowLongA;HWND hWnd;int nIndex; +int;GetWindowLongW;HWND hWnd;int nIndex; +int;GetWindowModuleFileName;HWND hwnd;LPTSTR lpszFileName;UINT cchFileNameMax; +int;GetWindowPlacement;HWND hWnd;WINDOWPLACEMENT* lpwndpl; +int;GetWindowRect;HWND hWnd;LPRECT lpRect; +int;GetWindowRgn;HWND hWnd;HRGN hRgn; +int;GetWindowRgnBox;HWND hWnd;LPRECT lprc; +int;GetWindowText;HWND hWnd;LPTSTR lpString;int nMaxCount; +int;GetWindowTextA;HWND hWnd;LPTSTR lpString;int nMaxCount; +int;GetWindowTextLength;HWND hWnd; +int;GetWindowTextLengthA;HWND hWnd; +int;GetWindowTextLengthW;HWND hWnd; +int;GetWindowTextW;HWND hWnd;LPTSTR lpString;int nMaxCount; +int;GetWindowThreadProcessId;HWND hWnd;LPDWORD lpdwProcessId; +int;GrayString;HDC hDC;HBRUSH hBrush;GRAYSTRINGPROC lpOutputFunc;LPARAM lpData;int nCount;int X;int Y;int nWidth;int nHeight; +int;GrayStringA;HDC hDC;HBRUSH hBrush;GRAYSTRINGPROC lpOutputFunc;LPARAM lpData;int nCount;int X;int Y;int nWidth;int nHeight; +int;GrayStringW;HDC hDC;HBRUSH hBrush;GRAYSTRINGPROC lpOutputFunc;LPARAM lpData;int nCount;int X;int Y;int nWidth;int nHeight; +int;HideCaret;HWND hWnd; +int;HiliteMenuItem;HWND hwnd;HMENU hmenu;UINT uItemHilite;UINT uHilite; +int;ImpersonateDdeClientWindow;HWND hWndClient;HWND hWndServer; +int;InSendMessage;; +int;InSendMessageEx;LPVOID lpReserved; +int;InflateRect;LPRECT lpRect;int x;int y; +int;InsertMenu;HMENU hMenu;UINT uPosition;UINT uFlags;UINT_PTR uIDNewItem;LPCTSTR lpNewItem; +int;InsertMenuA;HMENU hMenu;UINT nPosition;UINT wFlags;UINT_PTR wIDNewItem;LPCTSTR lpNewItem; +int;InsertMenuItem;HMENU hMenu;UINT uItem;BOOL fByPosition;LPCMENUITEMINFO lpmii; +int;InsertMenuItemA;HMENU hMenu;UINT uItem;BOOL fByPosition;LPCMENUITEMINFO lpmii; +int;InsertMenuItemW;HMENU hMenu;UINT uItem;BOOL fByPosition;LPCMENUITEMINFO lpmii; +int;InsertMenuW;HMENU hMenu;UINT nPosition;UINT wFlags;UINT_PTR wIDNewItem;LPCTSTR lpNewItem; +int;InternalGetWindowText;HWND hWnd;LPWSTR lpString;int nMaxCount; +int;IntersectRect;LPRECT lprcDst;const RECT* lprcSrc1;const RECT* lprcSrc2; +int;InvalidateRect;HWND hWnd;const RECT* lpRect;BOOL bErase; +int;InvalidateRgn;HWND hWnd;HRGN hRgn;BOOL bErase; +int;InvertRect;HDC hDC;const RECT* lprc; +int;IsCharAlpha;TCHAR ch; +int;IsCharAlphaNumeric;TCHAR ch; +int;IsCharAlphaNumericA;TCHAR char; +int;IsCharAlphaNumericW;TCHAR char; +int;IsCharLower;TCHAR ch; +int;IsCharLowerA;TCHAR char; +int;IsCharUpper;TCHAR ch; +int;IsChild;HWND hWndParent;HWND hWnd; +int;IsClipboardFormatAvailable;UINT format; +BOOL;IsDialogMessage;HWND hDlg;LPMSG lpMsg; +BOOL;IsDialogMessageA;HWND hDlg;LPMSG lpMsg; +BOOL;IsDialogMessageW;HWND hDlg;LPMSG lpMsg; +int;IsDlgButtonChecked;HWND hDlg;int nIDButton; +int;IsGUIThread;BOOL bConvert; +int;IsHungAppWindow;HWND hWnd; +int;IsIconic;HWND hWnd; +int;IsMenu;HMENU hMenu; +int;IsProcessDPIAware;; +int;IsRectEmpty;const RECT* lprc; +int;IsTouchWindow;HWND hWnd;PULONG pulFlags; +int;IsWinEventHookInstalled;DWORD event; +int;IsWindow;HWND hWnd; +int;IsWindowEnabled;HWND hWnd; +int;IsWindowUnicode;HWND hWnd; +int;IsWindowVisible;HWND hWnd; +int;IsWow64Message;; +int;IsZoomed;HWND hWnd; +int;KillTimer;HWND hWnd;UINT_PTR nIDEvent; +HACCEL;LoadAccelerators;HINSTANCE hInstance;LPCSTR lpTableName; +HACCEL;LoadAcceleratorsA;HINSTANCE hInstance;LPCSTR lpTableName; +HACCEL;LoadAcceleratorsW;HINSTANCE hInstance;LPCWSTR lpTableName; +int;LoadBitmap;HINSTANCE hInstance;LPCTSTR lpBitmapName; +int;LoadBitmapA;HINSTANCE hInstance;LPCTSTR lpBitmapName; +int;LoadBitmapW;HINSTANCE hInstance;LPCTSTR lpBitmapName; +HCURSOR;LoadCursor;HINSTANCE hInstance;LPCTSTR lpCursorName; +HCURSOR;LoadCursorA;HINSTANCE hInstance;LPCTSTR lpCursorName; +int;LoadCursorFromFile;LPCTSTR lpFileName; +int;LoadCursorFromFileA;LPCTSTR lpFileName; +int;LoadCursorFromFileW;LPCTSTR lpFileName; +HCURSOR;LoadCursorW;HINSTANCE hInstance;LPCTSTR lpCursorName; +HICON;LoadIcon;HINSTANCE hInstance;LPCSTR lpIconName; +HICON;LoadIconA;HINSTANCE hInstance;LPCSTR lpIconName; +HICON;LoadIconW;HINSTANCE hInstance;LPCSTR lpIconName; +int;LoadImage;HINSTANCE hinst;LPCTSTR lpszName;UINT uType;int cxDesired;int cyDesired;UINT fuLoad; +int;LoadImageA;HINSTANCE hinst;LPCTSTR lpszName;UINT uType;int Width;int Height;UINT Options; +int;LoadImageW;HINSTANCE hinst;LPCTSTR lpszName;UINT uType;int Width;int Height;UINT Options; +int;LoadKeyboardLayout;LPCTSTR pwszKLID;UINT Flags; +int;LoadKeyboardLayoutA;LPCTSTR lpwszKLID;UINT Flags; +int;LoadKeyboardLayoutW;LPCTSTR lpwszKLID;UINT Flags; +int;LoadMenu;HINSTANCE hInstance;LPCTSTR lpMenuName; +int;LoadMenuA;HINSTANCE hInstance;LPCTSTR lpMenuName; +int;LoadMenuIndirect;CONST MENUTEMPLATE* lpMenuTemplate; +int;LoadMenuIndirectA;CONST MENUTEMPLATE* lpMenuTemplate; +int;LoadMenuIndirectW;CONST MENUTEMPLATE* lpMenuTemplate; +int;LoadMenuW;HINSTANCE hInstance;LPCTSTR lpMenuName; +int;LoadString;HINSTANCE hInstance;UINT uID;LPTSTR lpBuffer;int nBufferMax; +int;LoadStringA;HINSTANCE hInstance;UINT uID;LPTSTR lpBuffer;int nBufferMax; +int;LoadStringW;HINSTANCE hInstance;UINT uID;LPTSTR lpBuffer;int nBufferMax; +int;LockSetForegroundWindow;UINT uLockCode; +int;LockWindowUpdate;HWND hWndLock; +int;LockWorkStation;; +int;LogicalToPhysicalPoint;HWND hWnd;LPPOINT lpPoint; +int;LookupIconIdFromDirectory;PBYTE presbits;BOOL fIcon; +int;LookupIconIdFromDirectoryEx;PBYTE presbits;BOOL fIcon;int cxDesired;int cyDesired;UINT Flags; +int;MapDialogRect;HWND hDlg;LPRECT IpRect; +int;MapVirtualKey;UINT uCode;UINT uMapType; +int;MapVirtualKeyA;UINT uCode;UINT uMapType; +int;MapVirtualKeyEx;UINT uCode;UINT uMapType;HKL dwhkl; +int;MapVirtualKeyExA;UINT uCode;UINT uMapType;HKL dwhkl; +int;MapVirtualKeyExW;UINT uCode;UINT uMapType;HKL dwhkl; +int;MapVirtualKeyW;UINT uCode;UINT uMapType; +int;MapWindowPoints;HWND hWndFrom;HWND hWndTo;LPPOINT lpPoints;UINT cPoints; +int;MenuItemFromPoint;HWND hWnd;HMENU hMenu;POINT ptScreen; +int;MessageBeep;UINT uType; +int;MessageBox;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType; +int;MessageBoxA;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType; +int;MessageBoxEx;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;WORD wLanguageId; +int;MessageBoxExA;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;WORD wLanguageId; +int;MessageBoxExW;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;WORD wLanguageId; +int;MessageBoxIndirect;const LPMSGBOXPARAMS lpMsgBoxParams; +int;MessageBoxIndirectA;const LPMSGBOXPARAMS lpMsgBoxParams; +int;MessageBoxIndirectW;const LPMSGBOXPARAMS lpMsgBoxParamsW; +int;MessageBoxTimeout;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;WORD wLanguageId;DWORD dwMilliseconds; +int;MessageBoxW;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType; +int;ModifyMenu;HMENU hMnu;UINT uPosition;UINT uFlags;UINT_PTR uIDNewItem;LPCTSTR lpNewItem; +int;ModifyMenuA;HMENU hMenu;UINT uPosition;UINT uFlags;UINT_PTR uIDNewItem;LPCTSTR lpNewItem; +int;ModifyMenuW;HMENU hMenu;UINT uPosition;UINT uFlags;UINT_PTR uIDNewItem;LPCTSTR lpNewItem; +int;MonitorFromPoint;POINT pt;DWORD dwFlags; +int;MonitorFromRect;LPCRECT lprc;DWORD dwFlags; +int;MonitorFromWindow;DWORD hWnd;DWORD dwFlags; +int;MonitorFromWindow;HWND hwnd;DWORD dwFlags; +int;MoveWindow;HWND hWnd;int X;int Y;int nWidth;int nHeight;BOOL bRepaint; +int;MsgWaitForMultipleObjects;DWORD nCount;const HANDLE* pHandles;BOOL fWaitAll;DWORD dwMilliseconds;DWORD dwWakeMask; +int;MsgWaitForMultipleObjectsEx;DWORD nCount;const HANDLE* pHandles;DWORD dwMilliseconds;DWORD dwWakeMask;DWORD dwFlags; +int;NotifyWinEvent;DWORD event;HWND hwnd;LONG idObject;LONG idChild; +int;OemKeyScan;WORD wOemChar; +int;OemToChar;LPCSTR lpszSrc;LPTSTR lpszDst; +int;OemToCharA;LPCSTR lpszSrc;LPTSTR lpszDst; +int;OemToCharBuff;LPCTSTR lpszSrc;LPTSTR lpszDst;DWORD cchDstLength; +int;OemToCharBuffA;LPCTSTR lpszSrc;LPTSTR lpszDst;DWORD cchDstLength; +int;OemToCharBuffW;LPCTSTR lpszSrc;LPTSTR lpszDst;DWORD cchDstLength; +int;OemToCharW;LPCSTR lpszSrc;LPTSTR lpszDst; +int;OffsetRect;LPRECT lprc;int dx;int dy; +int;OpenClipboard;HWND hWndNewOwner; +int;OpenDesktop;LPTSTR lpszDesktop;DWORD dwFlags;BOOL fInherit;DWORD dwDesiredAccess; +int;OpenIcon;HWND hWnd; +int;OpenInputDesktop;DWORD dwFlags;BOOL fInherit;DWORD dwDesiredAccess; +int;OpenWindowStation;LPTSTR lpszWinSta;BOOL fInherit;DWORD dwDesiredAccess; +int;PackDDElParam;UINT msg;UINT_PTR uiLo;UINT_PTR uiHi; +int;PaintDesktop;HDC hDC; +int;PeekMessage;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax;UINT wRemoveMsg; +int;PeekMessageA;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax;UINT wRemoveMsg; +int;PeekMessageW;LPMSG lpMsg;HWND hWnd;UINT wMsgFilterMin;UINT wMsgFilterMax;UINT wRemoveMsg; +int;PhysicalToLogicalPoint;HWND hWnd;LPPOINT lpPoint; +int;PostMessage;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;PostMessageA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM Param; +int;PostMessageW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM Param; +int;PostQuitMessage;int nExitCode; +int;PostThreadMessage;DWORD idThread;UINT Msg;WPARAM wParam;LPARAM lParam; +int;PostThreadMessageA;DWORD idThread;UINT Msg;WPARAM wParam;LPARAM lParam; +int;PostThreadMessageW;DWORD idThread;UINT Msg;WPARAM wParam;LPARAM lParam; +int;PrintWindow;HWND hwnd;HDC hdcBlt;UINT nFlags; +int;PrivateExtractIcons;LPCTSTR lpszFile;int nIconIndex;int cxIcon;int cyIcon;HICON* phicon;UINT* piconid;UINT nIcons;UINT flags; +int;PtInRect;const RECT* lprc;POINT pt; +int;RealChildWindowFromPoint;HWND hwndParent;POINT ptParentClientCoords; +int;RealGetWindowClass;HWND hwnd;LPTSTR pszType;UINT cchType; +int;RedrawWindow;HWND hWnd;const RECT* lprcUpdate;HRGN hrgnUpdate;UINT flags; +ATOM;RegisterClass;CONST WNDCLASS* lpWndClass; +ATOM;RegisterClassA;CONST WNDCLASS* lpWndClass; +ATOM;RegisterClassW;const WNDCLASS* lpWndClass; +ATOM;RegisterClassEx;CONST WNDCLASSEX* lpwcx; +ATOM;RegisterClassExA;CONST WNDCLASSEX* lpWndClassEx; +ATOM;RegisterClassExW;CONST WNDCLASSEX* lpWndClassEx; +int;RegisterClassW;CONST WNDCLASS* lpWndClass; +int;RegisterClipboardFormat;LPCTSTR lpszFormat; +int;RegisterClipboardFormatA;LPCTSTR lpszFormat; +int;RegisterClipboardFormatW;LPCTSTR lpszFormat; +int;RegisterDeviceNotification;HANDLE hRecipient;LPVOID NotificationFilter;UINT Flags; +int;RegisterHotKey;HWND hWnd;int id;UINT fsModifiers;UINT vk; +int;RegisterPowerSettingNotification;HANDLE hRecipient;LPCGUID PowerSettingGuid;UINT Flags; +int;RegisterRawInputDevices;PCRAWINPUTDEVICE pRawInputDevices;UINT uiNumDevices;UINT cbSize; +int;RegisterShellHookWindow;HWND hWnd; +int;RegisterTouchWindow;HWND hWnd;ULONG ulFlags; +int;RegisterWindowMessage;LPCTSTR lpString; +int;RegisterWindowMessageA;LPCTSTR lpString; +int;RegisterWindowMessageW;LPCTSTR lpString; +int;ReleaseCapture;; +int;ReleaseDC;HWND hWnd;HDC hDC; +int;RemoveClipboardFormatListener;HWND hwnd; +int;RemoveMenu;HMENU hMenu;UINT uPosition;UINT uFlags; +int;RemoveProp;HWND hWnd;LPCTSTR lpString; +int;RemovePropA;HWND hWnd;LPCTSTR lpString; +int;RemovePropW;HWND hWnd;LPCTSTR lpString; +int;ReplyMessage;LRESULT lResult; +int;ReuseDDElParam;LPARAM lParam;UINT msgIn;UINT msgOut;UINT_PTR uiLo;UINT_PTR uiHi; +int;ScreenToClient;HWND hWnd;LPPOINT lpPoint; +int;ScrollDC;HDC hDC;int dx;int dy;const RECT* lprcScroll;const RECT* lprcClip;HRGN hrgnUpdate;LPRECT lprcUpdate; +int;ScrollWindow;HWND hWnd;int XAmount;int YAmount;const RECT* lpRect;const RECT* lpClipRect; +int;ScrollWindowEx;HWND hWnd;int dx;int dy;const RECT* prcScroll;const RECT* prcClip;HRGN hrgnUpdate;LPRECT prcUpdate;UINT flags; +int;SendDlgItemMessage;HWND hDlg;int nIDDlgItem;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SendDlgItemMessageA;HWND hDlg;int nIDDlgItem;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SendInput;UINT nInputs;LPINPUT pInputs;int cbSize; +int;SendMessage;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SendMessageA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM Param; +int;SendMessageCallback;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;SENDASYNCPROC lpCallBack;ULONG_PTR dwData; +int;SendMessageCallbackA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;SENDASYNCPROC lpResultCallBack;ULONG_PTR dwData; +int;SendMessageCallbackW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;SENDASYNCPROC lpResultCallBack;ULONG_PTR dwData; +int;SendMessageTimeout;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;UINT fuFlags;UINT uTimeout;PDWORD_PTR lpdwResult; +int;SendMessageTimeoutA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;UINT fuFlags;UINT uTimeout;PDWORD_PTR lpdwResult; +int;SendMessageTimeoutW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam;UINT fuFlags;UINT uTimeout;PDWORD_PTR lpdwResult; +int;SendMessageW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM Param; +int;SendNotifyMessage;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SendNotifyMessageA;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SendNotifyMessageW;HWND hWnd;UINT Msg;WPARAM wParam;LPARAM lParam; +int;SetActiveWindow;HWND hWnd; +int;SetCapture;HWND hWnd; +int;SetCaretBlinkTime;UINT uMSeconds; +int;SetCaretPos;int X;int Y; +int;SetClassLong;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetClassLongA;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetClassLongW;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetClassWord;HWND hWnd;int nIndex;WORD wNewWord; +int;SetClipboardData;UINT uFormat;HANDLE hMem; +int;SetClipboardViewer;HWND hWndNewViewer; +int;SetCursor;HCURSOR hCursor; +int;SetCursorPos;int X;int Y; +int;SetDlgItemInt;HWND hDlg;int nIDDlgItem;UINT uValue;BOOL bSigned; +int;SetDlgItemText;HWND hDlg;int nIDDlgItem;LPCTSTR lpString; +int;SetDlgItemTextA;HWND hDlg;int nIDDlgItem;LPCTSTR lpString; +int;SetDlgItemTextW;HWND hDlg;int nIDDlgItem;LPCTSTR lpString; +int;SetDoubleClickTime;UINT uInterval; +int;SetFocus;HWND hWnd; +int;SetForegroundWindow;HWND hWnd; +int;SetGestureConfig;HWND hwnd;DWORD dwReserved;UINT cIDs;PGESTURECONFIG pGestureConfig;UINT cbSize; +int;SetKeyboardState;LPBYTE lpKeyState; +int;SetLastErrorEx;DWORD dwErrCode;DWORD dwType; +int;SetLayeredWindowAttributes;HWND hWnd;COLORREF crKey;BYTE bAlpha;DWORD dwFlags; +int;SetMenu;HWND hWnd;HMENU hMenu; +int;SetMenuContextHelpId;HMENU hmenu;DWORD dwContextHelpId; +int;SetMenuDefaultItem;HMENU hMenu;UINT uItem;UINT fByPos; +int;SetMenuInfo;HMENU hmenu;LPCMENUINFO lpcmi; +int;SetMenuItemBitmaps;HMENU hMenu;UINT uPosition;UINT uFlags;HBITMAP hBitmapUnchecked;HBITMAP hBitmapChecked; +int;SetMenuItemInfo;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;SetMenuItemInfoA;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;SetMenuItemInfoW;HMENU hMenu;UINT uItem;BOOL fByPosition;LPMENUITEMINFO lpmii; +int;SetMessageExtraInfo;LPARAM lParam; +int;SetParent;HWND hWndChild;HWND hWndNewParent; +int;SetPhysicalCursorPos;int X;int Y; +int;SetProcessDPIAware;; +int;SetProcessDefaultLayout;DWORD dwDefaultLayout; +int;SetProcessWindowStation;HWINSTA hWinSta; +int;SetProp;HWND hWnd;LPCTSTR lpString;HANDLE hData; +int;SetPropA;HWND hWnd;LPCTSTR lpString;HANDLE hData; +int;SetPropW;HWND hWnd;LPCTSTR lpString;HANDLE hData; +int;SetRect;LPRECT lprc;int xLeft;int yTop;int xRight;int yBottom; +int;SetRectEmpty;LPRECT lprc; +int;SetScrollInfo;HWND hWnd;int fnBar;LPCSCROLLINFO lpsi;BOOL fRedraw; +int;SetScrollPos;HWND hWnd;int nBar;int nPos;BOOL bRedraw; +int;SetScrollRange;HWND hWnd;int nBar;int nMinPos;int nMaxPos;BOOL bRedraw; +int;SetSysColors;int cElements;const INT* lpaElements;const COLORREF* lpaRgbValues; +int;SetSystemCursor;HCURSOR hcur;DWORD id; +int;SetThreadDesktop;HDESK hDesktop; +int;SetTimer;HWND hWnd;UINT_PTR nIDEvent;UINT uElapse;TIMERPROC lpTimerFunc; +int;SetUserObjectInformation;HANDLE hObj;int nIndex;PVOID pvInfo;DWORD nLength; +int;SetUserObjectSecurity;HANDLE hObj;PSECURITY_INFORMATION pSIRequested;PSECURITY_DESCRIPTOR pSID; +int;SetWinEventHook;UINT eventMin;UINT eventMax;HMODULE hmodWinEventProc;WINEVENTPROC lpfnWinEventProc;DWORD idProcess;DWORD idThread;DWORD dwflags; +int;SetWindowContextHelpId;HWND hWnd;DWORD dwContextHelpId; +int;SetWindowDisplayAffinity;HWND hWnd;DWORD dwAffinity; +int;SetWindowLong;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetWindowLongA;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetWindowLongW;HWND hWnd;int nIndex;LONG dwNewLong; +int;SetWindowPlacement;HWND hWnd;WINDOWPLACEMENT* lpwndpl; +int;SetWindowPos;HWND hWnd;HWND hWndInsertAfter;int X;int Y;int cx;int cy;UINT uFlags; +int;SetWindowRgn;HWND hWnd;HRGN hRgn;BOOL bRedraw; +int;SetWindowText;HWND hWnd;LPCTSTR lpString; +int;SetWindowTextA;HWND hwnd;LPCTSTR lpString; +int;SetWindowTextW;HWND hwnd;LPCTSTR lpString; +int;SetWindowsHookEx;int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadId; +int;SetWindowsHookExA;int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadId; +int;SetWindowsHookExW;int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadId; +int;ShowCaret;HWND hWnd; +int;ShowCursor;BOOL bShow; +int;ShowOwnedPopups;HWND hWnd;BOOL fShow; +int;ShowScrollBar;HWND hWnd;int wBar;BOOL bShow; +int;ShowWindow;HWND hWnd;int nCmdShow; +int;ShowWindowAsync;HWND hWnd;int nCmdShow; +int;ShutdownBlockReasonCreate;HWND hWnd;LPCWSTR pwszReason; +int;ShutdownBlockReasonDestroy;HWND hWnd; +int;ShutdownBlockReasonQuery;HWND hWnd;LPWSTR pwszBuff;DWORD* pcchBuff; +int;SoundSentry;; +int;SubtractRect;LPRECT lprcDst;const RECT* lprcSrc1;const RECT* lprcSrc2; +int;SwapMouseButton;BOOL fSwap; +int;SwitchDesktop;HDESK hDesktop; +int;SwitchToThisWindow;HWND hWnd;BOOL fAltTab; +int;SystemParametersInfo;long uiAction;UINT uiParam;PVOID pvParam;long fWinIni; +int;SystemParametersInfoA;long uiAction;UINT uiParam;PVOID pvParam;long fWinIni; +int;SystemParametersInfoW;long uiAction;UINT uiParam;PVOID pvParam;long fWinIni; +int;TabbedTextOut;HDC hDC;int X;int Y;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions;int nTabOrigin; +int;TabbedTextOutA;HDC hDC;int X;int Y;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions;int nTabOrigin; +int;TabbedTextOutW;HDC hDC;int X;int Y;LPCTSTR lpString;int nCount;int nTabPositions;const LPINT lpnTabStopPositions;int nTabOrigin; +int;TileWindows;HWND hwndParent;UINT wHow;RECT* lpRect;UINT cKids;const HWND* lpKids; +int;ToAscii;UINT uVirtKey;UINT uScanCode;PBYTE lpKeyState;LPWORD lpChar;UINT uFlags; +int;ToAsciiEx;UINT uVirtKey;UINT uScanCode;PBYTE lpKeyState;LPWORD lpChar;UINT uFlags;HKL dwhkl; +int;ToUnicode;UINT wVirtKey;UINT wScanCode;const PBYTE lpKeyState;LPWSTR pwszBuff;int cchBuff;UINT wFlags; +int;ToUnicodeEx;UINT wVirtKey;UINT wScanCode;const PBYTE lpKeyState;LPWSTR pwszBuff;int cchBuff;UINT wFlags;HKL dwhkl; +int;TrackMouseEvent;LPTRACKMOUSEEVENT pTrackMouseEvent; +int;TrackPopupMenu;HMENU hMenu;UINT uFlags;int X;int Y;int nReserved;HWND hWnd;CONST RECT* prcRect; +int;TrackPopupMenuEx;HMENU hmenu;UINT fuFlags;int x;int Y;HWND hWnd;LPTPMPARAMS lptpm; +int;TranslateAcceleratorA;HWND hWnd;HACCEL hAccTable;LPMSG lpMsg; +int;TranslateAcceleratorW;HWND hWnd;HACCEL hAccTable;LPMSG lpMsg; +int;TranslateAccelerator;HWND hWnd;HACCEL hAccTable;LPMSG lpMsg; +int;TranslateMDISysAccel;HWND hWndClient;LPMSG lpMsg; +int;TranslateMessage;const MSG* lpMsg; +int;UnhookWinEvent;HWINEVENTHOOK hWinEventHook; +int;UnhookWindowsHookEx;HHOOK hhk; +int;UnionRect;LPRECT lprcDst;const RECT* lprcSrc1;const RECT* lprcSrc2; +int;UnloadKeyboardLayout;HKL hkl; +int;UnpackDDElParam;UINT msg;LPARAM lParam;PUINT_PTR puiLo;PUINT_PTR puiHi; +int;UnregisterClass;LPCTSTR lpClassName;HINSTANCE hInstance; +int;UnregisterClassA;DWORD lpClassName;DWORD hInstance; +int;UnregisterClassA;LPCTSTR lpClassName;HINSTANCE hInstance; +int;UnregisterClassW;LPCTSTR lpClassName;HINSTANCE hInstance; +int;UnregisterDeviceNotification;HDEVNOTIFY Handle; +int;UnregisterHotKey;HWND hWnd;int id; +int;UnregisterPowerSettingNotification;HPOWERNOTIFY Handle; +int;UnregisterTouchWindow;HWND hWnd; +int;UpdateLayeredWindow;HWND hwnd;HDC hdcDst;POINT* pptDst;SIZE* psize;HDC hdcSrc;POINT* pptSrc;COLORREF crKey;BLENDFUNCTION* pblend;DWORD dwFlags; +int;UpdateLayeredWindowIndirect;HWND hwnd;const UPDATELAYEREDWINDOWINFO* pULWInfo; +int;UpdateWindow;HWND hWnd; +int;UserHandleGrantAccess;HANDLE hUserHandle;HANDLE hJob;BOOL bGrant; +int;ValidateRect;HWND hWnd;const RECT* lpRect; +int;ValidateRgn;HWND hWnd;HRGN hRgn; +int;VkKeyScan;TCHAR ch; +int;VkKeyScanA;TCHAR ch; +int;VkKeyScanEx;TCHAR ch;HKL dwhkl; +int;VkKeyScanW;TCHAR ch; +int;WaitForInputIdle;HANDLE hProcess;DWORD dwMilliseconds; +int;WaitMessage;; +int;WinHelp;HWND hWndMain;LPCTSTR lpszHelp;UINT uCommand;ULONG_PTR dwData; +int;WinHelpA;HWND hWndMain;LPCTSTR lpszHelp;UINT uCommand;ULONG_PTR wData; +int;WinHelpW;HWND hWndMain;LPCTSTR lpszHelp;UINT uCommand;ULONG_PTR wData; +int;WindowFromDC;HDC hDC; +int;WindowFromPhysicalPoint;POINT Point; +int;WindowFromPoint;POINT Point; +int;keybd_event;BYTE bVk;BYTE bScan;DWORD dwFlags;ULONG_PTR dwExtraInfo; +int;mouse_event;DWORD dwFlags;DWORD dx;DWORD dy;DWORD dwData;ULONG_PTR dwExtraInfo; +int;toascii;DWORD char; \ No newline at end of file From cfb78d8beb615d0cb3dd3bbd5524a410604cc2ee Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 10 Jun 2014 15:56:42 +0200 Subject: [PATCH 058/676] formatted the whole project (AStyle) --- .../DeviceNameResolver/DeviceNameResolver.h | 44 +- x64_dbg_dbg/disasm_fast.cpp | 166 +++--- x64_dbg_dbg/disasm_fast.h | 18 +- x64_dbg_dbg/reference.cpp | 158 ++--- x64_dbg_dbg/reference.h | 40 +- x64_dbg_dbg/simplescript.cpp | 4 +- x64_dbg_dbg/test/general/dll/main.h | 4 +- x64_dbg_dbg/undocumented.h | 310 +++++----- .../Src/BasicView/AbstractTableView.cpp | 18 +- .../Project/Src/BasicView/CommandHelpView.cpp | 266 ++++----- .../Project/Src/BasicView/CommandHelpView.h | 83 +-- .../Project/Src/BasicView/Disassembly.cpp | 4 +- .../Project/Src/BasicView/HistoryLineEdit.cpp | 102 ++-- .../Project/Src/BasicView/HistoryLineEdit.h | 58 +- .../Project/Src/BasicView/LineEditDialog.h | 3 +- .../Project/Src/BasicView/MemoryMapView.cpp | 46 +- .../Project/Src/BasicView/RegistersView.cpp | 6 +- .../Project/Src/BasicView/RegistersView.h | 10 +- .../Project/Src/BasicView/RichTextPainter.cpp | 88 +-- .../Project/Src/BasicView/RichTextPainter.h | 62 +- .../Project/Src/BasicView/ScriptView.cpp | 8 +- .../Project/Src/BasicView/SearchListView.h | 5 +- .../Project/Src/BasicView/SymbolView.h | 3 +- .../Project/Src/BasicView/ThreadView.cpp | 420 +++++++------- .../Project/Src/BasicView/ThreadView.h | 42 +- .../Project/Src/BasicView/WordEditDialog.h | 7 +- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 12 +- x64_dbg_gui/Project/Src/Exports.h | 4 +- .../Project/Src/Gui/CPUDisassembly.cpp | 12 +- x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp | 543 +++++++++--------- x64_dbg_gui/Project/Src/Gui/CPUJumps.h | 88 +-- x64_dbg_gui/Project/Src/Gui/CPUWidget.h | 5 +- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 139 ++--- x64_dbg_gui/Project/Src/Gui/Configuration.h | 59 +- .../Project/Src/Gui/ExceptionRangeDialog.cpp | 166 +++--- .../Project/Src/Gui/ExceptionRangeDialog.h | 61 +- x64_dbg_gui/Project/Src/Gui/GotoDialog.h | 3 +- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 14 +- x64_dbg_gui/Project/Src/Gui/MainWindow.h | 7 +- x64_dbg_gui/Project/Src/Gui/SettingsDialog.h | 5 +- x64_dbg_gui/Project/Src/Gui/TabBar.cpp | 328 +++++------ x64_dbg_gui/Project/Src/Gui/TabBar.h | 100 ++-- x64_dbg_gui/Project/Src/Gui/TabWidget.cpp | 382 ++++++------ x64_dbg_gui/Project/Src/Gui/TabWidget.h | 158 ++--- .../Project/Src/Memory/MapViewOfMem.cpp | 4 +- x64_dbg_gui/Project/Src/Memory/MapViewOfMem.h | 54 +- .../Project/Src/Memory/ProcessMemoryMap.cpp | 98 ++-- .../Project/Src/Utils/ApiFingerprints.cpp | 231 ++++---- .../Project/Src/Utils/ApiFingerprints.h | 58 +- x64_dbg_gui/Project/Src/Utils/Breakpoints.cpp | 98 ++-- 50 files changed, 2329 insertions(+), 2275 deletions(-) diff --git a/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h b/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h index 70e584ae..dc14d04d 100644 --- a/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h +++ b/x64_dbg_dbg/DeviceNameResolver/DeviceNameResolver.h @@ -1,22 +1,22 @@ -#ifndef _DEVICENAMERESOLVER_H -#define _DEVICENAMERESOLVER_H - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -__declspec(dllexport) bool DevicePathToPathW(const wchar_t* szDevicePath, wchar_t* szPath, size_t nSize); -__declspec(dllexport) bool DevicePathToPathA(const char* szDevicePath, char* szPath, size_t nSize); -__declspec(dllexport) bool DevicePathFromFileHandleW(HANDLE hFile, wchar_t* szDevicePath, size_t nSize); -__declspec(dllexport) bool DevicePathFromFileHandleA(HANDLE hFile, char* szDevicePath, size_t nSize); -__declspec(dllexport) bool PathFromFileHandleW(HANDLE hFile, wchar_t* szPath, size_t nSize); -__declspec(dllexport) bool PathFromFileHandleA(HANDLE hFile, char* szPath, size_t nSize); - -#ifdef __cplusplus -} -#endif - -#endif // _DEVICENAMERESOLVER_H +#ifndef _DEVICENAMERESOLVER_H +#define _DEVICENAMERESOLVER_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +__declspec(dllexport) bool DevicePathToPathW(const wchar_t* szDevicePath, wchar_t* szPath, size_t nSize); +__declspec(dllexport) bool DevicePathToPathA(const char* szDevicePath, char* szPath, size_t nSize); +__declspec(dllexport) bool DevicePathFromFileHandleW(HANDLE hFile, wchar_t* szDevicePath, size_t nSize); +__declspec(dllexport) bool DevicePathFromFileHandleA(HANDLE hFile, char* szDevicePath, size_t nSize); +__declspec(dllexport) bool PathFromFileHandleW(HANDLE hFile, wchar_t* szPath, size_t nSize); +__declspec(dllexport) bool PathFromFileHandleA(HANDLE hFile, char* szPath, size_t nSize); + +#ifdef __cplusplus +} +#endif + +#endif // _DEVICENAMERESOLVER_H diff --git a/x64_dbg_dbg/disasm_fast.cpp b/x64_dbg_dbg/disasm_fast.cpp index 601759a3..c1779fdb 100644 --- a/x64_dbg_dbg/disasm_fast.cpp +++ b/x64_dbg_dbg/disasm_fast.cpp @@ -1,83 +1,83 @@ -#include "disasm_fast.h" - -static MEMORY_SIZE argsize2memsize(int argsize) -{ - switch(argsize) - { - case 8: - return size_byte; - case 16: - return size_word; - case 32: - return size_dword; - case 64: - return size_qword; - } - return size_byte; -} - -void fillbasicinfo(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo) -{ - //zero basicinfo - memset(basicinfo, 0, sizeof(BASIC_INSTRUCTION_INFO)); - //find immidiat - if(disasm->Instruction.BranchType==0) //no branch - { - if((disasm->Argument1.ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) - { - basicinfo->type|=TYPE_VALUE; - basicinfo->value.value=(ULONG_PTR)disasm->Instruction.Immediat; - basicinfo->value.size=argsize2memsize(disasm->Argument1.ArgSize); - } - else if((disasm->Argument2.ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) - { - basicinfo->type|=TYPE_VALUE; - basicinfo->value.value=(ULONG_PTR)disasm->Instruction.Immediat; - basicinfo->value.size=argsize2memsize(disasm->Argument2.ArgSize); - } - } - else //branch - basicinfo->branch=true; - //find memory displacement - if((disasm->Argument1.ArgType&MEMORY_TYPE)==MEMORY_TYPE || (disasm->Argument2.ArgType&MEMORY_TYPE)==MEMORY_TYPE) - { - if(disasm->Argument1.Memory.Displacement) - { - basicinfo->type|=TYPE_MEMORY; - basicinfo->memory.value=(ULONG_PTR)disasm->Argument1.Memory.Displacement; - strcpy(basicinfo->memory.mnemonic, disasm->Argument1.ArgMnemonic); - basicinfo->memory.size=argsize2memsize(disasm->Argument1.ArgSize); - } - else if(disasm->Argument2.Memory.Displacement) - { - basicinfo->type|=TYPE_MEMORY; - basicinfo->memory.value=(ULONG_PTR)disasm->Argument2.Memory.Displacement; - strcpy(basicinfo->memory.mnemonic, disasm->Argument2.ArgMnemonic); - basicinfo->memory.size=argsize2memsize(disasm->Argument2.ArgSize); - } - } - //find address value - if(disasm->Instruction.BranchType && disasm->Instruction.AddrValue) - { - basicinfo->type|=TYPE_ADDR; - basicinfo->addr=(ULONG_PTR)disasm->Instruction.AddrValue; - } - //rip-relative (non-branch) - if(disasm->Instruction.BranchType==0) - { - if((disasm->Argument1.ArgType&RELATIVE_)==RELATIVE_) - { - basicinfo->type|=TYPE_MEMORY; - basicinfo->memory.value=(ULONG_PTR)disasm->Instruction.AddrValue; - strcpy(basicinfo->memory.mnemonic, disasm->Argument1.ArgMnemonic); - basicinfo->memory.size=argsize2memsize(disasm->Argument1.ArgSize); - } - else if((disasm->Argument2.ArgType&RELATIVE_)==RELATIVE_) - { - basicinfo->type|=TYPE_MEMORY; - basicinfo->memory.value=(ULONG_PTR)disasm->Instruction.AddrValue; - strcpy(basicinfo->memory.mnemonic, disasm->Argument2.ArgMnemonic); - basicinfo->memory.size=argsize2memsize(disasm->Argument2.ArgSize); - } - } -} \ No newline at end of file +#include "disasm_fast.h" + +static MEMORY_SIZE argsize2memsize(int argsize) +{ + switch(argsize) + { + case 8: + return size_byte; + case 16: + return size_word; + case 32: + return size_dword; + case 64: + return size_qword; + } + return size_byte; +} + +void fillbasicinfo(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo) +{ + //zero basicinfo + memset(basicinfo, 0, sizeof(BASIC_INSTRUCTION_INFO)); + //find immidiat + if(disasm->Instruction.BranchType==0) //no branch + { + if((disasm->Argument1.ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) + { + basicinfo->type|=TYPE_VALUE; + basicinfo->value.value=(ULONG_PTR)disasm->Instruction.Immediat; + basicinfo->value.size=argsize2memsize(disasm->Argument1.ArgSize); + } + else if((disasm->Argument2.ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) + { + basicinfo->type|=TYPE_VALUE; + basicinfo->value.value=(ULONG_PTR)disasm->Instruction.Immediat; + basicinfo->value.size=argsize2memsize(disasm->Argument2.ArgSize); + } + } + else //branch + basicinfo->branch=true; + //find memory displacement + if((disasm->Argument1.ArgType&MEMORY_TYPE)==MEMORY_TYPE || (disasm->Argument2.ArgType&MEMORY_TYPE)==MEMORY_TYPE) + { + if(disasm->Argument1.Memory.Displacement) + { + basicinfo->type|=TYPE_MEMORY; + basicinfo->memory.value=(ULONG_PTR)disasm->Argument1.Memory.Displacement; + strcpy(basicinfo->memory.mnemonic, disasm->Argument1.ArgMnemonic); + basicinfo->memory.size=argsize2memsize(disasm->Argument1.ArgSize); + } + else if(disasm->Argument2.Memory.Displacement) + { + basicinfo->type|=TYPE_MEMORY; + basicinfo->memory.value=(ULONG_PTR)disasm->Argument2.Memory.Displacement; + strcpy(basicinfo->memory.mnemonic, disasm->Argument2.ArgMnemonic); + basicinfo->memory.size=argsize2memsize(disasm->Argument2.ArgSize); + } + } + //find address value + if(disasm->Instruction.BranchType && disasm->Instruction.AddrValue) + { + basicinfo->type|=TYPE_ADDR; + basicinfo->addr=(ULONG_PTR)disasm->Instruction.AddrValue; + } + //rip-relative (non-branch) + if(disasm->Instruction.BranchType==0) + { + if((disasm->Argument1.ArgType&RELATIVE_)==RELATIVE_) + { + basicinfo->type|=TYPE_MEMORY; + basicinfo->memory.value=(ULONG_PTR)disasm->Instruction.AddrValue; + strcpy(basicinfo->memory.mnemonic, disasm->Argument1.ArgMnemonic); + basicinfo->memory.size=argsize2memsize(disasm->Argument1.ArgSize); + } + else if((disasm->Argument2.ArgType&RELATIVE_)==RELATIVE_) + { + basicinfo->type|=TYPE_MEMORY; + basicinfo->memory.value=(ULONG_PTR)disasm->Instruction.AddrValue; + strcpy(basicinfo->memory.mnemonic, disasm->Argument2.ArgMnemonic); + basicinfo->memory.size=argsize2memsize(disasm->Argument2.ArgSize); + } + } +} diff --git a/x64_dbg_dbg/disasm_fast.h b/x64_dbg_dbg/disasm_fast.h index fa60eb49..44b0410e 100644 --- a/x64_dbg_dbg/disasm_fast.h +++ b/x64_dbg_dbg/disasm_fast.h @@ -1,9 +1,9 @@ -#ifndef _DISASM_FAST_H -#define _DISASM_FAST_H - -#include "_global.h" -#include "BeaEngine\BeaEngine.h" - -void fillbasicinfo(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo); - -#endif //_DISASM_FAST_H \ No newline at end of file +#ifndef _DISASM_FAST_H +#define _DISASM_FAST_H + +#include "_global.h" +#include "BeaEngine\BeaEngine.h" + +void fillbasicinfo(DISASM* disasm, BASIC_INSTRUCTION_INFO* basicinfo); + +#endif //_DISASM_FAST_H diff --git a/x64_dbg_dbg/reference.cpp b/x64_dbg_dbg/reference.cpp index f278a7de..759974d3 100644 --- a/x64_dbg_dbg/reference.cpp +++ b/x64_dbg_dbg/reference.cpp @@ -1,79 +1,79 @@ -#include "reference.h" -#include "debugger.h" -#include "memory.h" -#include "console.h" - -int reffind(uint addr, uint size, CBREF cbRef, void* userinfo, bool silent) -{ - uint start_addr; - uint start_size; - uint base; - uint base_size; - base=memfindbaseaddr(fdProcessInfo->hProcess, addr, &base_size); - if(!base or !base_size) - { - if(!silent) - dputs("invalid memory page"); - return 0; - } - - if(!size) //assume the whole page - { - start_addr=base; - start_size=base_size; - } - else //custom boundaries - { - start_addr=addr; - uint maxsize=size-(start_addr-base); - if(sizehProcess, (const void*)start_addr, data, start_size, 0)) - { - if(!silent) - dputs("error reading memory"); - efree(data, "reffind:data"); - return 0; - } - DISASM disasm; - memset(&disasm, 0, sizeof(disasm)); -#ifdef _WIN64 - disasm.Archi=64; -#endif // _WIN64 - disasm.EIP=(UIntPtr)data; - disasm.VirtualAddr=(UInt64)start_addr; - uint i=0; - BASIC_INSTRUCTION_INFO basicinfo; - cbRef(&disasm, &basicinfo, 0); //allow initializing - REFINFO refinfo; - memset(&refinfo, 0, sizeof(REFINFO)); - refinfo.userinfo=userinfo; - while(ihProcess, addr, &base_size); + if(!base or !base_size) + { + if(!silent) + dputs("invalid memory page"); + return 0; + } + + if(!size) //assume the whole page + { + start_addr=base; + start_size=base_size; + } + else //custom boundaries + { + start_addr=addr; + uint maxsize=size-(start_addr-base); + if(sizehProcess, (const void*)start_addr, data, start_size, 0)) + { + if(!silent) + dputs("error reading memory"); + efree(data, "reffind:data"); + return 0; + } + DISASM disasm; + memset(&disasm, 0, sizeof(disasm)); +#ifdef _WIN64 + disasm.Archi=64; +#endif // _WIN64 + disasm.EIP=(UIntPtr)data; + disasm.VirtualAddr=(UInt64)start_addr; + uint i=0; + BASIC_INSTRUCTION_INFO basicinfo; + cbRef(&disasm, &basicinfo, 0); //allow initializing + REFINFO refinfo; + memset(&refinfo, 0, sizeof(REFINFO)); + refinfo.userinfo=userinfo; + while(i - -//Thanks to: https://github.com/zer0fl4g/Nanomite - -typedef LONG NTSTATUS; - -typedef struct _UNICODE_STRING -{ - USHORT Length; - USHORT MaximumLength; - PWSTR Buffer; -} UNICODE_STRING; - -typedef struct _CLIENT_ID -{ - HANDLE UniqueProcess; - HANDLE UniqueThread; -} CLIENT_ID; - -typedef struct _PEB -{ - BYTE InheritedAddressSpace; - BYTE ReadImageFileExecOptions; - BYTE BeingDebugged; - BYTE SpareBool; - DWORD Mutant; - DWORD ImageBaseAddress; - DWORD LoaderData; - DWORD ProcessParameters; - DWORD SubSystemData; - DWORD ProcessHeap; - DWORD FastPebLock; - DWORD FastPebLockRoutine; - DWORD FastPebUnlockRoutine; - DWORD EnviromentUpdateCount; - DWORD KernelCallbackTable; - DWORD UserSharedInfoPtr; - DWORD ThunksOrOptions; - DWORD FreeList; - DWORD TlsExpansionCounter; - DWORD TlsBitmap; - DWORD TlsBitmapBits[2]; - DWORD ReadOnlySharedMemoryBase; - DWORD ReadOnlySharedMemoryHeap; - DWORD ReadOnlyStaticServerData; - DWORD AnsiCodePageData; - DWORD OemCodePageData; - DWORD UnicodeCaseTableData; - DWORD NumberOfProcessors; - DWORD NtGlobalFlag; - DWORD Reserved; - LARGE_INTEGER CriticalSectionTimeout; - DWORD HeapSegmentReserve; - DWORD HeapSegmentCommit; - DWORD HeapDeCommitTotalFreeThreshold; - DWORD HeapDeCommitFreeBlockThreshold; - DWORD NumberOfHeaps; - DWORD MaximumNumberOfHeaps; - DWORD ProcessHeaps; - DWORD GdiSharedHandleTable; - DWORD ProcessStarterHelper; - DWORD GdiDCAttributeList; - DWORD LoaderLock; - DWORD OSMajorVersion; - DWORD OSMinorVersion; - WORD OSBuildNumber; - WORD OSCSDVersion; - DWORD OSPlatformId; - DWORD ImageSubsystem; - DWORD ImageSubsystemMajorVersion; - DWORD ImageSubsystemMinorVersion; - DWORD ImageProcessAffinityMask; - DWORD GdiHandleBuffer[34]; - DWORD PostProcessInitRoutine; - DWORD TlsExpansionBitmap; - DWORD TlsExpansionBitmapBits[32]; - DWORD SessionId; - ULARGE_INTEGER AppCompatFlags; - ULARGE_INTEGER AppCompatFlagsUser; - DWORD pShimData; - DWORD AppCompatInfo; - UNICODE_STRING CSDVersion; - DWORD ActivationContextData; - DWORD ProcessAssemblyStorageMap; - DWORD SystemDefaultActivationContextData; - DWORD SystemAssemblyStorageMap; - DWORD MinimumStackCommit; - DWORD FlsCallback; - DWORD FlsListHead_Flink; - DWORD FlsListHead_Blink; - DWORD FlsBitmap; - DWORD FlsBitmapBits[4]; - DWORD FlsHighIndex; -} PEB, *PPEB; - -typedef struct _TEB -{ - NT_TIB Tib; - PVOID EnvironmentPointer; - CLIENT_ID Cid; - PVOID ActiveRpcInfo; - PVOID ThreadLocalStoragePointer; - PPEB Peb; - ULONG LastErrorValue; - ULONG CountOfOwnedCriticalSections; - PVOID CsrClientThread; - PVOID Win32ThreadInfo; - ULONG Win32ClientInfo[0x1F]; - PVOID WOW32Reserved; - ULONG CurrentLocale; - ULONG FpSoftwareStatusRegister; - PVOID SystemReserved1[0x36]; - PVOID Spare1; - ULONG ExceptionCode; - ULONG SpareBytes1[0x28]; - PVOID SystemReserved2[0xA]; - ULONG GdiRgn; - ULONG GdiPen; - ULONG GdiBrush; - CLIENT_ID RealClientId; - PVOID GdiCachedProcessHandle; - ULONG GdiClientPID; - ULONG GdiClientTID; - PVOID GdiThreadLocaleInfo; - PVOID UserReserved[5]; - PVOID GlDispatchTable[0x118]; - ULONG GlReserved1[0x1A]; - PVOID GlReserved2; - PVOID GlSectionInfo; - PVOID GlSection; - PVOID GlTable; - PVOID GlCurrentRC; - PVOID GlContext; - NTSTATUS LastStatusValue; - UNICODE_STRING StaticUnicodeString; - WCHAR StaticUnicodeBuffer[0x105]; - PVOID DeallocationStack; - PVOID TlsSlots[0x40]; - LIST_ENTRY TlsLinks; - PVOID Vdm; - PVOID ReservedForNtRpc; - PVOID DbgSsReserved[0x2]; - ULONG HardErrorDisabled; - PVOID Instrumentation[0x10]; - PVOID WinSockData; - ULONG GdiBatchCount; - ULONG Spare2; - ULONG Spare3; - ULONG Spare4; - PVOID ReservedForOle; - ULONG WaitingOnLoaderLock; - PVOID StackCommit; - PVOID StackCommitMax; - PVOID StackReserved; -} TEB, *PTEB; +#include + +//Thanks to: https://github.com/zer0fl4g/Nanomite + +typedef LONG NTSTATUS; + +typedef struct _UNICODE_STRING +{ + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING; + +typedef struct _CLIENT_ID +{ + HANDLE UniqueProcess; + HANDLE UniqueThread; +} CLIENT_ID; + +typedef struct _PEB +{ + BYTE InheritedAddressSpace; + BYTE ReadImageFileExecOptions; + BYTE BeingDebugged; + BYTE SpareBool; + DWORD Mutant; + DWORD ImageBaseAddress; + DWORD LoaderData; + DWORD ProcessParameters; + DWORD SubSystemData; + DWORD ProcessHeap; + DWORD FastPebLock; + DWORD FastPebLockRoutine; + DWORD FastPebUnlockRoutine; + DWORD EnviromentUpdateCount; + DWORD KernelCallbackTable; + DWORD UserSharedInfoPtr; + DWORD ThunksOrOptions; + DWORD FreeList; + DWORD TlsExpansionCounter; + DWORD TlsBitmap; + DWORD TlsBitmapBits[2]; + DWORD ReadOnlySharedMemoryBase; + DWORD ReadOnlySharedMemoryHeap; + DWORD ReadOnlyStaticServerData; + DWORD AnsiCodePageData; + DWORD OemCodePageData; + DWORD UnicodeCaseTableData; + DWORD NumberOfProcessors; + DWORD NtGlobalFlag; + DWORD Reserved; + LARGE_INTEGER CriticalSectionTimeout; + DWORD HeapSegmentReserve; + DWORD HeapSegmentCommit; + DWORD HeapDeCommitTotalFreeThreshold; + DWORD HeapDeCommitFreeBlockThreshold; + DWORD NumberOfHeaps; + DWORD MaximumNumberOfHeaps; + DWORD ProcessHeaps; + DWORD GdiSharedHandleTable; + DWORD ProcessStarterHelper; + DWORD GdiDCAttributeList; + DWORD LoaderLock; + DWORD OSMajorVersion; + DWORD OSMinorVersion; + WORD OSBuildNumber; + WORD OSCSDVersion; + DWORD OSPlatformId; + DWORD ImageSubsystem; + DWORD ImageSubsystemMajorVersion; + DWORD ImageSubsystemMinorVersion; + DWORD ImageProcessAffinityMask; + DWORD GdiHandleBuffer[34]; + DWORD PostProcessInitRoutine; + DWORD TlsExpansionBitmap; + DWORD TlsExpansionBitmapBits[32]; + DWORD SessionId; + ULARGE_INTEGER AppCompatFlags; + ULARGE_INTEGER AppCompatFlagsUser; + DWORD pShimData; + DWORD AppCompatInfo; + UNICODE_STRING CSDVersion; + DWORD ActivationContextData; + DWORD ProcessAssemblyStorageMap; + DWORD SystemDefaultActivationContextData; + DWORD SystemAssemblyStorageMap; + DWORD MinimumStackCommit; + DWORD FlsCallback; + DWORD FlsListHead_Flink; + DWORD FlsListHead_Blink; + DWORD FlsBitmap; + DWORD FlsBitmapBits[4]; + DWORD FlsHighIndex; +} PEB, *PPEB; + +typedef struct _TEB +{ + NT_TIB Tib; + PVOID EnvironmentPointer; + CLIENT_ID Cid; + PVOID ActiveRpcInfo; + PVOID ThreadLocalStoragePointer; + PPEB Peb; + ULONG LastErrorValue; + ULONG CountOfOwnedCriticalSections; + PVOID CsrClientThread; + PVOID Win32ThreadInfo; + ULONG Win32ClientInfo[0x1F]; + PVOID WOW32Reserved; + ULONG CurrentLocale; + ULONG FpSoftwareStatusRegister; + PVOID SystemReserved1[0x36]; + PVOID Spare1; + ULONG ExceptionCode; + ULONG SpareBytes1[0x28]; + PVOID SystemReserved2[0xA]; + ULONG GdiRgn; + ULONG GdiPen; + ULONG GdiBrush; + CLIENT_ID RealClientId; + PVOID GdiCachedProcessHandle; + ULONG GdiClientPID; + ULONG GdiClientTID; + PVOID GdiThreadLocaleInfo; + PVOID UserReserved[5]; + PVOID GlDispatchTable[0x118]; + ULONG GlReserved1[0x1A]; + PVOID GlReserved2; + PVOID GlSectionInfo; + PVOID GlSection; + PVOID GlTable; + PVOID GlCurrentRC; + PVOID GlContext; + NTSTATUS LastStatusValue; + UNICODE_STRING StaticUnicodeString; + WCHAR StaticUnicodeBuffer[0x105]; + PVOID DeallocationStack; + PVOID TlsSlots[0x40]; + LIST_ENTRY TlsLinks; + PVOID Vdm; + PVOID ReservedForNtRpc; + PVOID DbgSsReserved[0x2]; + ULONG HardErrorDisabled; + PVOID Instrumentation[0x10]; + PVOID WinSockData; + ULONG GdiBatchCount; + ULONG Spare2; + ULONG Spare3; + ULONG Spare4; + PVOID ReservedForOle; + ULONG WaitingOnLoaderLock; + PVOID StackCommit; + PVOID StackCommitMax; + PVOID StackReserved; +} TEB, *PTEB; diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index c4724fc8..da3110bc 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -129,7 +129,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) y = getHeaderHeight(); x += getColumnWidth(j); } - emit repainted(); + emit repainted(); } @@ -258,7 +258,7 @@ void AbstractTableView::mouseMoveEvent(QMouseEvent* event) repaint(); } default: - break; + break; } } @@ -458,19 +458,19 @@ void AbstractTableView::vertSliderActionSlot(int action) switch(action) { case QAbstractSlider::SliderNoAction: - break; + break; case QAbstractSlider::SliderSingleStepAdd: wDelta = 1; - break; + break; case QAbstractSlider::SliderSingleStepSub: wDelta = -1; - break; + break; case QAbstractSlider::SliderPageStepAdd: wDelta = 30; - break; + break; case QAbstractSlider::SliderPageStepSub: wDelta = -30; - break; + break; case QAbstractSlider::SliderToMinimum: case QAbstractSlider::SliderToMaximum: case QAbstractSlider::SliderMove: @@ -479,9 +479,9 @@ void AbstractTableView::vertSliderActionSlot(int action) #else wDelta = wSliderPos - mTableOffset; #endif - break; + break; default: - break; + break; } // Call the hook (Usefull for disassembly) diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp index 7d770644..083bfd7f 100644 --- a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.cpp @@ -1,133 +1,133 @@ -#include "CommandHelpView.h" -#include "ui_CommandHelpView.h" - -CommandHelpView::CommandHelpView(QWidget *parent) : - QWidget(parent), - ui(new Ui::CommandHelpView) -{ - ui->setupUi(this); - - // Set main layout - mMainLayout = new QVBoxLayout; - mMainLayout->setContentsMargins(0, 0, 0, 0); - mMainLayout->addWidget(ui->mainSplitter); - setLayout(mMainLayout); - - // Create reference view - mSearchListView = new SearchListView(); - mSearchListView->mSearchStartCol = 1; - - // Get font information - QFont wFont("Monospace", 8); - wFont.setStyleHint(QFont::Monospace); - wFont.setFixedPitch(true); - //int charwidth=QFontMetrics(wFont).width(QChar(' ')); - - // Create module list - mModuleList = new StdTable(); - mModuleList->addColumnAt(0, "Module", false); - - // Setup symbol list - mSearchListView->mList->addColumnAt(0, "Command", true); - - // Setup search list - mSearchListView->mSearchList->addColumnAt(0, "Command", true); - - // Setup list splitter - ui->listSplitter->addWidget(mModuleList); - ui->listSplitter->addWidget(mSearchListView); -#ifdef _WIN64 - // mModuleList : mSymbolList = 40 : 100 - ui->listSplitter->setStretchFactor(0, 40); - ui->listSplitter->setStretchFactor(1, 100); -#else - // mModuleList : mSymbolList = 30 : 100 - ui->listSplitter->setStretchFactor(0, 30); - ui->listSplitter->setStretchFactor(1, 100); -#endif //_WIN64 - - // Setup log edit - ui->symbolLogEdit->setFont(wFont); - ui->symbolLogEdit->setStyleSheet("QTextEdit { background-color: rgb(255, 251, 240) }"); - ui->symbolLogEdit->setUndoRedoEnabled(false); - ui->symbolLogEdit->setReadOnly(true); - // Log : List = 2 : 9 - ui->mainSplitter->setStretchFactor(1, 9); - ui->mainSplitter->setStretchFactor(0, 1); - - connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int))); - connect(mSearchListView->mList, SIGNAL(selectionChangedSignal(int)), this, SLOT(symbolSelectionChanged(int))); - - //fill with example data - mModuleList->setRowCount(2); - mModuleList->setCellContent(0, 0, "x64_dbg"); - mModuleList->setCellContent(1, 0, "testplugin"); - - mModuleList->setSingleSelection(0); -} - -CommandHelpView::~CommandHelpView() -{ - delete ui; -} - -void CommandHelpView::moduleSelectionChanged(int index) -{ - mSearchListView->mList->setRowCount(0); - - if(index==0) //x64_dbg - { - mCurrentMode=0; - mSearchListView->mList->setRowCount(3); - mSearchListView->mList->setCellContent(0, 0, "InitDebug"); - mSearchListView->mList->setCellContent(1, 0, "StopDebug"); - mSearchListView->mList->setCellContent(2, 0, "run"); - } - else if(index==1) //testplugin - { - mCurrentMode=1; - mSearchListView->mList->setRowCount(2); - mSearchListView->mList->setCellContent(0, 0, "plugin1"); - mSearchListView->mList->setCellContent(1, 0, "grs"); - } - - mSearchListView->mList->reloadData(); - mSearchListView->mList->setSingleSelection(0); - mSearchListView->mList->setTableOffset(0); - mSearchListView->mList->setFocus(); - mSearchListView->mSearchBox->setText(""); -} - -void CommandHelpView::symbolSelectionChanged(int index) -{ - QString info=""; - if(mCurrentMode==0) //x64_dbg - { - switch(index) - { - case 0: //InitDebug - info="Initialize debugging a file.\n\nExample:\nInitDebug \"C:\\test.exe\", commandline, \"C:\\homeDir\""; - break; - case 1: //StopDebug - info="Stop debugging (terminate the target).\n\nExample:\nStopDebug"; - break; - case 2: //run - info="Resume debugging.\n\nExample:\nrun"; - break; - } - } - else if(mCurrentMode==1) //testplugin - { - switch(index) - { - case 0: //plugin1 - info="Just a simple plugin test command.\n\nExample:\nplugin1"; - break; - case 1: //grs - info="Get relocation table size.\n\nExample:\ngrs 404000"; - break; - } - - } - ui->symbolLogEdit->setText(info); -} +#include "CommandHelpView.h" +#include "ui_CommandHelpView.h" + +CommandHelpView::CommandHelpView(QWidget *parent) : + QWidget(parent), + ui(new Ui::CommandHelpView) +{ + ui->setupUi(this); + + // Set main layout + mMainLayout = new QVBoxLayout; + mMainLayout->setContentsMargins(0, 0, 0, 0); + mMainLayout->addWidget(ui->mainSplitter); + setLayout(mMainLayout); + + // Create reference view + mSearchListView = new SearchListView(); + mSearchListView->mSearchStartCol = 1; + + // Get font information + QFont wFont("Monospace", 8); + wFont.setStyleHint(QFont::Monospace); + wFont.setFixedPitch(true); + //int charwidth=QFontMetrics(wFont).width(QChar(' ')); + + // Create module list + mModuleList = new StdTable(); + mModuleList->addColumnAt(0, "Module", false); + + // Setup symbol list + mSearchListView->mList->addColumnAt(0, "Command", true); + + // Setup search list + mSearchListView->mSearchList->addColumnAt(0, "Command", true); + + // Setup list splitter + ui->listSplitter->addWidget(mModuleList); + ui->listSplitter->addWidget(mSearchListView); +#ifdef _WIN64 + // mModuleList : mSymbolList = 40 : 100 + ui->listSplitter->setStretchFactor(0, 40); + ui->listSplitter->setStretchFactor(1, 100); +#else + // mModuleList : mSymbolList = 30 : 100 + ui->listSplitter->setStretchFactor(0, 30); + ui->listSplitter->setStretchFactor(1, 100); +#endif //_WIN64 + + // Setup log edit + ui->symbolLogEdit->setFont(wFont); + ui->symbolLogEdit->setStyleSheet("QTextEdit { background-color: rgb(255, 251, 240) }"); + ui->symbolLogEdit->setUndoRedoEnabled(false); + ui->symbolLogEdit->setReadOnly(true); + // Log : List = 2 : 9 + ui->mainSplitter->setStretchFactor(1, 9); + ui->mainSplitter->setStretchFactor(0, 1); + + connect(mModuleList, SIGNAL(selectionChangedSignal(int)), this, SLOT(moduleSelectionChanged(int))); + connect(mSearchListView->mList, SIGNAL(selectionChangedSignal(int)), this, SLOT(symbolSelectionChanged(int))); + + //fill with example data + mModuleList->setRowCount(2); + mModuleList->setCellContent(0, 0, "x64_dbg"); + mModuleList->setCellContent(1, 0, "testplugin"); + + mModuleList->setSingleSelection(0); +} + +CommandHelpView::~CommandHelpView() +{ + delete ui; +} + +void CommandHelpView::moduleSelectionChanged(int index) +{ + mSearchListView->mList->setRowCount(0); + + if(index==0) //x64_dbg + { + mCurrentMode=0; + mSearchListView->mList->setRowCount(3); + mSearchListView->mList->setCellContent(0, 0, "InitDebug"); + mSearchListView->mList->setCellContent(1, 0, "StopDebug"); + mSearchListView->mList->setCellContent(2, 0, "run"); + } + else if(index==1) //testplugin + { + mCurrentMode=1; + mSearchListView->mList->setRowCount(2); + mSearchListView->mList->setCellContent(0, 0, "plugin1"); + mSearchListView->mList->setCellContent(1, 0, "grs"); + } + + mSearchListView->mList->reloadData(); + mSearchListView->mList->setSingleSelection(0); + mSearchListView->mList->setTableOffset(0); + mSearchListView->mList->setFocus(); + mSearchListView->mSearchBox->setText(""); +} + +void CommandHelpView::symbolSelectionChanged(int index) +{ + QString info=""; + if(mCurrentMode==0) //x64_dbg + { + switch(index) + { + case 0: //InitDebug + info="Initialize debugging a file.\n\nExample:\nInitDebug \"C:\\test.exe\", commandline, \"C:\\homeDir\""; + break; + case 1: //StopDebug + info="Stop debugging (terminate the target).\n\nExample:\nStopDebug"; + break; + case 2: //run + info="Resume debugging.\n\nExample:\nrun"; + break; + } + } + else if(mCurrentMode==1) //testplugin + { + switch(index) + { + case 0: //plugin1 + info="Just a simple plugin test command.\n\nExample:\nplugin1"; + break; + case 1: //grs + info="Get relocation table size.\n\nExample:\ngrs 404000"; + break; + } + + } + ui->symbolLogEdit->setText(info); +} diff --git a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h index 8e2a990b..0109674e 100644 --- a/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h +++ b/x64_dbg_gui/Project/Src/BasicView/CommandHelpView.h @@ -1,41 +1,42 @@ -#ifndef COMMANDHELPVIEW_H -#define COMMANDHELPVIEW_H - -#include -#include -#include -#include -#include "StdTable.h" -#include "Bridge.h" -#include "SearchListView.h" - -namespace Ui { -class CommandHelpView; -} - -class CommandHelpView : public QWidget -{ - Q_OBJECT - -public: - explicit CommandHelpView(QWidget *parent = 0); - ~CommandHelpView(); - -private slots: - void moduleSelectionChanged(int index); - void symbolSelectionChanged(int index); - -signals: - void showCpu(); - -private: - Ui::CommandHelpView *ui; - QVBoxLayout* mMainLayout; - QVBoxLayout* mSymbolLayout; - QWidget* mSymbolPlaceHolder; - SearchListView* mSearchListView; - StdTable* mModuleList; - int mCurrentMode; -}; - -#endif // COMMANDHELPVIEW_H +#ifndef COMMANDHELPVIEW_H +#define COMMANDHELPVIEW_H + +#include +#include +#include +#include +#include "StdTable.h" +#include "Bridge.h" +#include "SearchListView.h" + +namespace Ui +{ +class CommandHelpView; +} + +class CommandHelpView : public QWidget +{ + Q_OBJECT + +public: + explicit CommandHelpView(QWidget *parent = 0); + ~CommandHelpView(); + +private slots: + void moduleSelectionChanged(int index); + void symbolSelectionChanged(int index); + +signals: + void showCpu(); + +private: + Ui::CommandHelpView *ui; + QVBoxLayout* mMainLayout; + QVBoxLayout* mSymbolLayout; + QWidget* mSymbolPlaceHolder; + SearchListView* mSearchListView; + StdTable* mModuleList; + int mCurrentMode; +}; + +#endif // COMMANDHELPVIEW_H diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index c721a773..9a80a156 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -282,7 +282,9 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); painter->restore(); - }else{ + } + else + { painter->save(); painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor //painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, "QString(comment)"); diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp index b37b4384..b70562e2 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.cpp @@ -1,51 +1,51 @@ -#include "HistoryLineEdit.h" - -HistoryLineEdit::HistoryLineEdit(QWidget *parent) : QLineEdit(parent) -{ - mCmdHistory.clear(); - mCmdIndex = -1; -} - -void HistoryLineEdit::addLineToHistory(QString parLine) -{ - mCmdHistory.prepend(parLine); - - if(mCmdHistory.size() > 32) - mCmdHistory.removeLast(); - - mCmdIndex = -1; -} - -void HistoryLineEdit::keyPressEvent(QKeyEvent* event) -{ - int wKey = event->key(); - - if(wKey == Qt::Key_Up || wKey == Qt::Key_Down) - { - if(wKey == Qt::Key_Up) - mCmdIndex++; - else if(wKey == Qt::Key_Down) - mCmdIndex--; - - mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex; - mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex; - - if(mCmdIndex == -1) - { - setText(""); - } - else - { - setText(mCmdHistory.at(mCmdIndex)); - } - } - - QLineEdit::keyPressEvent(event); -} - -void HistoryLineEdit::setFocus() -{ - mCmdIndex = -1; - QLineEdit::setFocus(); -} - +#include "HistoryLineEdit.h" + +HistoryLineEdit::HistoryLineEdit(QWidget *parent) : QLineEdit(parent) +{ + mCmdHistory.clear(); + mCmdIndex = -1; +} + +void HistoryLineEdit::addLineToHistory(QString parLine) +{ + mCmdHistory.prepend(parLine); + + if(mCmdHistory.size() > 32) + mCmdHistory.removeLast(); + + mCmdIndex = -1; +} + +void HistoryLineEdit::keyPressEvent(QKeyEvent* event) +{ + int wKey = event->key(); + + if(wKey == Qt::Key_Up || wKey == Qt::Key_Down) + { + if(wKey == Qt::Key_Up) + mCmdIndex++; + else if(wKey == Qt::Key_Down) + mCmdIndex--; + + mCmdIndex = mCmdIndex < -1 ? -1 : mCmdIndex; + mCmdIndex = mCmdIndex > mCmdHistory.size() - 1 ? mCmdHistory.size() - 1 : mCmdIndex; + + if(mCmdIndex == -1) + { + setText(""); + } + else + { + setText(mCmdHistory.at(mCmdIndex)); + } + } + + QLineEdit::keyPressEvent(event); +} + +void HistoryLineEdit::setFocus() +{ + mCmdIndex = -1; + QLineEdit::setFocus(); +} + diff --git a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h index 7ef9485a..87e7926e 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h +++ b/x64_dbg_gui/Project/Src/BasicView/HistoryLineEdit.h @@ -1,29 +1,29 @@ -#ifndef HISTORYLINEEDIT_H -#define HISTORYLINEEDIT_H - -#include -#include -#include - -class HistoryLineEdit : public QLineEdit -{ - Q_OBJECT -public: - explicit HistoryLineEdit(QWidget *parent = 0); - void keyPressEvent(QKeyEvent* event); - void addLineToHistory(QString parLine); - void setFocus(); - -signals: - void keyPressed(int parKey); - -public slots: - - -private: - QList mCmdHistory; - int mCmdIndex; - -}; - -#endif // HISTORYLINEEDIT_H +#ifndef HISTORYLINEEDIT_H +#define HISTORYLINEEDIT_H + +#include +#include +#include + +class HistoryLineEdit : public QLineEdit +{ + Q_OBJECT +public: + explicit HistoryLineEdit(QWidget *parent = 0); + void keyPressEvent(QKeyEvent* event); + void addLineToHistory(QString parLine); + void setFocus(); + +signals: + void keyPressed(int parKey); + +public slots: + + +private: + QList mCmdHistory; + int mCmdIndex; + +}; + +#endif // HISTORYLINEEDIT_H diff --git a/x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h b/x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h index 8de68484..ab8ff5a3 100644 --- a/x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h +++ b/x64_dbg_gui/Project/Src/BasicView/LineEditDialog.h @@ -3,7 +3,8 @@ #include -namespace Ui { +namespace Ui +{ class LineEditDialog; } diff --git a/x64_dbg_gui/Project/Src/BasicView/MemoryMapView.cpp b/x64_dbg_gui/Project/Src/BasicView/MemoryMapView.cpp index b1c07fb4..989be809 100644 --- a/x64_dbg_gui/Project/Src/BasicView/MemoryMapView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/MemoryMapView.cpp @@ -87,35 +87,35 @@ void MemoryMapView::stateChangedSlot(DBGSTATE state) // State switch(wMbi.State) { - case MEM_FREE: - wS = QString("FREE"); - break; - case MEM_COMMIT: - wS = QString("COMM"); - break; - case MEM_RESERVE: - wS = QString("RESV"); - break; - default: - wS = QString("????"); + case MEM_FREE: + wS = QString("FREE"); + break; + case MEM_COMMIT: + wS = QString("COMM"); + break; + case MEM_RESERVE: + wS = QString("RESV"); + break; + default: + wS = QString("????"); } setCellContent(wI, 3, wS); // Type switch(wMbi.Type) { - case MEM_IMAGE: - wS = QString("IMG"); - break; - case MEM_MAPPED: - wS = QString("MAP"); - break; - case MEM_PRIVATE: - wS = QString("PRV"); - break; - default: - wS = QString("N/A"); - break; + case MEM_IMAGE: + wS = QString("IMG"); + break; + case MEM_MAPPED: + wS = QString("MAP"); + break; + case MEM_PRIVATE: + wS = QString("PRV"); + break; + default: + wS = QString("N/A"); + break; } setCellContent(wI, 3, wS); diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 4b44b1ab..fc51793f 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -205,7 +205,8 @@ void RegistersView::mouseDoubleClickEvent(QMouseEvent* event) mRegNamesList->at(mSelected) == CIP || mRegNamesList->at(mSelected) == EFLAGS) - { //double clicked general register + { + //double clicked general register displayEditDialog(); } else if(mRegNamesList->at(mSelected) == CF || @@ -217,7 +218,8 @@ void RegistersView::mouseDoubleClickEvent(QMouseEvent* event) mRegNamesList->at(mSelected) == IF || mRegNamesList->at(mSelected) == DF || mRegNamesList->at(mSelected) == OF) - { //double clicked a flag + { + //double clicked a flag setRegister(mRegNamesList->at(mSelected), mRegList->at(mSelected)->text().toInt()^1); //toggle flag (stupid way in fact) } } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index 6ac7b3d9..08210295 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -8,16 +8,18 @@ #include "WordEditDialog.h" #include "LineEditDialog.h" -namespace Ui { +namespace Ui +{ class RegistersView; } class RegistersView : public QWidget { Q_OBJECT - + public: - enum REGISTER_NAME { + enum REGISTER_NAME + { CAX, CCX, CDX, @@ -75,7 +77,7 @@ public slots: void displayCustomContextMenuSlot(QPoint pos); void setRegister(REGISTER_NAME reg, uint_t value); void debugStateChangedSlot(DBGSTATE state); - + private: void displayEditDialog(); Ui::RegistersView *ui; diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp index a7b71151..d6d3750a 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp @@ -1,44 +1,44 @@ -#include "RichTextPainter.h" - -void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth) -{ - int len=richText->size(); - for(int i=0; iat(i); - int curRichTextLength=curRichText.text.length(); - int backgroundWidth=charwidth*curRichTextLength; - if(backgroundWidth+xinc>w) - backgroundWidth=w-xinc; - if(backgroundWidth<=0) //stop drawing when going outside the specified width - break; - switch(curRichText.flags) - { - case FlagNone: //defaults - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - break; - case FlagColor: //color only - painter->save(); - painter->setPen(QPen(curRichText.textColor)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - case FlagBackground: //background only - painter->save(); - if(backgroundWidth>0) - painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - case FlagAll: //color+background - painter->save(); - if(backgroundWidth>0) - painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); - painter->setPen(QPen(curRichText.textColor)); - painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); - painter->restore(); - break; - } - xinc+=charwidth*curRichTextLength; - } -} +#include "RichTextPainter.h" + +void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth) +{ + int len=richText->size(); + for(int i=0; iat(i); + int curRichTextLength=curRichText.text.length(); + int backgroundWidth=charwidth*curRichTextLength; + if(backgroundWidth+xinc>w) + backgroundWidth=w-xinc; + if(backgroundWidth<=0) //stop drawing when going outside the specified width + break; + switch(curRichText.flags) + { + case FlagNone: //defaults + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + break; + case FlagColor: //color only + painter->save(); + painter->setPen(QPen(curRichText.textColor)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + case FlagBackground: //background only + painter->save(); + if(backgroundWidth>0) + painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + case FlagAll: //color+background + painter->save(); + if(backgroundWidth>0) + painter->fillRect(QRect(x+xinc, y, backgroundWidth, h), QBrush(curRichText.textBackground)); + painter->setPen(QPen(curRichText.textColor)); + painter->drawText(QRect(x+xinc, y, w-xinc, h), 0, curRichText.text); + painter->restore(); + break; + } + xinc+=charwidth*curRichTextLength; + } +} diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h index a3b64137..1b32e5ff 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h +++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.h @@ -1,31 +1,31 @@ -#ifndef RICHTEXTPAINTER_H -#define RICHTEXTPAINTER_H - -#include -#include - -//structures -enum CustomRichTextFlags -{ - FlagNone, - FlagColor, - FlagBackground, - FlagAll -}; - -typedef struct _CustomRichText_t -{ - QString text; - QColor textColor; - QColor textBackground; - CustomRichTextFlags flags; -} CustomRichText_t; - -class RichTextPainter -{ -public: - //functions - static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth); -}; - -#endif // RICHTEXTPAINTER_H +#ifndef RICHTEXTPAINTER_H +#define RICHTEXTPAINTER_H + +#include +#include + +//structures +enum CustomRichTextFlags +{ + FlagNone, + FlagColor, + FlagBackground, + FlagAll +}; + +typedef struct _CustomRichText_t +{ + QString text; + QColor textColor; + QColor textBackground; + CustomRichTextFlags flags; +} CustomRichText_t; + +class RichTextPainter +{ +public: + //functions + static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth); +}; + +#endif // RICHTEXTPAINTER_H diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index b31df9eb..23d39970 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -130,7 +130,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case scriptjmp: //unconditional jumps newRichText.flags=FlagBackground; newRichText.textBackground=QColor("#FFFF00"); - break; + break; case scriptjnejnz: //conditional jumps case scriptjejz: @@ -141,16 +141,16 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset newRichText.flags=FlagAll; newRichText.textBackground=QColor("#FFFF00"); newRichText.textColor=QColor("#FF0000"); - break; + break; case scriptcall: //calls newRichText.flags=FlagBackground; newRichText.textBackground=QColor("#00FFFF"); - break; + break; default: newRichText.flags=FlagNone; - break; + break; } newRichText.text=command.left(i); richText.push_back(newRichText); diff --git a/x64_dbg_gui/Project/Src/BasicView/SearchListView.h b/x64_dbg_gui/Project/Src/BasicView/SearchListView.h index 83cde398..b28a40ea 100644 --- a/x64_dbg_gui/Project/Src/BasicView/SearchListView.h +++ b/x64_dbg_gui/Project/Src/BasicView/SearchListView.h @@ -6,8 +6,9 @@ #include #include "StdTable.h" -namespace Ui { - class SearchListView; +namespace Ui +{ +class SearchListView; } class SearchListView : public QWidget diff --git a/x64_dbg_gui/Project/Src/BasicView/SymbolView.h b/x64_dbg_gui/Project/Src/BasicView/SymbolView.h index cbbe0f12..abb33721 100644 --- a/x64_dbg_gui/Project/Src/BasicView/SymbolView.h +++ b/x64_dbg_gui/Project/Src/BasicView/SymbolView.h @@ -9,7 +9,8 @@ #include "Bridge.h" #include "SearchListView.h" -namespace Ui { +namespace Ui +{ class SymbolView; } diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp index 5aa2b421..8f64ded9 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.cpp @@ -1,210 +1,210 @@ -#include "ThreadView.h" - -ThreadView::ThreadView(StdTable *parent) : StdTable(parent) -{ - int charwidth=QFontMetrics(this->font()).width(QChar(' ')); - addColumnAt(8+charwidth*sizeof(unsigned int)*2, "Number", false); - addColumnAt(8+charwidth*sizeof(unsigned int)*2, "ID", false); - addColumnAt(8+charwidth*sizeof(uint_t)*2, "Entry", false); - addColumnAt(8+charwidth*sizeof(uint_t)*2, "TEB", false); -#ifdef _WIN64 - addColumnAt(8+charwidth*sizeof(uint_t)*2, "RIP", false); -#else - addColumnAt(8+charwidth*sizeof(uint_t)*2, "EIP", false); -#endif //_WIN64 - addColumnAt(8+charwidth*14, "Suspend Count", false); - addColumnAt(8+charwidth*12, "Priority", false); - addColumnAt(8+charwidth*16, "WaitReason", false); - addColumnAt(8+charwidth*10, "LastError", false); - addColumnAt(0, "", false); - - connect(Bridge::getBridge(), SIGNAL(updateThreads()), this, SLOT(updateThreadList())); -} - -void ThreadView::updateThreadList() -{ - THREADLIST threadList; - memset(&threadList, 0, sizeof(THREADLIST)); - DbgGetThreadList(&threadList); - setRowCount(threadList.count); - for(int i=0; isave(); - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); - painter->setPen(QPen(QColor("#FFFFFF"))); //white text - painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, ret); - painter->restore(); - ret=""; - } - return ret; -} +#include "ThreadView.h" + +ThreadView::ThreadView(StdTable *parent) : StdTable(parent) +{ + int charwidth=QFontMetrics(this->font()).width(QChar(' ')); + addColumnAt(8+charwidth*sizeof(unsigned int)*2, "Number", false); + addColumnAt(8+charwidth*sizeof(unsigned int)*2, "ID", false); + addColumnAt(8+charwidth*sizeof(uint_t)*2, "Entry", false); + addColumnAt(8+charwidth*sizeof(uint_t)*2, "TEB", false); +#ifdef _WIN64 + addColumnAt(8+charwidth*sizeof(uint_t)*2, "RIP", false); +#else + addColumnAt(8+charwidth*sizeof(uint_t)*2, "EIP", false); +#endif //_WIN64 + addColumnAt(8+charwidth*14, "Suspend Count", false); + addColumnAt(8+charwidth*12, "Priority", false); + addColumnAt(8+charwidth*16, "WaitReason", false); + addColumnAt(8+charwidth*10, "LastError", false); + addColumnAt(0, "", false); + + connect(Bridge::getBridge(), SIGNAL(updateThreads()), this, SLOT(updateThreadList())); +} + +void ThreadView::updateThreadList() +{ + THREADLIST threadList; + memset(&threadList, 0, sizeof(THREADLIST)); + DbgGetThreadList(&threadList); + setRowCount(threadList.count); + for(int i=0; isave(); + painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#000000"))); + painter->setPen(QPen(QColor("#FFFFFF"))); //white text + painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, ret); + painter->restore(); + ret=""; + } + return ret; +} diff --git a/x64_dbg_gui/Project/Src/BasicView/ThreadView.h b/x64_dbg_gui/Project/Src/BasicView/ThreadView.h index 95868167..1f67a666 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ThreadView.h +++ b/x64_dbg_gui/Project/Src/BasicView/ThreadView.h @@ -1,21 +1,21 @@ -#ifndef THREADVIEW_H -#define THREADVIEW_H - -#include "StdTable.h" -#include "Bridge.h" - -class ThreadView : public StdTable -{ - Q_OBJECT -public: - explicit ThreadView(StdTable* parent = 0); - QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h); - -public slots: - void updateThreadList(); - -private: - int mCurrentThread; -}; - -#endif // THREADVIEW_H +#ifndef THREADVIEW_H +#define THREADVIEW_H + +#include "StdTable.h" +#include "Bridge.h" + +class ThreadView : public StdTable +{ + Q_OBJECT +public: + explicit ThreadView(StdTable* parent = 0); + QString paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h); + +public slots: + void updateThreadList(); + +private: + int mCurrentThread; +}; + +#endif // THREADVIEW_H diff --git a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.h b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.h index fe2dac05..9abb0a90 100644 --- a/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.h +++ b/x64_dbg_gui/Project/Src/BasicView/WordEditDialog.h @@ -6,14 +6,15 @@ #include #include "Bridge.h" -namespace Ui { +namespace Ui +{ class WordEditDialog; } class WordEditDialog : public QDialog { Q_OBJECT - + public: explicit WordEditDialog(QWidget *parent = 0); ~WordEditDialog(); @@ -22,7 +23,7 @@ public: public slots: void expressionChanged(QString s); - + private: Ui::WordEditDialog *ui; uint_t mWord; diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index f7186517..825008d4 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -276,13 +276,13 @@ bool Bridge::emitSelectionGet(int hWindow, SELECTIONDATA* selection) { case GUI_DISASSEMBLY: emit selectionDisasmGet(selection); - break; + break; case GUI_DUMP: emit selectionDumpGet(selection); - break; + break; case GUI_STACK: emit selectionStackGet(selection); - break; + break; default: mBridgeMutex.unlock(); return false; @@ -309,13 +309,13 @@ bool Bridge::emitSelectionSet(int hWindow, const SELECTIONDATA* selection) { case GUI_DISASSEMBLY: emit selectionDisasmSet(selection); - break; + break; case GUI_DUMP: emit selectionDumpSet(selection); - break; + break; case GUI_STACK: emit selectionStackSet(selection); - break; + break; default: mBridgeMutex.unlock(); return false; diff --git a/x64_dbg_gui/Project/Src/Exports.h b/x64_dbg_gui/Project/Src/Exports.h index 01d6f569..291fcbfe 100644 --- a/x64_dbg_gui/Project/Src/Exports.h +++ b/x64_dbg_gui/Project/Src/Exports.h @@ -8,8 +8,8 @@ ************************************************************************************/ #ifdef BUILD_LIB - extern "C" __declspec(dllexport) int _gui_guiinit(int argc, char *argv[]); - extern "C" __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* param2); +extern "C" __declspec(dllexport) int _gui_guiinit(int argc, char *argv[]); +extern "C" __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* param2); #endif diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 8fad3fda..9fdcf712 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -64,7 +64,7 @@ void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event) default: Disassembly::mouseDoubleClickEvent(event); - break; + break; } } @@ -140,18 +140,18 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) { case 0: msetHwBPOnSlot0Action->setText("Replace Slot 0 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 1: msetHwBPOnSlot1Action->setText("Replace Slot 1 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 2: msetHwBPOnSlot2Action->setText("Replace Slot 2 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; case 3: msetHwBPOnSlot3Action->setText("Replace Slot 3 (0x" + QString("%1").arg(wBPList.bp[wI].addr, 8, 16, QChar('0')).toUpper() + ")"); - break; + break; default: - break; + break; } } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp index d7240cbd..8f6418c0 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp @@ -1,261 +1,282 @@ -#include "CPUJumps.h" -#include "Configuration.h" -CPUJumps::CPUJumps(CPUDisassembly *Ptr, QWidget *parent) : - QAbstractScrollArea(parent) -{ - - topVA = -1; - selectedVA = -1; - viewableRows = 0; - - CodePtr = Ptr; - - m_DefaultFont = QFont("Monospace", 8); - - const QFontMetrics metrics(m_DefaultFont); - fontWidth = metrics.width('W'); - fontHeight = metrics.height(); - - InstrBuffer = CodePtr->instructionsBuffer(); - - connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); -} - -QSize CPUJumps::sizeHint() const -{ - return QSize(40,this->viewport()->height()); -} - - -void CPUJumps::disassembleAt(int_t parVA, int_t parCIP) -{ - //repaint(); -} - -void CPUJumps::repaint(){ - - viewport()->repaint(); -} - -void CPUJumps::changeTopmostAddress(int i) -{ - if(i!=topVA){ - topVA = i; - qDebug() << i; - repaint(); - } -} - -void CPUJumps::setViewableRows(int rows) -{ - viewableRows = rows; -} - -void CPUJumps::setSelection(int_t selVA) -{ - if(selVA != selectedVA){ - selectedVA = selVA; - repaint(); - } -} - -bool CPUJumps::isJump(int i) const{ - - int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; - if(BranchType && BranchType!=RetType && BranchType!=CallType){ - return true; - } - return false; -} - -void CPUJumps::paintEvent(QPaintEvent *event) -{ - if(InstrBuffer->size() ==0) - return; - - painter = new QPainter(viewport()); - - int jumpoffset = 0; - - int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); - int_t first_va = InstrBuffer->first().rva + CodePtr->getBase(); - - for(int line=0;lineat(line).rva + CodePtr->getBase()) == bp_none); - - - if(isJump(line)){ - jumpoffset++; - - int_t destRVA = (int_t)InstrBuffer->at(line).disasm.Instruction.AddrValue; - - if( InstrBuffer->at(line).disasm.Instruction.Opcode == 0xFF) - continue; - - - bool cond = !((InstrBuffer->at(line).disasm.Instruction.Opcode == 0xEB) || InstrBuffer->at(line).disasm.Instruction.Opcode == 0xE9); - if(destRVA <= last_va && destRVA >= first_va){ - - int destLine = line+1; - - while(InstrBuffer->at(destLine).rva + CodePtr->getBase() != destRVA - && destLine at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - - - }else if(destRVA > last_va){ - drawJump(line, - viewableRows+6, - jumpoffset, - cond, - DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - }else if(destRVA < first_va){ - drawJump(line, - -6, - jumpoffset, - cond, - DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - } - - } - - if(InstrBuffer->at(line).rva == CodePtr->currentEIP()){ - drawLabel(line,"EIP"); - } - - } - - - //delete painter; -} - -void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute, bool isactive){ - painter->save(); - if(!conditional){ - painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp - }else{ - painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); - } - QPen tmp = painter->pen(); - if(isexecute){ - tmp.setWidth(2); - //tmp.setColor(Qt::red); - } - if(isactive){ - tmp.setColor(Qt::red); - } - painter->setPen(tmp); - - const int JumpPadding = 15; - - const int x = viewport()->width()-jumpoffset*JumpPadding - 12; - const int x_right = viewport()->width()- 12; - const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; - const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; - - // vertical - painter->drawLine(x,y_start,x,y_end); - // start horizontal - painter->drawLine(x,y_start,x_right,y_start); - painter->drawLine(x,y_end,x_right,y_end); - - const int ArrowSizeX = 2; // width of arrow tip in pixel - const int ArrowSizeY = 3; // height of arrow tip in pixel - - - tmp = painter->pen(); - tmp.setStyle(Qt::SolidLine); - tmp.setWidth(2); - painter->setPen(tmp); - painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); - painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); - - - painter->restore(); -} - -void CPUJumps::drawBullets(int line, bool isbp){ - - - painter->save(); - - if( isbp) - painter->setBrush(QBrush("#808080")); - else - painter->setBrush(QBrush(Qt::red)); - - const int y = fontHeight*(1+line)-0.8*fontHeight ; - const int x = viewport()->width() - 10; - const int radius = 8; - - painter->setRenderHint(QPainter::Antialiasing, true); - painter->setPen(QPen("#ffffff")); - painter->drawEllipse(x,y,radius,radius); - - - - painter->restore(); -} - - - - -void CPUJumps::drawLabel(int Line, QString Text){ - - painter->save(); - const int LineCoordinate = fontHeight*(1+Line); - int length = Text.length(); - - painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); - painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"))); - int y = LineCoordinate-fontHeight; - - painter->drawRect(1,y,length*fontWidth,fontHeight); - painter->setPen(QPen(Configuration::instance()->color("EIPLabel"))); - painter->drawText(2,LineCoordinate-0.2*fontHeight,Text); - - y = fontHeight*(1+Line)-0.5*fontHeight; - painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"),2)); - painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); - - drawStraightArrow(painter,length*fontWidth,y,this->viewport()->width()-2-15,y); - painter->restore(); - -} - -void CPUJumps::drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2) -{ - - - painter->drawLine(x1,y1,x2,y2); - - - - /* - // this does not work - QPainterPath path; - - path.moveTo( QPointF(x2, x2)); - path.lineTo (QPointF(x2-ArrowSizeX,y2-ArrowSizeY)); - path.lineTo (QPointF(x2-ArrowSizeX,y2+ArrowSizeY)); - path.closeSubpath(); - - painter->setPen (Qt :: NoPen); - painter->fillPath (path, QBrush (color));*/ - const int ArrowSizeX = 4; // width of arrow tip in pixel - const int ArrowSizeY = 4; // height of arrow tip in pixel - - - painter->drawLine(x2,y2,x2-ArrowSizeX,y2-ArrowSizeY); - painter->drawLine(x2,y2,x2-ArrowSizeX,y2+ArrowSizeY); - -} - +#include "CPUJumps.h" +#include "Configuration.h" +CPUJumps::CPUJumps(CPUDisassembly *Ptr, QWidget *parent) : + QAbstractScrollArea(parent) +{ + + topVA = -1; + selectedVA = -1; + viewableRows = 0; + + CodePtr = Ptr; + + m_DefaultFont = QFont("Monospace", 8); + + const QFontMetrics metrics(m_DefaultFont); + fontWidth = metrics.width('W'); + fontHeight = metrics.height(); + + InstrBuffer = CodePtr->instructionsBuffer(); + + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); +} + +QSize CPUJumps::sizeHint() const +{ + return QSize(40,this->viewport()->height()); +} + + +void CPUJumps::disassembleAt(int_t parVA, int_t parCIP) +{ + //repaint(); +} + +void CPUJumps::repaint() +{ + + viewport()->repaint(); +} + +void CPUJumps::changeTopmostAddress(int i) +{ + if(i!=topVA) + { + topVA = i; + qDebug() << i; + repaint(); + } +} + +void CPUJumps::setViewableRows(int rows) +{ + viewableRows = rows; +} + +void CPUJumps::setSelection(int_t selVA) +{ + if(selVA != selectedVA) + { + selectedVA = selVA; + repaint(); + } +} + +bool CPUJumps::isJump(int i) const +{ + + int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; + if(BranchType && BranchType!=RetType && BranchType!=CallType) + { + return true; + } + return false; +} + +void CPUJumps::paintEvent(QPaintEvent *event) +{ + if(InstrBuffer->size() ==0) + return; + + painter = new QPainter(viewport()); + + int jumpoffset = 0; + + int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); + int_t first_va = InstrBuffer->first().rva + CodePtr->getBase(); + + for(int line=0; lineat(line).rva + CodePtr->getBase()) == bp_none); + + + if(isJump(line)) + { + jumpoffset++; + + int_t destRVA = (int_t)InstrBuffer->at(line).disasm.Instruction.AddrValue; + + if( InstrBuffer->at(line).disasm.Instruction.Opcode == 0xFF) + continue; + + + bool cond = !((InstrBuffer->at(line).disasm.Instruction.Opcode == 0xEB) || InstrBuffer->at(line).disasm.Instruction.Opcode == 0xE9); + if(destRVA <= last_va && destRVA >= first_va) + { + + int destLine = line+1; + + while(InstrBuffer->at(destLine).rva + CodePtr->getBase() != destRVA + && destLine at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); + + + } + else if(destRVA > last_va) + { + drawJump(line, + viewableRows+6, + jumpoffset, + cond, + DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); + } + else if(destRVA < first_va) + { + drawJump(line, + -6, + jumpoffset, + cond, + DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, + selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); + } + + } + + if(InstrBuffer->at(line).rva == CodePtr->currentEIP()) + { + drawLabel(line,"EIP"); + } + + } + + + //delete painter; +} + +void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute, bool isactive) +{ + painter->save(); + if(!conditional) + { + painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp + } + else + { + painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); + } + QPen tmp = painter->pen(); + if(isexecute) + { + tmp.setWidth(2); + //tmp.setColor(Qt::red); + } + if(isactive) + { + tmp.setColor(Qt::red); + } + painter->setPen(tmp); + + const int JumpPadding = 15; + + const int x = viewport()->width()-jumpoffset*JumpPadding - 12; + const int x_right = viewport()->width()- 12; + const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; + const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; + + // vertical + painter->drawLine(x,y_start,x,y_end); + // start horizontal + painter->drawLine(x,y_start,x_right,y_start); + painter->drawLine(x,y_end,x_right,y_end); + + const int ArrowSizeX = 2; // width of arrow tip in pixel + const int ArrowSizeY = 3; // height of arrow tip in pixel + + + tmp = painter->pen(); + tmp.setStyle(Qt::SolidLine); + tmp.setWidth(2); + painter->setPen(tmp); + painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); + painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); + + + painter->restore(); +} + +void CPUJumps::drawBullets(int line, bool isbp) +{ + + + painter->save(); + + if( isbp) + painter->setBrush(QBrush("#808080")); + else + painter->setBrush(QBrush(Qt::red)); + + const int y = fontHeight*(1+line)-0.8*fontHeight ; + const int x = viewport()->width() - 10; + const int radius = 8; + + painter->setRenderHint(QPainter::Antialiasing, true); + painter->setPen(QPen("#ffffff")); + painter->drawEllipse(x,y,radius,radius); + + + + painter->restore(); +} + + + + +void CPUJumps::drawLabel(int Line, QString Text) +{ + + painter->save(); + const int LineCoordinate = fontHeight*(1+Line); + int length = Text.length(); + + painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); + painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"))); + int y = LineCoordinate-fontHeight; + + painter->drawRect(1,y,length*fontWidth,fontHeight); + painter->setPen(QPen(Configuration::instance()->color("EIPLabel"))); + painter->drawText(2,LineCoordinate-0.2*fontHeight,Text); + + y = fontHeight*(1+Line)-0.5*fontHeight; + painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"),2)); + painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); + + drawStraightArrow(painter,length*fontWidth,y,this->viewport()->width()-2-15,y); + painter->restore(); + +} + +void CPUJumps::drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2) +{ + + + painter->drawLine(x1,y1,x2,y2); + + + + /* + // this does not work + QPainterPath path; + + path.moveTo( QPointF(x2, x2)); + path.lineTo (QPointF(x2-ArrowSizeX,y2-ArrowSizeY)); + path.lineTo (QPointF(x2-ArrowSizeX,y2+ArrowSizeY)); + path.closeSubpath(); + + painter->setPen (Qt :: NoPen); + painter->fillPath (path, QBrush (color));*/ + const int ArrowSizeX = 4; // width of arrow tip in pixel + const int ArrowSizeY = 4; // height of arrow tip in pixel + + + painter->drawLine(x2,y2,x2-ArrowSizeX,y2-ArrowSizeY); + painter->drawLine(x2,y2,x2-ArrowSizeX,y2+ArrowSizeY); + +} + diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h index ae2eeca6..b9be3153 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUJumps.h @@ -1,44 +1,44 @@ -#ifndef CPUJUMPS_H -#define CPUJUMPS_H - -#include "NewTypes.h" -#include "Bridge.h" -#include "CPUDisassembly.h" -#include - -class CPUJumps : public QAbstractScrollArea -{ - Q_OBJECT - - int_t topVA; - int_t selectedVA; - QPainter *painter; - QFont m_DefaultFont; - int fontWidth, fontHeight; - int viewableRows; - - CPUDisassembly *CodePtr; - QList *InstrBuffer; -public: - explicit CPUJumps(CPUDisassembly *Ptr, QWidget *parent = 0); - QSize sizeHint() const; - - void drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2); -signals: - -public slots: - - void disassembleAt(int_t parVA, int_t parCIP); - void repaint(); - void changeTopmostAddress(int i); - void setViewableRows(int rows); - void setSelection(int_t selVA); -protected: - void paintEvent(QPaintEvent *event); - void drawLabel(int Line, QString Text); - void drawBullets(int line, bool ispb); - bool isJump(int i) const; - void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); -}; - -#endif // CPUJUMPS_H +#ifndef CPUJUMPS_H +#define CPUJUMPS_H + +#include "NewTypes.h" +#include "Bridge.h" +#include "CPUDisassembly.h" +#include + +class CPUJumps : public QAbstractScrollArea +{ + Q_OBJECT + + int_t topVA; + int_t selectedVA; + QPainter *painter; + QFont m_DefaultFont; + int fontWidth, fontHeight; + int viewableRows; + + CPUDisassembly *CodePtr; + QList *InstrBuffer; +public: + explicit CPUJumps(CPUDisassembly *Ptr, QWidget *parent = 0); + QSize sizeHint() const; + + void drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2); +signals: + +public slots: + + void disassembleAt(int_t parVA, int_t parCIP); + void repaint(); + void changeTopmostAddress(int i); + void setViewableRows(int rows); + void setSelection(int_t selVA); +protected: + void paintEvent(QPaintEvent *event); + void drawLabel(int Line, QString Text); + void drawBullets(int line, bool ispb); + bool isJump(int i) const; + void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); +}; + +#endif // CPUJUMPS_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h index 21c665a7..8483e980 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h @@ -11,14 +11,15 @@ #include "InfoBox.h" #include "CPUJumps.h" -namespace Ui { +namespace Ui +{ class CPUWidget; } class CPUWidget : public QWidget { Q_OBJECT - + public: explicit CPUWidget(QWidget *parent = 0); ~CPUWidget(); diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 271208f5..126af835 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -1,66 +1,73 @@ -#include "Configuration.h" - -Configuration* Configuration::mPtr = NULL; - - -Configuration::Configuration() -{ - load("config.json"); - //Colors = new QMap(); - //Colors = QMap(); - mPtr = this; -} - -Configuration *Configuration::instance() -{ - return mPtr; -} - -void Configuration::load(QString filename){ - // load configuration file - QFile configfile(filename); - - if (!configfile.open(QIODevice::ReadOnly)) { - qWarning("Couldn't open config file."); - return ; - } - QByteArray saveData = configfile.readAll(); - Config = QJsonDocument(QJsonDocument::fromJson(saveData)).object(); - - readColors(); - -} - -void Configuration::readColors() { - Colors.clear(); - - QJsonArray ColorArray = Config["colors"].toArray(); - for (int idx = 0; idx < ColorArray.size(); ++idx) { - QJsonArray colorObj = ColorArray[idx].toArray(); - Colors.insert(colorObj.at(0).toString(),QColor( colorObj.at(1).toString())); - } -} - -QList Configuration::ApiFingerprints(){ - QList files; - QJsonArray APIArray = Config["apifingerprints"].toArray(); - for (int idx = 0; idx < APIArray.size(); ++idx) { - QString filename = "data/"+APIArray.at(idx).toString()+".txt"; - QFile mFile(filename); - if(mFile.open(QFile::ReadOnly | QFile::Text)){ - files.append(APIArray.at(idx).toString()); - mFile.close(); - } - - } - return files; -} - -const QColor Configuration::color(QString id) const -{ - if(Colors.contains(id)) - return Colors.constFind(id).value(); - else - return Qt::black; -} - +#include "Configuration.h" + +Configuration* Configuration::mPtr = NULL; + + +Configuration::Configuration() +{ + load("config.json"); + //Colors = new QMap(); + //Colors = QMap(); + mPtr = this; +} + +Configuration *Configuration::instance() +{ + return mPtr; +} + +void Configuration::load(QString filename) +{ + // load configuration file + QFile configfile(filename); + + if (!configfile.open(QIODevice::ReadOnly)) + { + qWarning("Couldn't open config file."); + return ; + } + QByteArray saveData = configfile.readAll(); + Config = QJsonDocument(QJsonDocument::fromJson(saveData)).object(); + + readColors(); + +} + +void Configuration::readColors() +{ + Colors.clear(); + + QJsonArray ColorArray = Config["colors"].toArray(); + for (int idx = 0; idx < ColorArray.size(); ++idx) + { + QJsonArray colorObj = ColorArray[idx].toArray(); + Colors.insert(colorObj.at(0).toString(),QColor( colorObj.at(1).toString())); + } +} + +QList Configuration::ApiFingerprints() +{ + QList files; + QJsonArray APIArray = Config["apifingerprints"].toArray(); + for (int idx = 0; idx < APIArray.size(); ++idx) + { + QString filename = "data/"+APIArray.at(idx).toString()+".txt"; + QFile mFile(filename); + if(mFile.open(QFile::ReadOnly | QFile::Text)) + { + files.append(APIArray.at(idx).toString()); + mFile.close(); + } + + } + return files; +} + +const QColor Configuration::color(QString id) const +{ + if(Colors.contains(id)) + return Colors.constFind(id).value(); + else + return Qt::black; +} + diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.h b/x64_dbg_gui/Project/Src/Gui/Configuration.h index 26782673..4138f01b 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.h +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.h @@ -1,31 +1,28 @@ -#ifndef CONFIGURATION_H -#define CONFIGURATION_H - -#include -#include -#include -#include -#include -#include -#include -#include - -class Configuration -{ - QJsonObject Config; - - QMap Colors; - - static Configuration* mPtr; -public: - Configuration(); - - static Configuration* instance(); - - void readColors(); - const QColor color(QString id) const; - void load(QString filename); - QList ApiFingerprints(); -}; - -#endif // CONFIGURATION_H +#ifndef CONFIGURATION_H +#define CONFIGURATION_H + +#include +#include +#include +#include +#include + +class Configuration +{ + QJsonObject Config; + + QMap Colors; + + static Configuration* mPtr; +public: + Configuration(); + + static Configuration* instance(); + + void readColors(); + const QColor color(QString id) const; + void load(QString filename); + QList ApiFingerprints(); +}; + +#endif // CONFIGURATION_H diff --git a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp index 4fac23ca..585be64b 100644 --- a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.cpp @@ -1,83 +1,83 @@ -#include "ExceptionRangeDialog.h" -#include "ui_ExceptionRangeDialog.h" - -ExceptionRangeDialog::ExceptionRangeDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ExceptionRangeDialog) -{ - ui->setupUi(this); - //set window flags - setModal(true); - setWindowFlags(Qt::Dialog | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint); - setFixedSize(this->size()); //fixed size - ui->editStart->setCursorPosition(0); - ui->editEnd->setCursorPosition(0); - ui->btnOk->setEnabled(false); -} - -ExceptionRangeDialog::~ExceptionRangeDialog() -{ - delete ui; -} - -void ExceptionRangeDialog::on_editStart_textChanged(const QString &arg1) -{ - if(!ui->editStart->text().size()) //nothing entered - { - ui->btnOk->setEnabled(false); - return; - } - if(ui->editStart->text()=="-1") - ui->editStart->setText("FFFFFFFF"); - bool converted=false; - unsigned long start=ui->editStart->text().toUInt(&converted, 16); - if(!converted) - { - ui->btnOk->setEnabled(false); - return; - } - unsigned long end=ui->editEnd->text().toUInt(&converted, 16); - if(converted && endbtnOk->setEnabled(false); - else - ui->btnOk->setEnabled(true); -} - - -void ExceptionRangeDialog::on_editEnd_textChanged(const QString &arg1) -{ - if(!ui->editEnd->text().size() || !ui->editStart->text().size()) - { - ui->btnOk->setEnabled(false); - return; - } - if(ui->editEnd->text()=="-1") - ui->editEnd->setText("FFFFFFFF"); - bool converted=false; - unsigned long start=ui->editStart->text().toUInt(&converted, 16); - if(!converted) - { - ui->btnOk->setEnabled(false); - return; - } - unsigned long end=ui->editEnd->text().toUInt(&converted, 16); - if(!converted) - { - ui->btnOk->setEnabled(false); - return; - } - if(endbtnOk->setEnabled(false); - else - ui->btnOk->setEnabled(true); -} - -void ExceptionRangeDialog::on_btnOk_clicked() -{ - rangeStart=ui->editStart->text().toUInt(0, 16); - bool converted=false; - rangeEnd=ui->editEnd->text().toUInt(&converted, 16); - if(!converted) - rangeEnd=rangeStart; - accept(); -} +#include "ExceptionRangeDialog.h" +#include "ui_ExceptionRangeDialog.h" + +ExceptionRangeDialog::ExceptionRangeDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ExceptionRangeDialog) +{ + ui->setupUi(this); + //set window flags + setModal(true); + setWindowFlags(Qt::Dialog | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint); + setFixedSize(this->size()); //fixed size + ui->editStart->setCursorPosition(0); + ui->editEnd->setCursorPosition(0); + ui->btnOk->setEnabled(false); +} + +ExceptionRangeDialog::~ExceptionRangeDialog() +{ + delete ui; +} + +void ExceptionRangeDialog::on_editStart_textChanged(const QString &arg1) +{ + if(!ui->editStart->text().size()) //nothing entered + { + ui->btnOk->setEnabled(false); + return; + } + if(ui->editStart->text()=="-1") + ui->editStart->setText("FFFFFFFF"); + bool converted=false; + unsigned long start=ui->editStart->text().toUInt(&converted, 16); + if(!converted) + { + ui->btnOk->setEnabled(false); + return; + } + unsigned long end=ui->editEnd->text().toUInt(&converted, 16); + if(converted && endbtnOk->setEnabled(false); + else + ui->btnOk->setEnabled(true); +} + + +void ExceptionRangeDialog::on_editEnd_textChanged(const QString &arg1) +{ + if(!ui->editEnd->text().size() || !ui->editStart->text().size()) + { + ui->btnOk->setEnabled(false); + return; + } + if(ui->editEnd->text()=="-1") + ui->editEnd->setText("FFFFFFFF"); + bool converted=false; + unsigned long start=ui->editStart->text().toUInt(&converted, 16); + if(!converted) + { + ui->btnOk->setEnabled(false); + return; + } + unsigned long end=ui->editEnd->text().toUInt(&converted, 16); + if(!converted) + { + ui->btnOk->setEnabled(false); + return; + } + if(endbtnOk->setEnabled(false); + else + ui->btnOk->setEnabled(true); +} + +void ExceptionRangeDialog::on_btnOk_clicked() +{ + rangeStart=ui->editStart->text().toUInt(0, 16); + bool converted=false; + rangeEnd=ui->editEnd->text().toUInt(&converted, 16); + if(!converted) + rangeEnd=rangeStart; + accept(); +} diff --git a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.h b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.h index 193f7b4f..e330162d 100644 --- a/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/ExceptionRangeDialog.h @@ -1,30 +1,31 @@ -#ifndef EXCEPTIONRANGEDIALOG_H -#define EXCEPTIONRANGEDIALOG_H - -#include - -namespace Ui { - class ExceptionRangeDialog; -} - -class ExceptionRangeDialog : public QDialog -{ - Q_OBJECT - -public: - explicit ExceptionRangeDialog(QWidget *parent = 0); - ~ExceptionRangeDialog(); - - unsigned long rangeStart; - unsigned long rangeEnd; - -private slots: - void on_editStart_textChanged(const QString &arg1); - void on_editEnd_textChanged(const QString &arg1); - void on_btnOk_clicked(); - -private: - Ui::ExceptionRangeDialog *ui; -}; - -#endif // EXCEPTIONRANGEDIALOG_H +#ifndef EXCEPTIONRANGEDIALOG_H +#define EXCEPTIONRANGEDIALOG_H + +#include + +namespace Ui +{ +class ExceptionRangeDialog; +} + +class ExceptionRangeDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ExceptionRangeDialog(QWidget *parent = 0); + ~ExceptionRangeDialog(); + + unsigned long rangeStart; + unsigned long rangeEnd; + +private slots: + void on_editStart_textChanged(const QString &arg1); + void on_editEnd_textChanged(const QString &arg1); + void on_btnOk_clicked(); + +private: + Ui::ExceptionRangeDialog *ui; +}; + +#endif // EXCEPTIONRANGEDIALOG_H diff --git a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h index f82de572..08f418c9 100644 --- a/x64_dbg_gui/Project/Src/Gui/GotoDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/GotoDialog.h @@ -5,7 +5,8 @@ #include #include "Bridge.h" -namespace Ui { +namespace Ui +{ class GotoDialog; } diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 943da761..ee3c0fbc 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -77,7 +77,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi mThreadView->setWindowIcon(QIcon(":/icons/images/arrow-threads.png")); //Create the tab widget - mTabWidget = new MHTabWidget(NULL); + mTabWidget = new MHTabWidget(NULL); //Setup tabs mTabWidget->addTab(mCpuWidget, mCpuWidget->windowIcon(), mCpuWidget->windowTitle()); @@ -162,12 +162,12 @@ MainWindow::~MainWindow() void MainWindow::setTab(QWidget* widget) { - for(int i=0; icount(); i++) - if(mTabWidget->widget(i)==widget) - { - mTabWidget->setCurrentIndex(i); - break; - } + for(int i=0; icount(); i++) + if(mTabWidget->widget(i)==widget) + { + mTabWidget->setCurrentIndex(i); + break; + } } //Reads recent files list from settings diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 83cb4ad9..48ce8c2a 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -21,14 +21,15 @@ #include "Configuration.h" #include "ApiFingerprints.h" -namespace Ui { +namespace Ui +{ class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT - + public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); @@ -76,7 +77,7 @@ private: Ui::MainWindow *ui; CommandLineEdit* mCmdLineEdit; - MHTabWidget* mTabWidget; + MHTabWidget* mTabWidget; CPUWidget* mCpuWidget; MemoryMapView* mMemMapView; LogView* mLogView; diff --git a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h index 3d2a3b66..34bb3dce 100644 --- a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.h @@ -6,8 +6,9 @@ #include "Bridge.h" #include "ExceptionRangeDialog.h" -namespace Ui { - class SettingsDialog; +namespace Ui +{ +class SettingsDialog; } class SettingsDialog : public QDialog diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.cpp b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp index 34c356fc..a1242a7c 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/TabBar.cpp @@ -1,164 +1,164 @@ -// Qt includes -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tabbar.h" -#include "tabwidget.h" - -////////////////////////////////////////////////////////////// -// Default Constructor -////////////////////////////////////////////////////////////// -MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) -{ - setAcceptDrops(true); - setElideMode(Qt::ElideRight); - setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); - setMovable(true); -} - -////////////////////////////////////////////////////////////// -// Default Destructor -////////////////////////////////////////////////////////////// -MHTabBar::~MHTabBar(void) -{ -} - -void MHTabBar::contextMenuEvent(QContextMenuEvent* event) -{ - QMenu wMenu(this); - QAction wDetach("&Detach", this); - wMenu.addAction(&wDetach); - if(wMenu.exec(event->globalPos())==&wDetach) - { - QPoint p(0, 0); - OnDetachTab((int)tabAt(event->pos()), p); - } -} - - -/* -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::mousePressEvent(QMouseEvent* event) -{ - if (event->button() == Qt::LeftButton) - m_dragStartPos = event->pos(); - - m_dragDroppedPos.setX(0); - m_dragDroppedPos.setY(0); - m_dragMovedPos.setX(0); - m_dragMovedPos.setY(0); - - m_dragInitiated = false; - - QTabBar::mousePressEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::mouseMoveEvent(QMouseEvent* event) -{ - // Distinguish a drag - if ( !m_dragStartPos.isNull() && - ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) - { - m_dragInitiated = true; - } - - // The left button is pressed - // And the move could also be a drag - // And the mouse moved outside the tab bar - if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) - { - // Stop the move to be able to convert to a drag - { - QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - QTabBar::mouseMoveEvent(&finishMoveEvent); - } - - // A crude way to distinguish tab-reordering drops from other ones - QMimeData* mimeData = new QMimeData; - mimeData->setData("action", "application/tab-detach"); - - // Initiate Drag - QDrag* drag = new QDrag(this); - drag->setMimeData(mimeData); - - // Create transparent screen dump - QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); - QPixmap targetPixmap(pixmap.size()); - - QPainter painter(&targetPixmap); - painter.setOpacity(0.5); - painter.drawPixmap(0, 0, pixmap); - painter.end(); - - drag->setPixmap(targetPixmap); - - // Handle Detach and Move - Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); - - if (dragged == Qt::IgnoreAction) - { - event->accept(); - OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); - } - else if (dragged == Qt::MoveAction) - { - if (!m_dragDroppedPos.isNull()) - { - event->accept(); - OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); - } - } - - delete drag; - } - else - { - QTabBar::mouseMoveEvent(event); - } -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dragEnterEvent(QDragEnterEvent* event) -{ - // Only accept if it's an tab-reordering request (not a detach request) - const QMimeData* m = event->mimeData(); - - if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) - { - event->acceptProposedAction(); - } - - QTabBar::dragEnterEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dragMoveEvent(QDragMoveEvent* event) -{ - // Only accept if it's an tab-reordering request (not a detach request) - const QMimeData* m = event->mimeData(); - - if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) - { - m_dragMovedPos = event->pos(); - event->acceptProposedAction(); - } - - QTabBar::dragMoveEvent(event); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabBar::dropEvent(QDropEvent* event) -{ - // If a dragged Event is dropped within this widget it is not a drag but a move. - m_dragDroppedPos = event->pos(); - - QTabBar::dropEvent(event); -} -*/ +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabBar::MHTabBar(QWidget *parent) : QTabBar(parent) +{ + setAcceptDrops(true); + setElideMode(Qt::ElideRight); + setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab); + setMovable(true); +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabBar::~MHTabBar(void) +{ +} + +void MHTabBar::contextMenuEvent(QContextMenuEvent* event) +{ + QMenu wMenu(this); + QAction wDetach("&Detach", this); + wMenu.addAction(&wDetach); + if(wMenu.exec(event->globalPos())==&wDetach) + { + QPoint p(0, 0); + OnDetachTab((int)tabAt(event->pos()), p); + } +} + + +/* +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mousePressEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton) + m_dragStartPos = event->pos(); + + m_dragDroppedPos.setX(0); + m_dragDroppedPos.setY(0); + m_dragMovedPos.setX(0); + m_dragMovedPos.setY(0); + + m_dragInitiated = false; + + QTabBar::mousePressEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::mouseMoveEvent(QMouseEvent* event) +{ + // Distinguish a drag + if ( !m_dragStartPos.isNull() && + ((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) ) + { + m_dragInitiated = true; + } + + // The left button is pressed + // And the move could also be a drag + // And the mouse moved outside the tab bar + if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos())) + { + // Stop the move to be able to convert to a drag + { + QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QTabBar::mouseMoveEvent(&finishMoveEvent); + } + + // A crude way to distinguish tab-reordering drops from other ones + QMimeData* mimeData = new QMimeData; + mimeData->setData("action", "application/tab-detach"); + + // Initiate Drag + QDrag* drag = new QDrag(this); + drag->setMimeData(mimeData); + + // Create transparent screen dump + QPixmap pixmap = QPixmap::grabWindow(dynamic_cast(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio); + QPixmap targetPixmap(pixmap.size()); + + QPainter painter(&targetPixmap); + painter.setOpacity(0.5); + painter.drawPixmap(0, 0, pixmap); + painter.end(); + + drag->setPixmap(targetPixmap); + + // Handle Detach and Move + Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction); + + if (dragged == Qt::IgnoreAction) + { + event->accept(); + OnDetachTab(tabAt(m_dragStartPos), QCursor::pos()); + } + else if (dragged == Qt::MoveAction) + { + if (!m_dragDroppedPos.isNull()) + { + event->accept(); + OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos)); + } + } + + delete drag; + } + else + { + QTabBar::mouseMoveEvent(event); + } +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragEnterEvent(QDragEnterEvent* event) +{ + // Only accept if it's an tab-reordering request (not a detach request) + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) + { + event->acceptProposedAction(); + } + + QTabBar::dragEnterEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dragMoveEvent(QDragMoveEvent* event) +{ + // Only accept if it's an tab-reordering request (not a detach request) + const QMimeData* m = event->mimeData(); + + if (m->formats().contains("action") && (m->data("action") != "application/tab-detach")) + { + m_dragMovedPos = event->pos(); + event->acceptProposedAction(); + } + + QTabBar::dragMoveEvent(event); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabBar::dropEvent(QDropEvent* event) +{ + // If a dragged Event is dropped within this widget it is not a drag but a move. + m_dragDroppedPos = event->pos(); + + QTabBar::dropEvent(event); +} +*/ diff --git a/x64_dbg_gui/Project/Src/Gui/TabBar.h b/x64_dbg_gui/Project/Src/Gui/TabBar.h index 493b0e28..2d6693ba 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabBar.h +++ b/x64_dbg_gui/Project/Src/Gui/TabBar.h @@ -1,50 +1,50 @@ -#ifndef __MHTABBAR_H__ -#define __MHTABBAR_H__ - -// Qt includes -#include -#include -#include - -// Qt forward class definitions -class MHTabBar; -class QMainWindow; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHTabBar implements the a Tab Bar with tear-off functionality. -////////////////////////////////////////////////////////////////////////////// -class MHTabBar: public QTabBar -{ - Q_OBJECT -public: - MHTabBar (QWidget* parent); - ~MHTabBar (void); - -protected: - void contextMenuEvent(QContextMenuEvent* event); - /* - void mousePressEvent(QMouseEvent* event); - void mouseMoveEvent(QMouseEvent* event); - void dragEnterEvent(QDragEnterEvent* event); - void dragMoveEvent(QDragMoveEvent* event); - void dropEvent(QDropEvent* event); - */ - -signals: - // Detach Tab - void OnDetachTab (int index, QPoint& dropPoint); - // Move Tab - void OnMoveTab (int fromIndex, int toIndex); - -private: - /* - QPoint m_dragStartPos; - QPoint m_dragMovedPos; - QPoint m_dragDroppedPos; - bool m_dragInitiated; - int m_dragCurrentIndex; - */ -}; - -#endif // __MHTABBAR_H__ +#ifndef __MHTABBAR_H__ +#define __MHTABBAR_H__ + +// Qt includes +#include +#include +#include + +// Qt forward class definitions +class MHTabBar; +class QMainWindow; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabBar implements the a Tab Bar with tear-off functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabBar: public QTabBar +{ + Q_OBJECT +public: + MHTabBar (QWidget* parent); + ~MHTabBar (void); + +protected: + void contextMenuEvent(QContextMenuEvent* event); + /* + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void dropEvent(QDropEvent* event); + */ + +signals: + // Detach Tab + void OnDetachTab (int index, QPoint& dropPoint); + // Move Tab + void OnMoveTab (int fromIndex, int toIndex); + +private: + /* + QPoint m_dragStartPos; + QPoint m_dragMovedPos; + QPoint m_dragDroppedPos; + bool m_dragInitiated; + int m_dragCurrentIndex; + */ +}; + +#endif // __MHTABBAR_H__ diff --git a/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp index bde42582..962b2c8e 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/TabWidget.cpp @@ -1,191 +1,191 @@ -// Qt includes -#include "tabbar.h" -#include "tabwidget.h" - -////////////////////////////////////////////////////////////// -// Default Constructor -////////////////////////////////////////////////////////////// -MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) -{ - m_tabBar = new MHTabBar(this); - connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - - setTabBar(m_tabBar); - setMovable(true); - - m_Windows.clear(); -} - -QTabBar* MHTabWidget::tabBar() -{ - return m_tabBar; -} - -////////////////////////////////////////////////////////////// -// Default Destructor -////////////////////////////////////////////////////////////// -MHTabWidget::~MHTabWidget(void) -{ - disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); - disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); - delete m_tabBar; -} - -int MHTabWidget::count() const -{ - return QTabWidget::count() + m_Windows.size(); -} - -QWidget *MHTabWidget::widget(int index) const -{ - int baseCount = QTabWidget::count(); - - // Check if it's just a normal tab - if (index < baseCount) - return QTabWidget::widget(index); - - // Otherwise it's going to be a window - return m_Windows.at(index - baseCount); -} - -void MHTabWidget::setCurrentIndex(int index) -{ - // Check if it's just a normal tab - if (index < QTabWidget::count()) - { - QTabWidget::setCurrentIndex(index); - } - else - { - // Otherwise it's going to be a window (just bring it up) - MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); - window->activateWindow(); - } -} - -void MHTabWidget::setCurrentWidget(QWidget *widget) -{ - widget = 0; - // To be implemented. -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::MoveTab(int fromIndex, int toIndex) -{ - removeTab(fromIndex); - insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); - setCurrentIndex(toIndex); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::DetachTab(int index, QPoint& dropPoint) -{ - Q_UNUSED(dropPoint); - // Create the window - MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); - detachedWidget->setWindowModality(Qt::NonModal); - - // Find Widget and connect - connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - - detachedWidget->setWindowTitle(tabText(index)); - detachedWidget->setWindowIcon(tabIcon(index)); - - // Remove from tab bar - QWidget* tearOffWidget = widget(index); - tearOffWidget->setParent(detachedWidget); - - // Add it to the windows list - m_Windows.append(tearOffWidget); - - // Make first active - if (count() > 0) - setCurrentIndex(0); - - // Create and show - detachedWidget->setCentralWidget(tearOffWidget); - - // Needs to be done explicitly - tearOffWidget->show(); - QRect screenGeometry = QApplication::desktop()->screenGeometry(); - int w = 640; - int h = 480; - int x = (screenGeometry.width() - w) / 2; - int y = (screenGeometry.height() - h) / 2; - detachedWidget->show(); - detachedWidget->setGeometry(x, y, w, h); - detachedWidget->show(); -} - -////////////////////////////////////////////////////////////////////////////// -void MHTabWidget::AttachTab(QWidget *parent) -{ - // Retrieve widget - MHDetachedWindow* detachedWidget = dynamic_cast(parent); - QWidget* tearOffWidget = detachedWidget->centralWidget(); - - // Reattach the tab - int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); - - // Remove it from the windows list - for(int i = 0; i < m_Windows.size(); i++) - { - if (m_Windows.at(i) == tearOffWidget) - m_Windows.removeAt(i); - } - - // Make Active - if (newIndex != -1) - setCurrentIndex(newIndex); - - // Cleanup Window - disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); - detachedWidget->hide(); - detachedWidget->close(); -} - -//---------------------------------------------------------------------------- - -////////////////////////////////////////////////////////////////////////////// -MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent) -{ - m_TabWidget = tabwidget; -} - -////////////////////////////////////////////////////////////////////////////// -MHDetachedWindow::~MHDetachedWindow(void) -{ -} - -/* -////////////////////////////////////////////////////////////////////////////// -void MHDetachedWindow::moveEvent(QMoveEvent *event) -{ - QRect rect = m_TabWidget->geometry(); - QSize hint = m_TabWidget->tabBar()->sizeHint(); - - // Height of the actual top tab bar - rect.setBottom(rect.top() + hint.height()); - QPoint pos1(rect.x(), rect.y()); - pos1=m_TabWidget->mapToGlobal(pos1); - rect.setX(pos1.x()); - rect.setY(pos1.y()); - - if (rect.contains(event->pos())) - { - m_TabWidget->AttachTab(this); - event->accept(); - } - else - { - QMainWindow::moveEvent(event); - } -} -*/ - -////////////////////////////////////////////////////////////////////////////// -void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) -{ - emit OnClose(this); -} +// Qt includes +#include "tabbar.h" +#include "tabwidget.h" + +////////////////////////////////////////////////////////////// +// Default Constructor +////////////////////////////////////////////////////////////// +MHTabWidget::MHTabWidget(QWidget *parent) : QTabWidget(parent) +{ + m_tabBar = new MHTabBar(this); + connect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + connect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + + setTabBar(m_tabBar); + setMovable(true); + + m_Windows.clear(); +} + +QTabBar* MHTabWidget::tabBar() +{ + return m_tabBar; +} + +////////////////////////////////////////////////////////////// +// Default Destructor +////////////////////////////////////////////////////////////// +MHTabWidget::~MHTabWidget(void) +{ + disconnect(m_tabBar, SIGNAL(OnMoveTab(int, int)), this, SLOT(MoveTab(int, int))); + disconnect(m_tabBar, SIGNAL(OnDetachTab(int, QPoint&)), this, SLOT(DetachTab(int, QPoint&))); + delete m_tabBar; +} + +int MHTabWidget::count() const +{ + return QTabWidget::count() + m_Windows.size(); +} + +QWidget *MHTabWidget::widget(int index) const +{ + int baseCount = QTabWidget::count(); + + // Check if it's just a normal tab + if (index < baseCount) + return QTabWidget::widget(index); + + // Otherwise it's going to be a window + return m_Windows.at(index - baseCount); +} + +void MHTabWidget::setCurrentIndex(int index) +{ + // Check if it's just a normal tab + if (index < QTabWidget::count()) + { + QTabWidget::setCurrentIndex(index); + } + else + { + // Otherwise it's going to be a window (just bring it up) + MHDetachedWindow* window = dynamic_cast(widget(index)->parent()); + window->activateWindow(); + } +} + +void MHTabWidget::setCurrentWidget(QWidget *widget) +{ + widget = 0; + // To be implemented. +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::MoveTab(int fromIndex, int toIndex) +{ + removeTab(fromIndex); + insertTab(toIndex, widget(fromIndex), tabIcon(fromIndex), tabText(fromIndex)); + setCurrentIndex(toIndex); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::DetachTab(int index, QPoint& dropPoint) +{ + Q_UNUSED(dropPoint); + // Create the window + MHDetachedWindow* detachedWidget = new MHDetachedWindow(parentWidget(), this); + detachedWidget->setWindowModality(Qt::NonModal); + + // Find Widget and connect + connect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + + detachedWidget->setWindowTitle(tabText(index)); + detachedWidget->setWindowIcon(tabIcon(index)); + + // Remove from tab bar + QWidget* tearOffWidget = widget(index); + tearOffWidget->setParent(detachedWidget); + + // Add it to the windows list + m_Windows.append(tearOffWidget); + + // Make first active + if (count() > 0) + setCurrentIndex(0); + + // Create and show + detachedWidget->setCentralWidget(tearOffWidget); + + // Needs to be done explicitly + tearOffWidget->show(); + QRect screenGeometry = QApplication::desktop()->screenGeometry(); + int w = 640; + int h = 480; + int x = (screenGeometry.width() - w) / 2; + int y = (screenGeometry.height() - h) / 2; + detachedWidget->show(); + detachedWidget->setGeometry(x, y, w, h); + detachedWidget->show(); +} + +////////////////////////////////////////////////////////////////////////////// +void MHTabWidget::AttachTab(QWidget *parent) +{ + // Retrieve widget + MHDetachedWindow* detachedWidget = dynamic_cast(parent); + QWidget* tearOffWidget = detachedWidget->centralWidget(); + + // Reattach the tab + int newIndex = addTab(tearOffWidget, detachedWidget->windowIcon(), detachedWidget->windowTitle()); + + // Remove it from the windows list + for(int i = 0; i < m_Windows.size(); i++) + { + if (m_Windows.at(i) == tearOffWidget) + m_Windows.removeAt(i); + } + + // Make Active + if (newIndex != -1) + setCurrentIndex(newIndex); + + // Cleanup Window + disconnect(detachedWidget, SIGNAL(OnClose(QWidget*)), this, SLOT(AttachTab(QWidget*))); + detachedWidget->hide(); + detachedWidget->close(); +} + +//---------------------------------------------------------------------------- + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::MHDetachedWindow(QWidget *parent, MHTabWidget *tabwidget) : QMainWindow(parent) +{ + m_TabWidget = tabwidget; +} + +////////////////////////////////////////////////////////////////////////////// +MHDetachedWindow::~MHDetachedWindow(void) +{ +} + +/* +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::moveEvent(QMoveEvent *event) +{ + QRect rect = m_TabWidget->geometry(); + QSize hint = m_TabWidget->tabBar()->sizeHint(); + + // Height of the actual top tab bar + rect.setBottom(rect.top() + hint.height()); + QPoint pos1(rect.x(), rect.y()); + pos1=m_TabWidget->mapToGlobal(pos1); + rect.setX(pos1.x()); + rect.setY(pos1.y()); + + if (rect.contains(event->pos())) + { + m_TabWidget->AttachTab(this); + event->accept(); + } + else + { + QMainWindow::moveEvent(event); + } +} +*/ + +////////////////////////////////////////////////////////////////////////////// +void MHDetachedWindow::closeEvent(QCloseEvent* /*event*/) +{ + emit OnClose(this); +} diff --git a/x64_dbg_gui/Project/Src/Gui/TabWidget.h b/x64_dbg_gui/Project/Src/Gui/TabWidget.h index 874913fb..4224ecf3 100644 --- a/x64_dbg_gui/Project/Src/Gui/TabWidget.h +++ b/x64_dbg_gui/Project/Src/Gui/TabWidget.h @@ -1,79 +1,79 @@ -#ifndef __MHTABWIDGET_H__ -#define __MHTABWIDGET_H__ - -// Qt includes -#include -#include -#include -#include -#include -#include - -// Qt forward class definitions -class MHTabBar; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHTabWidget implements the a Tab Widget with detach and attach -// functionality. -////////////////////////////////////////////////////////////////////////////// -class MHTabWidget: public QTabWidget -{ - Q_OBJECT - -public: - MHTabWidget(QWidget *parent); - virtual ~MHTabWidget(void); - QTabBar* tabBar(); - -public slots: - int count() const; - QWidget *widget(int index) const; - - // Move Tab - void MoveTab(int fromIndex, int toIndex); - - // Detach Tab - void DetachTab(int index, QPoint&); - - // Attach Tab - void AttachTab(QWidget *parent); - -public Q_SLOTS: - void setCurrentIndex(int index); - void setCurrentWidget(QWidget *widget); - -protected: - -private: - MHTabBar* m_tabBar; - - QList m_Windows; -}; - -////////////////////////////////////////////////////////////////////////////// -// Summary: -// MHDetachedWindow implements the WindowContainer for the Detached Widget -// -// Conditions: -// Header : MHTabWidget.h -////////////////////////////////////////////////////////////////////////////// -class MHDetachedWindow : public QMainWindow -{ - Q_OBJECT -public: - MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0); - ~MHDetachedWindow(void); - -protected: - MHTabWidget *m_TabWidget; - - //virtual void moveEvent(QMoveEvent *event); - void closeEvent(QCloseEvent *event); - -signals: - void OnClose(QWidget* widget); -}; - -#endif // __MHTABWIDGET_H__ - +#ifndef __MHTABWIDGET_H__ +#define __MHTABWIDGET_H__ + +// Qt includes +#include +#include +#include +#include +#include +#include + +// Qt forward class definitions +class MHTabBar; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHTabWidget implements the a Tab Widget with detach and attach +// functionality. +////////////////////////////////////////////////////////////////////////////// +class MHTabWidget: public QTabWidget +{ + Q_OBJECT + +public: + MHTabWidget(QWidget *parent); + virtual ~MHTabWidget(void); + QTabBar* tabBar(); + +public slots: + int count() const; + QWidget *widget(int index) const; + + // Move Tab + void MoveTab(int fromIndex, int toIndex); + + // Detach Tab + void DetachTab(int index, QPoint&); + + // Attach Tab + void AttachTab(QWidget *parent); + +public Q_SLOTS: + void setCurrentIndex(int index); + void setCurrentWidget(QWidget *widget); + +protected: + +private: + MHTabBar* m_tabBar; + + QList m_Windows; +}; + +////////////////////////////////////////////////////////////////////////////// +// Summary: +// MHDetachedWindow implements the WindowContainer for the Detached Widget +// +// Conditions: +// Header : MHTabWidget.h +////////////////////////////////////////////////////////////////////////////// +class MHDetachedWindow : public QMainWindow +{ + Q_OBJECT +public: + MHDetachedWindow(QWidget *parent = 0, MHTabWidget *tabwidget = 0); + ~MHDetachedWindow(void); + +protected: + MHTabWidget *m_TabWidget; + + //virtual void moveEvent(QMoveEvent *event); + void closeEvent(QCloseEvent *event); + +signals: + void OnClose(QWidget* widget); +}; + +#endif // __MHTABWIDGET_H__ + diff --git a/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.cpp b/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.cpp index 663a1d73..fce25a87 100644 --- a/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.cpp +++ b/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.cpp @@ -22,9 +22,9 @@ MapViewOfMem::MapViewOfMem(QString file) QFile wFile(file); if(wFile.open(QIODevice::ReadOnly) == false) - //qDebug() << "File has not been opened."; + //qDebug() << "File has not been opened."; - mData = wFile.readAll(); + mData = wFile.readAll(); //qDebug() << "Size: " << mData.size(); if(mData.size() == 0) diff --git a/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.h b/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.h index 8c395f63..2fda3dd6 100644 --- a/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.h +++ b/x64_dbg_gui/Project/Src/Memory/MapViewOfMem.h @@ -18,41 +18,41 @@ typedef struct _Selection_t class MapViewOfMem { - public: - MapViewOfMem(); - explicit MapViewOfMem(QString file); - explicit MapViewOfMem(uint_t startAddress , uint_t size); - ~MapViewOfMem(); - byte_t readByte(uint_t rva); - uint_t size(); - unsigned char *data(); +public: + MapViewOfMem(); + explicit MapViewOfMem(QString file); + explicit MapViewOfMem(uint_t startAddress , uint_t size); + ~MapViewOfMem(); + byte_t readByte(uint_t rva); + uint_t size(); + unsigned char *data(); - Selection_t getSelection(); - void setSelection(Selection_t sel); + Selection_t getSelection(); + void setSelection(Selection_t sel); - uint_t getBase(); - byte_t* getDataPtrForGui(uint_t rva, uint_t maxNbrOfBytesToRead, uint_t newCacheSize); + uint_t getBase(); + byte_t* getDataPtrForGui(uint_t rva, uint_t maxNbrOfBytesToRead, uint_t newCacheSize); - private: - typedef struct _MemDataCacheStruct_t - { - QVector* memDataCachePtr; - uint_t memDataCacheSize; - uint_t rva; - bool isInit; - } MemDataCacheStruct_t; +private: + typedef struct _MemDataCacheStruct_t + { + QVector* memDataCachePtr; + uint_t memDataCacheSize; + uint_t rva; + bool isInit; + } MemDataCacheStruct_t; - uint_t mBase; - unsigned long mStartAddress; - unsigned long mEndAddress; - unsigned long mSize; + uint_t mBase; + unsigned long mStartAddress; + unsigned long mEndAddress; + unsigned long mSize; - QByteArray mData; + QByteArray mData; - Selection_t mSelectedData; + Selection_t mSelectedData; - MemDataCacheStruct_t mGuiMemDataCache; + MemDataCacheStruct_t mGuiMemDataCache; }; #endif // MAPVIEWOFMEM_H diff --git a/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp b/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp index 59212a4f..94f594aa 100644 --- a/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp +++ b/x64_dbg_gui/Project/Src/Memory/ProcessMemoryMap.cpp @@ -119,17 +119,17 @@ void ProcessMemoryMap::printVirtualMemoryMap(QList par // State switch(wMemInfo.State) { - case MEM_FREE: - wTmpStr = QString("Free"); - break; - case MEM_COMMIT: - wTmpStr = QString("Commited"); - break; - case MEM_RESERVE: - wTmpStr = QString("Reserved"); - break; - default: - wTmpStr = QString("N/A"); + case MEM_FREE: + wTmpStr = QString("Free"); + break; + case MEM_COMMIT: + wTmpStr = QString("Commited"); + break; + case MEM_RESERVE: + wTmpStr = QString("Reserved"); + break; + default: + wTmpStr = QString("N/A"); } wStr += wTmpStr + QString(" ").repeated(10 - wTmpStr.length()); wStr += " | "; @@ -145,36 +145,36 @@ void ProcessMemoryMap::printVirtualMemoryMap(QList par { switch(wMemInfo.Protect & 0xFF) { - case PAGE_EXECUTE: - wTmpStr = QString("Execute"); - break; - case PAGE_EXECUTE_READ: - wTmpStr = QString("Execute/Read"); - break; - case PAGE_EXECUTE_READWRITE: - wTmpStr = QString("Execute/Read/Write"); - break; - case PAGE_NOACCESS: - wTmpStr = QString("No Access"); - break; - case PAGE_READONLY: - wTmpStr = QString("Read"); - break; - case PAGE_READWRITE: - wTmpStr = QString("Read/Write"); - break; - case PAGE_WRITECOPY: - wTmpStr = QString("Copy on Write"); - break; - case PAGE_EXECUTE_WRITECOPY: - wTmpStr = QString("Execute/Copy on Write"); - break; + case PAGE_EXECUTE: + wTmpStr = QString("Execute"); + break; + case PAGE_EXECUTE_READ: + wTmpStr = QString("Execute/Read"); + break; + case PAGE_EXECUTE_READWRITE: + wTmpStr = QString("Execute/Read/Write"); + break; + case PAGE_NOACCESS: + wTmpStr = QString("No Access"); + break; + case PAGE_READONLY: + wTmpStr = QString("Read"); + break; + case PAGE_READWRITE: + wTmpStr = QString("Read/Write"); + break; + case PAGE_WRITECOPY: + wTmpStr = QString("Copy on Write"); + break; + case PAGE_EXECUTE_WRITECOPY: + wTmpStr = QString("Execute/Copy on Write"); + break; } switch(wMemInfo.Protect & 0xFF00) { - case PAGE_GUARD: - wTmpStr += QString(" + Guard"); + case PAGE_GUARD: + wTmpStr += QString(" + Guard"); } wStr += wTmpStr + QString(" ").repeated(30 - wTmpStr.length()); @@ -184,18 +184,18 @@ void ProcessMemoryMap::printVirtualMemoryMap(QList par // Type switch(wMemInfo.Type) { - case MEM_IMAGE: - wTmpStr = QString("Image"); - break; - case MEM_MAPPED: - wTmpStr = QString("Mapped"); - break; - case MEM_PRIVATE: - wTmpStr = QString("Private"); - break; - default: - wTmpStr = QString("N/A"); - break; + case MEM_IMAGE: + wTmpStr = QString("Image"); + break; + case MEM_MAPPED: + wTmpStr = QString("Mapped"); + break; + case MEM_PRIVATE: + wTmpStr = QString("Private"); + break; + default: + wTmpStr = QString("N/A"); + break; } wStr += wTmpStr + QString(" ").repeated(10 - wTmpStr.length()); diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp index 94427096..b53a5f05 100644 --- a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp @@ -1,110 +1,121 @@ -#include "ApiFingerprints.h" -#include "Configuration.h" - - - -/** - * @brief retrieves information (name, arguments) for given api function from database - * @param name of dll without ".dll" - * @param name of function - * @remark upper or lower case doesn't matter - * @return - */ -const APIFunction ApiFingerprints::function(QString dllname,QString functionname) const{ - return Library.constFind(dllname.toLower().trimmed()).value().constFind(functionname.toLower().trimmed()).value(); - /* - * example - * -------------------- - * "int MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)" - * - * APIFunction f = function("UsEr32 ","messAgebOxa"); - * f.Name = "MessageBoxA"; - * f.DLLName = "user32"; - * f.ReturnType = "int" - * f.Arguments.at(0).Name = "hWnd"; - * f.Arguments.at(0).Type = "HWND"; - * f.Arguments.at(1).Name = "lpText"; - * f.Arguments.at(1).Type = "LPCTSTR"; - * ... - * - * upper / lower case doesn't matter and additional whitespace will be trimmed - */ - - -} - - -ApiFingerprints::ApiFingerprints() -{ - // the config file should contain a list of possible data files for api calls - QList files = Configuration::instance()->ApiFingerprints(); - - // iterate all given files - foreach(QString file, files){ - QFile mFile("data/"+file+".txt"); - if(mFile.open(QFile::ReadOnly | QFile::Text)){ - // if file exists --> parse file - - QMap Functions; - QTextStream in(&mFile); - while ( !in.atEnd() ) - { - // reads raw line like "int;MessageBoxA;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;" - QString rawFunctionDescr = in.readLine(); - QStringList functionParts = rawFunctionDescr.split(";"); - // format : retType;FunctionName;Arg1;Arg2;Arg3;... - - - if(functionParts.count()<2){ - // each function description needs at least a return type and a name - // if not, we ignore the data - continue; - } - - // function data - APIFunction func; - func.DLLName = file; - func.ReturnType = functionParts.at(0); - func.Name = functionParts.at(1); - - // read parameters - for(int i=2;i use "*" to split type and name of argument - QStringList par = rawArgument.split("*"); - APIArgument arg; - if(par.count() > 1){ - arg.Name = par.at(1).trimmed(); - arg.Type = par.at(0).trimmed()+"*"; - - }else{ - // current argument is no pointer --> use " " to split - par = rawArgument.split(" "); - if(par.count()>1){ - arg.Name = par.at(1).trimmed(); - arg.Type = par.at(0).trimmed(); - }else{ - // we assume that there is only the type - arg.Name = ""; - arg.Type = rawArgument.trimmed(); - } - } - - func.Arguments.append(arg); - - } - - Functions.insert(func.Name.toLower().trimmed(),func); - - } - - Library.insert(file,Functions); - mFile.close(); - } - - } - -} +#include "ApiFingerprints.h" +#include "Configuration.h" + + + +/** + * @brief retrieves information (name, arguments) for given api function from database + * @param name of dll without ".dll" + * @param name of function + * @remark upper or lower case doesn't matter + * @return + */ +const APIFunction ApiFingerprints::function(QString dllname,QString functionname) const +{ + return Library.constFind(dllname.toLower().trimmed()).value().constFind(functionname.toLower().trimmed()).value(); + /* + * example + * -------------------- + * "int MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)" + * + * APIFunction f = function("UsEr32 ","messAgebOxa"); + * f.Name = "MessageBoxA"; + * f.DLLName = "user32"; + * f.ReturnType = "int" + * f.Arguments.at(0).Name = "hWnd"; + * f.Arguments.at(0).Type = "HWND"; + * f.Arguments.at(1).Name = "lpText"; + * f.Arguments.at(1).Type = "LPCTSTR"; + * ... + * + * upper / lower case doesn't matter and additional whitespace will be trimmed + */ + + +} + + +ApiFingerprints::ApiFingerprints() +{ + // the config file should contain a list of possible data files for api calls + QList files = Configuration::instance()->ApiFingerprints(); + + // iterate all given files + foreach(QString file, files) + { + QFile mFile("data/"+file+".txt"); + if(mFile.open(QFile::ReadOnly | QFile::Text)) + { + // if file exists --> parse file + + QMap Functions; + QTextStream in(&mFile); + while ( !in.atEnd() ) + { + // reads raw line like "int;MessageBoxA;HWND hWnd;LPCTSTR lpText;LPCTSTR lpCaption;UINT uType;" + QString rawFunctionDescr = in.readLine(); + QStringList functionParts = rawFunctionDescr.split(";"); + // format : retType;FunctionName;Arg1;Arg2;Arg3;... + + + if(functionParts.count()<2) + { + // each function description needs at least a return type and a name + // if not, we ignore the data + continue; + } + + // function data + APIFunction func; + func.DLLName = file; + func.ReturnType = functionParts.at(0); + func.Name = functionParts.at(1); + + // read parameters + for(int i=2; i use "*" to split type and name of argument + QStringList par = rawArgument.split("*"); + APIArgument arg; + if(par.count() > 1) + { + arg.Name = par.at(1).trimmed(); + arg.Type = par.at(0).trimmed()+"*"; + + } + else + { + // current argument is no pointer --> use " " to split + par = rawArgument.split(" "); + if(par.count()>1) + { + arg.Name = par.at(1).trimmed(); + arg.Type = par.at(0).trimmed(); + } + else + { + // we assume that there is only the type + arg.Name = ""; + arg.Type = rawArgument.trimmed(); + } + } + + func.Arguments.append(arg); + + } + + Functions.insert(func.Name.toLower().trimmed(),func); + + } + + Library.insert(file,Functions); + mFile.close(); + } + + } + +} diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h index c30dcda4..f4b1eb34 100644 --- a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h @@ -1,28 +1,30 @@ -#ifndef APIFINGERPRINTS_H -#define APIFINGERPRINTS_H - -#include -#include -#include - -struct APIArgument{ - QString Type; - QString Name; -}; - -struct APIFunction{ - QString DLLName; - QString ReturnType; - QString Name; - QList Arguments; -}; - -class ApiFingerprints -{ - QMap> Library; -public: - ApiFingerprints(); - const APIFunction function(QString dllname, QString functionname) const; -}; - -#endif // APIFINGERPRINTS_H +#ifndef APIFINGERPRINTS_H +#define APIFINGERPRINTS_H + +#include +#include +#include + +struct APIArgument +{ + QString Type; + QString Name; +}; + +struct APIFunction +{ + QString DLLName; + QString ReturnType; + QString Name; + QList Arguments; +}; + +class ApiFingerprints +{ + QMap> Library; +public: + ApiFingerprints(); + const APIFunction function(QString dllname, QString functionname) const; +}; + +#endif // APIFINGERPRINTS_H diff --git a/x64_dbg_gui/Project/Src/Utils/Breakpoints.cpp b/x64_dbg_gui/Project/Src/Utils/Breakpoints.cpp index a3f2b9e1..f433b852 100644 --- a/x64_dbg_gui/Project/Src/Utils/Breakpoints.cpp +++ b/x64_dbg_gui/Project/Src/Utils/Breakpoints.cpp @@ -19,29 +19,29 @@ void Breakpoints::setBP(BPXTYPE type, uint_t va) switch(type) { - case bp_normal: - { - wCmd = "bp " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_normal: + { + wCmd = "bp " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - case bp_hardware: - { - wCmd = "bph " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_hardware: + { + wCmd = "bph " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - case bp_memory: - { - wCmd = "bpm " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_memory: + { + wCmd = "bpm " + QString("%1").arg(va, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - default: - { + default: + { - } - break; + } + break; } DbgCmdExec(wCmd.toUtf8().constData()); @@ -177,29 +177,29 @@ void Breakpoints::removeBP(BRIDGEBP bp) switch(bp.type) { - case bp_normal: - { - wCmd = "bc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_normal: + { + wCmd = "bc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - case bp_hardware: - { - wCmd = "bphc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_hardware: + { + wCmd = "bphc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - case bp_memory: - { - wCmd = "bpmc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); - } - break; + case bp_memory: + { + wCmd = "bpmc " + QString("%1").arg(bp.addr, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + } + break; - default: - { + default: + { - } - break; + } + break; } DbgCmdExec(wCmd.toUtf8().constData()); @@ -316,17 +316,17 @@ void Breakpoints::toogleBPByRemoving(BPXTYPE type, uint_t va) switch(wBPList.bp[wI].type) { - case bp_normal: - wNormalWasRemoved = true; - break; - case bp_memory: - wMemoryWasRemoved = true; - break; - case bp_hardware: - wHardwareWasRemoved = true; - break; - default: - break; + case bp_normal: + wNormalWasRemoved = true; + break; + case bp_memory: + wMemoryWasRemoved = true; + break; + case bp_hardware: + wHardwareWasRemoved = true; + break; + default: + break; } } } From 452f9beff446198c33f1425d3a9159dd1ebe4651 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 10 Jun 2014 19:18:39 +0200 Subject: [PATCH 059/676] GUI: Qt4 compatible + various fixed in the CPUSideBar --- x64_dbg_gui/Project/DebuggerX64.pro | 8 +- .../Project/Src/BasicView/Disassembly.cpp | 2 +- .../Project/Src/Disassembler/QBeaEngine.h | 2 - x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp | 282 ------------------ x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 262 ++++++++++++++++ .../Src/Gui/{CPUJumps.h => CPUSideBar.h} | 40 ++- x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 18 +- x64_dbg_gui/Project/Src/Gui/CPUWidget.h | 4 +- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 91 +++--- x64_dbg_gui/Project/Src/Gui/Configuration.h | 16 +- 10 files changed, 361 insertions(+), 364 deletions(-) delete mode 100644 x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp rename x64_dbg_gui/Project/Src/Gui/{CPUJumps.h => CPUSideBar.h} (56%) diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 03a2446f..44421f1e 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -65,9 +65,9 @@ SOURCES += \ Src/Gui/TabWidget.cpp \ Src/BasicView/CommandHelpView.cpp \ Src/BasicView/HistoryLineEdit.cpp \ - Src/Gui/CPUJumps.cpp \ Src/Gui/Configuration.cpp \ - Src/Utils/ApiFingerprints.cpp + Src/Utils/ApiFingerprints.cpp \ + Src/Gui/CPUSideBar.cpp HEADERS += \ @@ -113,9 +113,9 @@ HEADERS += \ Src/Gui/TabWidget.h \ Src/BasicView/CommandHelpView.h \ Src/BasicView/HistoryLineEdit.h \ - Src/Gui/CPUJumps.h \ Src/Gui/Configuration.h \ - Src/Utils/ApiFingerprints.h + Src/Utils/ApiFingerprints.h \ + Src/Gui/CPUSideBar.h INCLUDEPATH += \ diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 9a80a156..4dd1157e 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -220,7 +220,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse int funcsize = paintFunctionGraphic(painter, x, y, funcType, false); //draw jump arrows - int jumpsize = 7;//paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line + int jumpsize = paintJumpsGraphic(painter, x + funcsize, y, wRVA); //jump line //draw bytes painter->save(); diff --git a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h index 6739bdc7..f7a471bf 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h +++ b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h @@ -17,8 +17,6 @@ typedef struct _Instruction_t DISASM disasm; } Instruction_t; - - class QBeaEngine { diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp b/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp deleted file mode 100644 index 8f6418c0..00000000 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include "CPUJumps.h" -#include "Configuration.h" -CPUJumps::CPUJumps(CPUDisassembly *Ptr, QWidget *parent) : - QAbstractScrollArea(parent) -{ - - topVA = -1; - selectedVA = -1; - viewableRows = 0; - - CodePtr = Ptr; - - m_DefaultFont = QFont("Monospace", 8); - - const QFontMetrics metrics(m_DefaultFont); - fontWidth = metrics.width('W'); - fontHeight = metrics.height(); - - InstrBuffer = CodePtr->instructionsBuffer(); - - connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); -} - -QSize CPUJumps::sizeHint() const -{ - return QSize(40,this->viewport()->height()); -} - - -void CPUJumps::disassembleAt(int_t parVA, int_t parCIP) -{ - //repaint(); -} - -void CPUJumps::repaint() -{ - - viewport()->repaint(); -} - -void CPUJumps::changeTopmostAddress(int i) -{ - if(i!=topVA) - { - topVA = i; - qDebug() << i; - repaint(); - } -} - -void CPUJumps::setViewableRows(int rows) -{ - viewableRows = rows; -} - -void CPUJumps::setSelection(int_t selVA) -{ - if(selVA != selectedVA) - { - selectedVA = selVA; - repaint(); - } -} - -bool CPUJumps::isJump(int i) const -{ - - int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; - if(BranchType && BranchType!=RetType && BranchType!=CallType) - { - return true; - } - return false; -} - -void CPUJumps::paintEvent(QPaintEvent *event) -{ - if(InstrBuffer->size() ==0) - return; - - painter = new QPainter(viewport()); - - int jumpoffset = 0; - - int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); - int_t first_va = InstrBuffer->first().rva + CodePtr->getBase(); - - for(int line=0; lineat(line).rva + CodePtr->getBase()) == bp_none); - - - if(isJump(line)) - { - jumpoffset++; - - int_t destRVA = (int_t)InstrBuffer->at(line).disasm.Instruction.AddrValue; - - if( InstrBuffer->at(line).disasm.Instruction.Opcode == 0xFF) - continue; - - - bool cond = !((InstrBuffer->at(line).disasm.Instruction.Opcode == 0xEB) || InstrBuffer->at(line).disasm.Instruction.Opcode == 0xE9); - if(destRVA <= last_va && destRVA >= first_va) - { - - int destLine = line+1; - - while(InstrBuffer->at(destLine).rva + CodePtr->getBase() != destRVA - && destLine at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - - - } - else if(destRVA > last_va) - { - drawJump(line, - viewableRows+6, - jumpoffset, - cond, - DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - } - else if(destRVA < first_va) - { - drawJump(line, - -6, - jumpoffset, - cond, - DbgIsJumpGoingToExecute(InstrBuffer->at(line).rva+CodePtr->getBase())&&CodePtr->currentEIP() == InstrBuffer->at(line).rva, - selectedVA == InstrBuffer->at(line).rva+CodePtr->getBase()); - } - - } - - if(InstrBuffer->at(line).rva == CodePtr->currentEIP()) - { - drawLabel(line,"EIP"); - } - - } - - - //delete painter; -} - -void CPUJumps::drawJump(int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute, bool isactive) -{ - painter->save(); - if(!conditional) - { - painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp - } - else - { - painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); - } - QPen tmp = painter->pen(); - if(isexecute) - { - tmp.setWidth(2); - //tmp.setColor(Qt::red); - } - if(isactive) - { - tmp.setColor(Qt::red); - } - painter->setPen(tmp); - - const int JumpPadding = 15; - - const int x = viewport()->width()-jumpoffset*JumpPadding - 12; - const int x_right = viewport()->width()- 12; - const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; - const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; - - // vertical - painter->drawLine(x,y_start,x,y_end); - // start horizontal - painter->drawLine(x,y_start,x_right,y_start); - painter->drawLine(x,y_end,x_right,y_end); - - const int ArrowSizeX = 2; // width of arrow tip in pixel - const int ArrowSizeY = 3; // height of arrow tip in pixel - - - tmp = painter->pen(); - tmp.setStyle(Qt::SolidLine); - tmp.setWidth(2); - painter->setPen(tmp); - painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); - painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); - - - painter->restore(); -} - -void CPUJumps::drawBullets(int line, bool isbp) -{ - - - painter->save(); - - if( isbp) - painter->setBrush(QBrush("#808080")); - else - painter->setBrush(QBrush(Qt::red)); - - const int y = fontHeight*(1+line)-0.8*fontHeight ; - const int x = viewport()->width() - 10; - const int radius = 8; - - painter->setRenderHint(QPainter::Antialiasing, true); - painter->setPen(QPen("#ffffff")); - painter->drawEllipse(x,y,radius,radius); - - - - painter->restore(); -} - - - - -void CPUJumps::drawLabel(int Line, QString Text) -{ - - painter->save(); - const int LineCoordinate = fontHeight*(1+Line); - int length = Text.length(); - - painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); - painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"))); - int y = LineCoordinate-fontHeight; - - painter->drawRect(1,y,length*fontWidth,fontHeight); - painter->setPen(QPen(Configuration::instance()->color("EIPLabel"))); - painter->drawText(2,LineCoordinate-0.2*fontHeight,Text); - - y = fontHeight*(1+Line)-0.5*fontHeight; - painter->setPen(QPen(Configuration::instance()->color("EIPLabelBG"),2)); - painter->setBrush(QBrush(Configuration::instance()->color("EIPLabelBG"))); - - drawStraightArrow(painter,length*fontWidth,y,this->viewport()->width()-2-15,y); - painter->restore(); - -} - -void CPUJumps::drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2) -{ - - - painter->drawLine(x1,y1,x2,y2); - - - - /* - // this does not work - QPainterPath path; - - path.moveTo( QPointF(x2, x2)); - path.lineTo (QPointF(x2-ArrowSizeX,y2-ArrowSizeY)); - path.lineTo (QPointF(x2-ArrowSizeX,y2+ArrowSizeY)); - path.closeSubpath(); - - painter->setPen (Qt :: NoPen); - painter->fillPath (path, QBrush (color));*/ - const int ArrowSizeX = 4; // width of arrow tip in pixel - const int ArrowSizeY = 4; // height of arrow tip in pixel - - - painter->drawLine(x2,y2,x2-ArrowSizeX,y2-ArrowSizeY); - painter->drawLine(x2,y2,x2-ArrowSizeX,y2+ArrowSizeY); - -} - diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp new file mode 100644 index 00000000..46b83945 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -0,0 +1,262 @@ +#include "CPUSideBar.h" +#include "Configuration.h" + +CPUSideBar::CPUSideBar(CPUDisassembly *Ptr, QWidget *parent) : QAbstractScrollArea(parent) +{ + + topVA = -1; + selectedVA = -1; + viewableRows = 0; + + CodePtr = Ptr; + + m_DefaultFont = CodePtr->font(); + this->setFont(m_DefaultFont); + + const QFontMetrics metrics(m_DefaultFont); + fontWidth = metrics.width(' '); + fontHeight = metrics.height(); + + InstrBuffer = CodePtr->instructionsBuffer(); + + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); +} + +QSize CPUSideBar::sizeHint() const +{ + return QSize(40,this->viewport()->height()); +} + +void CPUSideBar::disassembleAt(int_t parVA, int_t parCIP) +{ + MessageBeep(0); +} + +void CPUSideBar::repaint() +{ + fontHeight = CodePtr->getRowHeight(); + viewport()->repaint(); +} + +void CPUSideBar::changeTopmostAddress(int i) +{ + if(i!=topVA) + { + topVA = i; + //qDebug() << i; + repaint(); + } +} + +void CPUSideBar::setViewableRows(int rows) +{ + viewableRows = rows; +} + +void CPUSideBar::setSelection(int_t selVA) +{ + if(selVA != selectedVA) + { + selectedVA = selVA; + repaint(); + } +} + +bool CPUSideBar::isJump(int i) const +{ + int BranchType=InstrBuffer->at(i).disasm.Instruction.BranchType; + if(BranchType && BranchType!=RetType && BranchType!=CallType) + { + return true; + } + return false; +} + +void CPUSideBar::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + if(InstrBuffer->size() == 0) + return; + + QPainter painter(this->viewport()); + + int jumpoffset = 0; + + int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); + int_t first_va = InstrBuffer->first().rva + CodePtr->getBase(); + + for(int line=0; lineat(line); + int_t instrVA = instr.rva + CodePtr->getBase(); + + // draw bullet + drawBullets(&painter, line, DbgGetBpxTypeAt(instrVA) == bp_none); + + if(isJump(line)) //handle jumps + { + bool isJumpGoingToExecute = DbgIsJumpGoingToExecute(instrVA); + bool isSelected = (selectedVA == instrVA); + + /* + if(CodePtr->currentEIP() != InstrBuffer->at(line).rva) //create a setting for this + isJumpGoingToExecute=false; + */ + + jumpoffset++; + + int_t destVA = (int_t)instr.disasm.Instruction.AddrValue; + + if(instr.disasm.Instruction.Opcode == 0xFF) + continue; + + bool isConditional = !((instr.disasm.Instruction.Opcode == 0xEB) || instr.disasm.Instruction.Opcode == 0xE9); + + if(destVA <= last_va && destVA >= first_va) + { + int destLine = line + 1; + while(instrVA != destVA && destLine < viewableRows) + destLine++; + drawJump(&painter, line, destLine, jumpoffset, isConditional, isJumpGoingToExecute, isSelected); + } + else if(destVA > last_va) + drawJump(&painter, line, viewableRows+6, jumpoffset, isConditional, isJumpGoingToExecute, isSelected); + else if(destVA < first_va) + drawJump(&painter, line, -6, jumpoffset, isConditional, isJumpGoingToExecute, isSelected); + } + + if(InstrBuffer->at(line).rva == CodePtr->currentEIP()) +#ifdef _WIN64 + drawLabel(&painter, line, "RIP"); +#else //x86 + drawLabel(&painter, line, "EIP"); +#endif + } +} + +void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpoffset, bool conditional, bool isexecute, bool isactive) +{ + painter->save(); + if(!conditional) + painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp + else + painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); + QPen tmp = painter->pen(); + + if(isactive) + { + if(isexecute) //only highlight selected jumps + tmp.setColor(Qt::red); + tmp.setWidth(2); + } + painter->setPen(tmp); + + const int JumpPadding = 15; + + const int x = viewport()->width()-jumpoffset*JumpPadding - 12; + const int x_right = viewport()->width()- 12; + const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; + const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; + + // vertical + painter->drawLine(x,y_start,x,y_end); + // start horizontal + painter->drawLine(x,y_start,x_right,y_start); + painter->drawLine(x,y_end,x_right,y_end); + + const int ArrowSizeX = 2; // width of arrow tip in pixel + const int ArrowSizeY = 3; // height of arrow tip in pixel + + + tmp = painter->pen(); + tmp.setStyle(Qt::SolidLine); + tmp.setWidth(2); + painter->setPen(tmp); + painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); + painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); + + + painter->restore(); +} + +void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp) +{ + painter->save(); + + if( isbp) + painter->setBrush(QBrush("#808080")); + else + painter->setBrush(QBrush(Qt::red)); + + const int radius = fontHeight/2; //14/2=7 + const int y = line*fontHeight; //initial y + const int yAdd = (fontHeight-radius)/2+1; + const int x = viewport()->width() - 10; //initial x + + //painter->drawLine(0, y, viewport()->width(), y); //draw raster + + painter->setRenderHint(QPainter::Antialiasing, true); + painter->setPen(QPen("#ffffff")); + painter->drawEllipse(x, y+yAdd, radius, radius); + + painter->restore(); +} + +void CPUSideBar::drawLabel(QPainter* painter, int Line, QString Text) +{ + painter->save(); + const int LineCoordinate = fontHeight*(1+Line); + int length = Text.length(); + + const QColor IPLabel = Configuration::instance()->color("IPLabel"); + const QColor IPLabelBG = Configuration::instance()->color("IPLabelBG"); + + int width = length*fontWidth + 2; + int x = 1; + int y = LineCoordinate-fontHeight; + + QRect rect(x, y, width, fontHeight); + + //draw rectangle + painter->setBrush(IPLabelBG); + painter->setPen(QPen(IPLabelBG)); + painter->drawRect(rect); + + //draw text inside the rectangle + painter->setPen(QPen(IPLabel)); + painter->drawText(rect, Qt::AlignHCenter | Qt::AlignVCenter, Text); + + //draw arrow + y = fontHeight*(1+Line)-0.5*fontHeight; + //y+=3; + painter->setPen(QPen(IPLabelBG, 2)); + painter->setBrush(QBrush(IPLabelBG)); + drawStraightArrow(painter, rect.right()+2, y, this->viewport()->width()-x-15, y); + + painter->restore(); +} + +void CPUSideBar::drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2) +{ + painter->drawLine(x1,y1,x2,y2); + + /* + // this does not work + QPainterPath path; + + path.moveTo( QPointF(x2, x2)); + path.lineTo (QPointF(x2-ArrowSizeX,y2-ArrowSizeY)); + path.lineTo (QPointF(x2-ArrowSizeX,y2+ArrowSizeY)); + path.closeSubpath(); + + painter->setPen (Qt :: NoPen); + painter->fillPath (path, QBrush (color));*/ + const int ArrowSizeX = 4; // width of arrow tip in pixel + const int ArrowSizeY = 4; // height of arrow tip in pixel + + painter->drawLine(x2,y2,x2-ArrowSizeX,y2-ArrowSizeY); + painter->drawLine(x2,y2,x2-ArrowSizeX,y2+ArrowSizeY); + +} + diff --git a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h similarity index 56% rename from x64_dbg_gui/Project/Src/Gui/CPUJumps.h rename to x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index b9be3153..60ffdfa1 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUJumps.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -1,44 +1,42 @@ -#ifndef CPUJUMPS_H -#define CPUJUMPS_H +#ifndef CPUSIDEBAR_H +#define CPUSIDEBAR_H #include "NewTypes.h" #include "Bridge.h" #include "CPUDisassembly.h" #include -class CPUJumps : public QAbstractScrollArea +class CPUSideBar : public QAbstractScrollArea { Q_OBJECT - - int_t topVA; - int_t selectedVA; - QPainter *painter; - QFont m_DefaultFont; - int fontWidth, fontHeight; - int viewableRows; - - CPUDisassembly *CodePtr; - QList *InstrBuffer; public: - explicit CPUJumps(CPUDisassembly *Ptr, QWidget *parent = 0); + explicit CPUSideBar(CPUDisassembly *Ptr, QWidget *parent = 0); QSize sizeHint() const; - void drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2); -signals: public slots: - void disassembleAt(int_t parVA, int_t parCIP); void repaint(); void changeTopmostAddress(int i); void setViewableRows(int rows); void setSelection(int_t selVA); + protected: void paintEvent(QPaintEvent *event); - void drawLabel(int Line, QString Text); - void drawBullets(int line, bool ispb); + void drawLabel(QPainter* painter, int Line, QString Text); + void drawBullets(QPainter* painter, int line, bool ispb); bool isJump(int i) const; - void drawJump(int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); + void drawJump(QPainter* painter, int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); + +private: + int_t topVA; + int_t selectedVA; + QFont m_DefaultFont; + int fontWidth, fontHeight; + int viewableRows; + + CPUDisassembly *CodePtr; + QList *InstrBuffer; }; -#endif // CPUJUMPS_H +#endif // CPUSIDEBAR_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index bf9cd00a..a86b7687 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -7,18 +7,18 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) setDefaultDisposition(); mDisas = new CPUDisassembly(0); - mJumps = new CPUJumps(mDisas); - connect(mDisas,SIGNAL(tableOffsetChanged(int)),mJumps,SLOT(changeTopmostAddress(int))); - connect(mDisas,SIGNAL(viewableRows(int)),mJumps,SLOT(setViewableRows(int))); - connect(mDisas,SIGNAL(repainted()),mJumps,SLOT(repaint())); - connect(mDisas,SIGNAL(selectionChanged(int_t)),mJumps,SLOT(setSelection(int_t))); + mSideBar = new CPUSideBar(mDisas); + connect(mDisas,SIGNAL(tableOffsetChanged(int)),mSideBar,SLOT(changeTopmostAddress(int))); + connect(mDisas,SIGNAL(viewableRows(int)),mSideBar,SLOT(setViewableRows(int))); + connect(mDisas,SIGNAL(repainted()),mSideBar,SLOT(repaint())); + connect(mDisas,SIGNAL(selectionChanged(int_t)),mSideBar,SLOT(setSelection(int_t))); - QSplitter *splitter = new QSplitter(this); - - splitter->addWidget(mJumps); + QSplitter* splitter = new QSplitter(this); + splitter->addWidget(mSideBar); splitter->addWidget(mDisas); - + splitter->setChildrenCollapsible(false); + splitter->setHandleWidth(1); ui->mTopLeftUpperFrameLayout->addWidget(splitter); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h index 8483e980..df452f81 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.h @@ -9,7 +9,7 @@ #include "CPUStack.h" #include "RegistersView.h" #include "InfoBox.h" -#include "CPUJumps.h" +#include "CPUSideBar.h" namespace Ui { @@ -31,7 +31,7 @@ public: QVBoxLayout* getBotRightWidget(void); public: - CPUJumps* mJumps; + CPUSideBar* mSideBar; CPUDisassembly* mDisas; RegistersView* mGeneralRegs; InfoBox* mInfo; diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 126af835..231471f9 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -5,9 +5,7 @@ Configuration* Configuration::mPtr = NULL; Configuration::Configuration() { - load("config.json"); - //Colors = new QMap(); - //Colors = QMap(); + load(); mPtr = this; } @@ -16,54 +14,47 @@ Configuration *Configuration::instance() return mPtr; } -void Configuration::load(QString filename) +void Configuration::load() { - // load configuration file - QFile configfile(filename); - - if (!configfile.open(QIODevice::ReadOnly)) - { - qWarning("Couldn't open config file."); - return ; - } - QByteArray saveData = configfile.readAll(); - Config = QJsonDocument(QJsonDocument::fromJson(saveData)).object(); - readColors(); - } void Configuration::readColors() { - Colors.clear(); - - QJsonArray ColorArray = Config["colors"].toArray(); - for (int idx = 0; idx < ColorArray.size(); ++idx) + //setup default color map + QMap defaultColorMap; + defaultColorMap.insert("DisassemblyCipColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyMainBpColor", QColor("#FF0000")); + defaultColorMap.insert("DisassemblyOtherBpColor", QColor("#FFFBF0")); + defaultColorMap.insert("DisassemblyBookmarkColor", QColor("#FEE970")); + defaultColorMap.insert("DisassemblyMainLabelColor", QColor("#FF0000")); + defaultColorMap.insert("blackaddress", QColor("#000000")); + defaultColorMap.insert("DisassemblySelectedAddressColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyBytesColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyCommentColor", QColor("#000000")); + defaultColorMap.insert("IPLabel", QColor("#FFFFFF")); + defaultColorMap.insert("IPLabelBG", QColor("#4040FF")); + Colors = defaultColors = defaultColorMap; + //read config + for(int i=0; i Configuration::ApiFingerprints() +const QList Configuration::ApiFingerprints() { - QList files; - QJsonArray APIArray = Config["apifingerprints"].toArray(); - for (int idx = 0; idx < APIArray.size(); ++idx) + char setting[MAX_SETTING_SIZE]=""; + if(!BridgeSettingGet("Engine", "APIFingerprints", setting)) { - QString filename = "data/"+APIArray.at(idx).toString()+".txt"; - QFile mFile(filename); - if(mFile.open(QFile::ReadOnly | QFile::Text)) - { - files.append(APIArray.at(idx).toString()); - mFile.close(); - } - + strcpy(setting, "gdi32,kernel32,shell32,stdio,user32"); //default setting + BridgeSettingSet("Engine", "APIFingerprints", setting); } - return files; + return QString(setting).split(QChar(','), QString::SkipEmptyParts); } -const QColor Configuration::color(QString id) const +const QColor Configuration::color(QString id) { if(Colors.contains(id)) return Colors.constFind(id).value(); @@ -71,3 +62,31 @@ const QColor Configuration::color(QString id) const return Qt::black; } +bool Configuration::colorToConfig(const QString id, const QColor color) +{ + return BridgeSettingSet("Colors", id.toUtf8().constData(), color.name().toUtf8().constData()); +} + +QColor Configuration::colorFromConfig(const QString id) +{ + char setting[MAX_SETTING_SIZE]=""; + if(!BridgeSettingGet("Colors", id.toUtf8().constData(), setting)) + { + if(defaultColors.contains(id)) + { + QColor ret = defaultColors.find(id).value(); + colorToConfig(id, ret); + return ret; + } + return QColor("#000000"); //black is default + } + QColor color(setting); + if(!color.isValid()) + { + QColor ret = defaultColors.find(id).value(); //return default + colorToConfig(id, ret); + return ret; + } + return color; +} + diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.h b/x64_dbg_gui/Project/Src/Gui/Configuration.h index 4138f01b..19ceb516 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.h +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.h @@ -6,23 +6,25 @@ #include #include #include +#include "Bridge.h" class Configuration { - QJsonObject Config; - QMap Colors; + QMap defaultColors; static Configuration* mPtr; public: Configuration(); - static Configuration* instance(); - + void load(); void readColors(); - const QColor color(QString id) const; - void load(QString filename); - QList ApiFingerprints(); + const QList ApiFingerprints(); + const QColor color(QString id); + +private: + QColor colorFromConfig(const QString id); + bool colorToConfig(const QString id, const QColor color); }; #endif // CONFIGURATION_H From 8d991e251ba397092724b6d1a3489acfde9e2920 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 10 Jun 2014 21:07:22 +0200 Subject: [PATCH 060/676] GUI: fixed a bug in CPUSideBar (background color + clear on stop debug) GUI: more color customizations --- .../Src/BasicView/AbstractTableView.cpp | 5 +- .../Project/Src/BasicView/Disassembly.cpp | 49 ++++++++----------- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 22 +++++++-- x64_dbg_gui/Project/Src/Gui/CPUSideBar.h | 2 + x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 6 +-- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 22 ++++++--- x64_dbg_gui/Project/Src/Gui/Configuration.h | 2 + 7 files changed, 61 insertions(+), 47 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index da3110bc..9adb1cf9 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -1,4 +1,5 @@ #include "AbstractTableView.h" +#include "Configuration.h" AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(parent) { @@ -19,7 +20,7 @@ AbstractTableView::AbstractTableView(QWidget *parent) : QAbstractScrollArea(pare font.setStyleHint(QFont::Monospace); this->setFont(font); - backgroundColor=QColor("#FFFBF0"); //AbstractTableViewBackgroundColor + backgroundColor=QColor(ConfigColor("AbstractTableViewBackgroundColor")); int wRowsHeight = QFontMetrics(this->font()).height(); wRowsHeight = (wRowsHeight * 105) / 100; @@ -118,7 +119,7 @@ void AbstractTableView::paintEvent(QPaintEvent* event) // Paints cell right borders wPainter.save(); - wPainter.setPen(QColor("#808080")); //AbstractTableViewSeparatorColor + wPainter.setPen(ConfigColor("AbstractTableViewSeparatorColor")); wPainter.drawLine(x + getColumnWidth(j) - 1, y, x + getColumnWidth(j) - 1, y + getRowHeight() - 1); wPainter.restore(); diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 4dd1157e..9531de86 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -33,7 +33,7 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) setShowHeader(false); //hide header - backgroundColor=QColor("#FFFBF0"); //DisassemblyBackgroundColor + backgroundColor=ConfigColor("DisassemblyBackgroundColor"); connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); @@ -65,7 +65,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse // Highlight if selected if(wIsSelected) - painter->fillRect(QRect(x, y, w, h), QBrush(QColor("#C0C0C0"))); //DisassemblySelectionColor + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblySelectionColor"))); switch(col) { @@ -118,21 +118,21 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->save(); if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip { - painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyCipColor"))); //DisassemblyCipColor + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyCipColor"))); //DisassemblyCipColor if(!isbookmark) { if(bpxtype&bp_normal) //breakpoint { - painter->setPen(QPen(Configuration::instance()->color("DisassemblyMainBpColor"))); //DisassemblyMainBpColor + painter->setPen(QPen(ConfigColor("DisassemblyMainBpColor"))); //DisassemblyMainBpColor } else { - painter->setPen(QPen(Configuration::instance()->color("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor + painter->setPen(QPen(ConfigColor("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor } } else { - painter->setPen(QPen(Configuration::instance()->color("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor + painter->setPen(QPen(ConfigColor("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor } } else //other address @@ -142,16 +142,16 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(*label) //label { if(bpxtype==bp_none) //label only - painter->setPen(QPen(Configuration::instance()->color("DisassemblyMainLabelColor"))); //red -> address + label text (DisassemblyMainLabelColor) + painter->setPen(QPen(ConfigColor("DisassemblyMainLabelColor"))); //red -> address + label text (DisassemblyMainLabelColor) else //label+breakpoint { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) } else { - painter->setPen(QPen(Configuration::instance()->color("blackaddress"))); //black address (???) + painter->setPen(QPen(ConfigColor("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor } } } @@ -160,33 +160,33 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(bpxtype==bp_none) //no label, no breakpoint { if(wIsSelected) - painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(ConfigColor("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor + painter->setPen(QPen(ConfigColor("DisassemblyAddressColor"))); //DisassemblyAddressColor } else //breakpoint only { if(bpxtype&bp_normal) { - painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) } else { if(wIsSelected) - painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(ConfigColor("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor + painter->setPen(QPen(ConfigColor("DisassemblyAddressColor"))); //DisassemblyAddressColor } } } } else //bookmark { - painter->fillRect(QRect(x, y, w, h), QBrush(Configuration::instance()->color("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor if(wIsSelected) - painter->setPen(QPen(Configuration::instance()->color("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) + painter->setPen(QPen(ConfigColor("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) else - painter->setPen(QPen(Configuration::instance()->color("DisassemblyAddressColor"))); //DisassemblyAddressColor + painter->setPen(QPen(ConfigColor("DisassemblyAddressColor"))); } } painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText); @@ -224,7 +224,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse //draw bytes painter->save(); - painter->setPen(Configuration::instance()->color("DisassemblyBytesColor")); //DisassemblyBytesColor + painter->setPen(ConfigColor("DisassemblyBytesColor")); QString wBytes = ""; for(int i = 0; i < mInstBuffer.at(rowOffset).dump.size(); i++) wBytes += QString("%1").arg((unsigned char)(mInstBuffer.at(rowOffset).dump.at(i)), 2, 16, QChar('0')).toUpper()+" "; @@ -279,17 +279,10 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse if(DbgGetCommentAt(mInstBuffer.at(rowOffset).rva+mBase, comment)) { painter->save(); - painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor + painter->setPen(ConfigColor("DisassemblyCommentColor")); painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); painter->restore(); } - else - { - painter->save(); - painter->setPen(Configuration::instance()->color("DisassemblyCommentColor")); //DisassemblyCommentColor - //painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, "QString(comment)"); - painter->restore(); - } } break; @@ -585,9 +578,9 @@ int Disassembly::paintJumpsGraphic(QPainter* painter, int x, int y, int_t addr) painter->save() ; if(DbgIsJumpGoingToExecute(instruction.rva+mBase)) //change pen color when jump is executed - painter->setPen(QColor("#FF0000")); //DisassemblyJumpLineTrueColor + painter->setPen(ConfigColor("DisassemblyJumpLineTrueColor")); else - painter->setPen(QColor("#808080")); //DisassemblyJumpLineFalseColor + painter->setPen(ConfigColor("DisassemblyJumpLineFalseColor")); if(wPict == GD_Vert) { diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index 46b83945..b56cfc25 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -3,7 +3,6 @@ CPUSideBar::CPUSideBar(CPUDisassembly *Ptr, QWidget *parent) : QAbstractScrollArea(parent) { - topVA = -1; selectedVA = -1; viewableRows = 0; @@ -19,6 +18,8 @@ CPUSideBar::CPUSideBar(CPUDisassembly *Ptr, QWidget *parent) : QAbstractScrollAr InstrBuffer = CodePtr->instructionsBuffer(); + backgroundColor = ConfigColor("SideBarBackgroundColor"); + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); } @@ -32,6 +33,14 @@ void CPUSideBar::disassembleAt(int_t parVA, int_t parCIP) MessageBeep(0); } +void CPUSideBar::debugStateChangedSlot(DBGSTATE state) +{ + if(state==stopped) + { + repaint(); //clear + } +} + void CPUSideBar::repaint() { fontHeight = CodePtr->getRowHeight(); @@ -76,11 +85,14 @@ void CPUSideBar::paintEvent(QPaintEvent *event) { Q_UNUSED(event); + QPainter painter(this->viewport()); + + // Paints background + painter.fillRect(painter.viewport(), QBrush(backgroundColor)); + if(InstrBuffer->size() == 0) return; - QPainter painter(this->viewport()); - int jumpoffset = 0; int_t last_va = InstrBuffer->last().rva + CodePtr->getBase(); @@ -209,8 +221,8 @@ void CPUSideBar::drawLabel(QPainter* painter, int Line, QString Text) const int LineCoordinate = fontHeight*(1+Line); int length = Text.length(); - const QColor IPLabel = Configuration::instance()->color("IPLabel"); - const QColor IPLabelBG = Configuration::instance()->color("IPLabelBG"); + const QColor IPLabel = ConfigColor("SideBarIpLabelColor"); + const QColor IPLabelBG = ConfigColor("SideBarIpLabelBackgroundColor"); int width = length*fontWidth + 2; int x = 1; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index 60ffdfa1..797e1c67 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -16,6 +16,7 @@ public: public slots: void disassembleAt(int_t parVA, int_t parCIP); + void debugStateChangedSlot(DBGSTATE state); void repaint(); void changeTopmostAddress(int i); void setViewableRows(int rows); @@ -37,6 +38,7 @@ private: CPUDisassembly *CodePtr; QList *InstrBuffer; + QColor backgroundColor; }; #endif // CPUSIDEBAR_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index a86b7687..6f5802f1 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -12,7 +12,7 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) connect(mDisas,SIGNAL(viewableRows(int)),mSideBar,SLOT(setViewableRows(int))); connect(mDisas,SIGNAL(repainted()),mSideBar,SLOT(repaint())); connect(mDisas,SIGNAL(selectionChanged(int_t)),mSideBar,SLOT(setSelection(int_t))); - + connect(Bridge::getBridge(),SIGNAL(dbgStateChanged(DBGSTATE)),mSideBar,SLOT(debugStateChangedSlot(DBGSTATE))); QSplitter* splitter = new QSplitter(this); splitter->addWidget(mSideBar); @@ -43,10 +43,6 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) CPUStack* st = new CPUStack(0); //stack widget ui->mBotRightFrameLayout->addWidget(st); - - - - //cw = new ColumnWidget(3, this); } CPUWidget::~CPUWidget() diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 231471f9..9e29cec9 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -23,17 +23,24 @@ void Configuration::readColors() { //setup default color map QMap defaultColorMap; + defaultColorMap.insert("AbstractTableViewSeparatorColor", QColor("#808080")); + defaultColorMap.insert("AbstractTableViewBackgroundColor", QColor("#FFFBF0")); + defaultColorMap.insert("DisassemblyBackgroundColor", QColor("#FFFBF0")); + defaultColorMap.insert("DisassemblySelectionColor", QColor("#C0C0C0")); + defaultColorMap.insert("DisassemblyJumpLineTrueColor", QColor("#FF0000")); + defaultColorMap.insert("DisassemblyJumpLineFalseColor", QColor("#808080")); defaultColorMap.insert("DisassemblyCipColor", QColor("#000000")); defaultColorMap.insert("DisassemblyMainBpColor", QColor("#FF0000")); defaultColorMap.insert("DisassemblyOtherBpColor", QColor("#FFFBF0")); defaultColorMap.insert("DisassemblyBookmarkColor", QColor("#FEE970")); defaultColorMap.insert("DisassemblyMainLabelColor", QColor("#FF0000")); - defaultColorMap.insert("blackaddress", QColor("#000000")); defaultColorMap.insert("DisassemblySelectedAddressColor", QColor("#000000")); defaultColorMap.insert("DisassemblyBytesColor", QColor("#000000")); defaultColorMap.insert("DisassemblyCommentColor", QColor("#000000")); - defaultColorMap.insert("IPLabel", QColor("#FFFFFF")); - defaultColorMap.insert("IPLabelBG", QColor("#4040FF")); + defaultColorMap.insert("DisassemblyOtherBpColor", QColor("#000000")); + defaultColorMap.insert("SideBarIpLabelColor", QColor("#FFFFFF")); + defaultColorMap.insert("SideBarIpLabelBackgroundColor", QColor("#4040FF")); + defaultColorMap.insert("SideBarBackgroundColor", QColor("#FFFBF0")); Colors = defaultColors = defaultColorMap; //read config for(int i=0; i #include "Bridge.h" +#define ConfigColor(x) (Configuration::instance()->color(x)) + class Configuration { QMap Colors; From 9b55fff1578c49d6c3d60e4038066a9db0c55337 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 10 Jun 2014 22:40:43 +0200 Subject: [PATCH 061/676] GUI: fixed a bug in the side bar --- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index b56cfc25..d20a4ce9 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -128,7 +128,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) if(destVA <= last_va && destVA >= first_va) { int destLine = line + 1; - while(instrVA != destVA && destLine < viewableRows) + while(InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA && destLine < viewableRows) destLine++; drawJump(&painter, line, destLine, jumpoffset, isConditional, isJumpGoingToExecute, isSelected); } From 943306f87b1932bdf314d7a2ab4d9f2eb1abbcd4 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Tue, 10 Jun 2014 23:43:16 +0200 Subject: [PATCH 062/676] GUI: fixed some crashes in CPUSideBar & fixed a bug with jumps that go up & fixed jumps that leave the page --- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index d20a4ce9..8c80edc9 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -125,11 +125,20 @@ void CPUSideBar::paintEvent(QPaintEvent *event) bool isConditional = !((instr.disasm.Instruction.Opcode == 0xEB) || instr.disasm.Instruction.Opcode == 0xE9); - if(destVA <= last_va && destVA >= first_va) + if(destVA==instrVA) //do not try to draw EBFE + continue; + else if(destVA >= CodePtr->getBase()+CodePtr->getSize() || destVA < CodePtr->getBase()) //do not draw jumps that leave the page + continue; + else if(destVA <= last_va && destVA >= first_va) { - int destLine = line + 1; - while(InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA && destLine < viewableRows) - destLine++; + int destLine = line; + while(destLine < viewableRows && InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA) + { + if(destVA>instrVA) //jump goes up + destLine++; + else //jump goes down + destLine--; + } drawJump(&painter, line, destLine, jumpoffset, isConditional, isJumpGoingToExecute, isSelected); } else if(destVA > last_va) From d24a658f1a19f7092c3b61c7c09ff93e7145df3a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 11 Jun 2014 02:02:21 +0200 Subject: [PATCH 063/676] GUI: better jump arrows in CPUSideBar + fixed custom colors in Disassembly --- .../Project/Src/BasicView/Disassembly.cpp | 121 ++++++++++++++---- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 79 ++++++------ x64_dbg_gui/Project/Src/Gui/CPUSideBar.h | 3 +- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 53 ++++++-- x64_dbg_gui/Project/Src/Gui/Configuration.h | 9 +- 5 files changed, 186 insertions(+), 79 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 9531de86..7ba2a044 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -118,40 +118,63 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse painter->save(); if(mInstBuffer.at(rowOffset).rva == mCipRva) //cip { - painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyCipColor"))); //DisassemblyCipColor - if(!isbookmark) + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyCipBackgroundColor"))); + if(!isbookmark) //no bookmark { - if(bpxtype&bp_normal) //breakpoint + if(bpxtype&bp_normal) //normal breakpoint { - painter->setPen(QPen(ConfigColor("DisassemblyMainBpColor"))); //DisassemblyMainBpColor + QColor bpColor=ConfigColor("DisassemblyBreakpointBackgroundColor"); + if(!bpColor.alpha()) //we don't want transparent text + bpColor=ConfigColor("DisassemblyCipColor"); + painter->setPen(QPen(bpColor)); } - else + else if(bpxtype&bp_hardware) //hardware breakpoint only { - painter->setPen(QPen(ConfigColor("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor + QColor hwbpColor=ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"); + if(!hwbpColor.alpha()) //we don't want transparent text + hwbpColor=ConfigColor("DisassemblyCipColor"); + painter->setPen(hwbpColor); + } + else //no breakpoint + { + painter->setPen(QPen(ConfigColor("DisassemblyCipColor"))); } } - else + else //bookmark { - painter->setPen(QPen(ConfigColor("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor + QColor bookmarkColor=ConfigColor("DisassemblyBookmarkBackgroundColor"); + if(!bookmarkColor.alpha()) //we don't want transparent text + bookmarkColor=ConfigColor("DisassemblyCipColor"); + painter->setPen(QPen(bookmarkColor)); } } - else //other address + else //non-cip address { - if(!isbookmark) + if(!isbookmark) //no bookmark { if(*label) //label { if(bpxtype==bp_none) //label only - painter->setPen(QPen(ConfigColor("DisassemblyMainLabelColor"))); //red -> address + label text (DisassemblyMainLabelColor) + { + painter->setPen(QPen(ConfigColor("DisassemblyLabelColor"))); //red -> address + label text + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyLabelBackgroundColor"))); //fill label background + } else //label+breakpoint { - if(bpxtype&bp_normal) + if(bpxtype&bp_normal) //label + normal breakpoint { - painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) + painter->setPen(QPen(ConfigColor("DisassemblyBreakpointColor"))); + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBreakpointBackgroundColor"))); //fill red } - else + else if(bpxtype&bp_hardware) //label + hardware breakpoint only { - painter->setPen(QPen(ConfigColor("DisassemblyOtherBpColor"))); //DisassemblyOtherBpColor + painter->setPen(QPen(ConfigColor("DisassemblyHardwareBreakpointColor"))); + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"))); //fill ? + } + else //other cases -> do as normal + { + painter->setPen(QPen(ConfigColor("DisassemblyLabelColor"))); //red -> address + label text + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyLabelBackgroundColor"))); //fill label background } } } @@ -166,11 +189,17 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse } else //breakpoint only { - if(bpxtype&bp_normal) + if(bpxtype&bp_normal) //normal breakpoint { - painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyMainBpColor"))); //fill red (DisassemblyMainBpColor) + painter->setPen(QPen(ConfigColor("DisassemblyBreakpointColor"))); + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBreakpointBackgroundColor"))); //fill red } - else + else if(bpxtype&bp_hardware) //hardware breakpoint only + { + painter->setPen(QPen(ConfigColor("DisassemblyHardwareBreakpointColor"))); + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"))); //fill red + } + else //other cases (memory breakpoint in disassembly) -> do as normal { if(wIsSelected) painter->setPen(QPen(ConfigColor("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) @@ -182,11 +211,57 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse } else //bookmark { - painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBookmarkColor"))); //DisassemblyBookmarkColor - if(wIsSelected) - painter->setPen(QPen(ConfigColor("DisassemblySelectedAddressColor"))); //black address (DisassemblySelectedAddressColor) - else - painter->setPen(QPen(ConfigColor("DisassemblyAddressColor"))); + if(*label) //label + bookmark + { + if(bpxtype==bp_none) //label + bookmark + { + painter->setPen(QPen(ConfigColor("DisassemblyLabelColor"))); //red -> address + label text + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBookmarkBackgroundColor"))); //fill label background + } + else //label+breakpoint+bookmark + { + QColor color=ConfigColor("DisassemblyBookmarkBackgroundColor"); + if(!color.alpha()) //we don't want transparent text + color=ConfigColor("DisassemblyAddressColor"); + painter->setPen(QPen(color)); + if(bpxtype&bp_normal) //label + bookmark + normal breakpoint + { + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBreakpointBackgroundColor"))); //fill red + } + else if(bpxtype&bp_hardware) //label + bookmark + hardware breakpoint only + { + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"))); //fill ? + } + } + } + else //bookmark, no label + { + if(bpxtype==bp_none) //bookmark only + { + painter->setPen(QPen(ConfigColor("DisassemblyBookmarkColor"))); //black address (DisassemblySelectedAddressColor) + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBookmarkBackgroundColor"))); //fill bookmark color + } + else //bookmark + breakpoint + { + QColor color=ConfigColor("DisassemblyBookmarkBackgroundColor"); + if(!color.alpha()) //we don't want transparent text + color=ConfigColor("DisassemblyAddressColor"); + painter->setPen(QPen(color)); + if(bpxtype&bp_normal) //bookmark + normal breakpoint + { + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBreakpointBackgroundColor"))); //fill red + } + else if(bpxtype&bp_hardware) //bookmark + hardware breakpoint only + { + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"))); //fill red + } + else //other cases (bookmark + memory breakpoint in disassembly) -> do as normal + { + painter->setPen(QPen(ConfigColor("DisassemblyBookmarkColor"))); //black address (DisassemblySelectedAddressColor) + painter->fillRect(QRect(x, y, w, h), QBrush(ConfigColor("DisassemblyBookmarkBackgroundColor"))); //fill bookmark color + } + } + } } } painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, addrText); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index 8c80edc9..d4882787 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -19,8 +19,6 @@ CPUSideBar::CPUSideBar(CPUDisassembly *Ptr, QWidget *parent) : QAbstractScrollAr InstrBuffer = CodePtr->instructionsBuffer(); backgroundColor = ConfigColor("SideBarBackgroundColor"); - - connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); } QSize CPUSideBar::sizeHint() const @@ -28,11 +26,6 @@ QSize CPUSideBar::sizeHint() const return QSize(40,this->viewport()->height()); } -void CPUSideBar::disassembleAt(int_t parVA, int_t parCIP) -{ - MessageBeep(0); -} - void CPUSideBar::debugStateChangedSlot(DBGSTATE state) { if(state==stopped) @@ -104,7 +97,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) int_t instrVA = instr.rva + CodePtr->getBase(); // draw bullet - drawBullets(&painter, line, DbgGetBpxTypeAt(instrVA) == bp_none); + drawBullets(&painter, line, DbgGetBpxTypeAt(instrVA) != bp_none, DbgGetBookmarkAt(instrVA)); if(isJump(line)) //handle jumps { @@ -160,55 +153,61 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo { painter->save(); if(!conditional) - painter->setPen(QPen(QColor("#000000"),1, Qt::SolidLine)); // jmp + painter->setPen(QPen(ConfigColor("SideBarJumpLineFalseColor"), 1, Qt::SolidLine)); // jmp else - painter->setPen(QPen(QColor("#000000"),1, Qt::DashLine)); + painter->setPen(QPen(ConfigColor("SideBarJumpLineFalseColor"), 1, Qt::DashLine)); QPen tmp = painter->pen(); - if(isactive) + if(isactive) //selected { if(isexecute) //only highlight selected jumps - tmp.setColor(Qt::red); + tmp.setColor(ConfigColor("SideBarJumpLineTrueColor")); tmp.setWidth(2); } painter->setPen(tmp); - const int JumpPadding = 15; - - const int x = viewport()->width()-jumpoffset*JumpPadding - 12; - const int x_right = viewport()->width()- 12; + const int JumpPadding = 11; + const int x = viewport()->width() - jumpoffset*JumpPadding - 12; + int x_right = viewport()->width() - 12; const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; - // vertical - painter->drawLine(x,y_start,x,y_end); - // start horizontal - painter->drawLine(x,y_start,x_right,y_start); - painter->drawLine(x,y_end,x_right,y_end); - - const int ArrowSizeX = 2; // width of arrow tip in pixel - const int ArrowSizeY = 3; // height of arrow tip in pixel - - - tmp = painter->pen(); - tmp.setStyle(Qt::SolidLine); - tmp.setWidth(2); - painter->setPen(tmp); - painter->drawLine(x_right-ArrowSizeX,y_end-ArrowSizeY,x_right,y_end); - painter->drawLine(x_right-ArrowSizeX,y_end+ArrowSizeY,x_right,y_end); - + //horizontal + painter->drawLine(x_right, y_start, x, y_start); + //vertical + painter->drawLine(x, y_start, x, y_end); + //arrow + if(!isactive) //selected + { + //horizontal + painter->drawLine(x, y_end, x_right, y_end); + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x_right - 3, y_end - 3), + QPoint(x_right, y_end), + QPoint(x_right - 3, y_end + 3), + }; + painter->drawPolyline(wPoints, 3); + } + else + drawStraightArrow(painter, x, y_end, x_right, y_end); painter->restore(); } -void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp) +void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbookmark) { painter->save(); - if( isbp) - painter->setBrush(QBrush("#808080")); + if(isbp) + painter->setBrush(QBrush(ConfigColor("SideBarBulletBreakpointColor"))); + else if(isbookmark) + painter->setBrush(QBrush(ConfigColor("SideBarBulletBookmarkColor"))); else - painter->setBrush(QBrush(Qt::red)); + painter->setBrush(QBrush(ConfigColor("SideBarBulletColor"))); const int radius = fontHeight/2; //14/2=7 const int y = line*fontHeight; //initial y @@ -218,7 +217,7 @@ void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp) //painter->drawLine(0, y, viewport()->width(), y); //draw raster painter->setRenderHint(QPainter::Antialiasing, true); - painter->setPen(QPen("#ffffff")); + painter->setPen(QPen("#FFFFFF")); painter->drawEllipse(x, y+yAdd, radius, radius); painter->restore(); @@ -230,8 +229,8 @@ void CPUSideBar::drawLabel(QPainter* painter, int Line, QString Text) const int LineCoordinate = fontHeight*(1+Line); int length = Text.length(); - const QColor IPLabel = ConfigColor("SideBarIpLabelColor"); - const QColor IPLabelBG = ConfigColor("SideBarIpLabelBackgroundColor"); + const QColor IPLabel = ConfigColor("SideBarCipLabelColor"); + const QColor IPLabelBG = ConfigColor("SideBarCipLabelBackgroundColor"); int width = length*fontWidth + 2; int x = 1; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index 797e1c67..314ba652 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -15,7 +15,6 @@ public: void drawStraightArrow(QPainter *painter, int x1, int y1, int x2, int y2); public slots: - void disassembleAt(int_t parVA, int_t parCIP); void debugStateChangedSlot(DBGSTATE state); void repaint(); void changeTopmostAddress(int i); @@ -25,7 +24,7 @@ public slots: protected: void paintEvent(QPaintEvent *event); void drawLabel(QPainter* painter, int Line, QString Text); - void drawBullets(QPainter* painter, int line, bool ispb); + void drawBullets(QPainter* painter, int line, bool ispb, bool isbookmark); bool isJump(int i) const; void drawJump(QPainter* painter, int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 9e29cec9..0ac94c73 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -19,28 +19,46 @@ void Configuration::load() readColors(); } +void Configuration::save() +{ + writeColors(); +} + void Configuration::readColors() { //setup default color map - QMap defaultColorMap; + QMap defaultColorMap; defaultColorMap.insert("AbstractTableViewSeparatorColor", QColor("#808080")); defaultColorMap.insert("AbstractTableViewBackgroundColor", QColor("#FFFBF0")); + + defaultColorMap.insert("DisassemblyCipColor", QColor("#FFFFFF")); + defaultColorMap.insert("DisassemblyCipBackgroundColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyBreakpointColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyBreakpointBackgroundColor", QColor("#FF0000")); + defaultColorMap.insert("DisassemblyHardwareBreakpointColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyHardwareBreakpointBackgroundColor", Qt::transparent); + defaultColorMap.insert("DisassemblyBookmarkColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyBookmarkBackgroundColor", QColor("#FEE970")); + defaultColorMap.insert("DisassemblyLabelColor", QColor("#FF0000")); + defaultColorMap.insert("DisassemblyLabelBackgroundColor", Qt::transparent); defaultColorMap.insert("DisassemblyBackgroundColor", QColor("#FFFBF0")); defaultColorMap.insert("DisassemblySelectionColor", QColor("#C0C0C0")); + defaultColorMap.insert("DisassemblyAddressColor", QColor("#808080")); + defaultColorMap.insert("DisassemblySelectedAddressColor", QColor("#000000")); defaultColorMap.insert("DisassemblyJumpLineTrueColor", QColor("#FF0000")); defaultColorMap.insert("DisassemblyJumpLineFalseColor", QColor("#808080")); - defaultColorMap.insert("DisassemblyCipColor", QColor("#000000")); - defaultColorMap.insert("DisassemblyMainBpColor", QColor("#FF0000")); - defaultColorMap.insert("DisassemblyOtherBpColor", QColor("#FFFBF0")); - defaultColorMap.insert("DisassemblyBookmarkColor", QColor("#FEE970")); - defaultColorMap.insert("DisassemblyMainLabelColor", QColor("#FF0000")); - defaultColorMap.insert("DisassemblySelectedAddressColor", QColor("#000000")); defaultColorMap.insert("DisassemblyBytesColor", QColor("#000000")); defaultColorMap.insert("DisassemblyCommentColor", QColor("#000000")); - defaultColorMap.insert("DisassemblyOtherBpColor", QColor("#000000")); - defaultColorMap.insert("SideBarIpLabelColor", QColor("#FFFFFF")); - defaultColorMap.insert("SideBarIpLabelBackgroundColor", QColor("#4040FF")); + + defaultColorMap.insert("SideBarCipLabelColor", QColor("#FFFFFF")); + defaultColorMap.insert("SideBarCipLabelBackgroundColor", QColor("#4040FF")); defaultColorMap.insert("SideBarBackgroundColor", QColor("#FFFBF0")); + defaultColorMap.insert("SideBarJumpLineTrueColor", QColor("#FF0000")); + defaultColorMap.insert("SideBarJumpLineFalseColor", QColor("#808080")); + defaultColorMap.insert("SideBarBulletColor", QColor("#808080")); + defaultColorMap.insert("SideBarBulletBreakpointColor", QColor("#FF0000")); + defaultColorMap.insert("SideBarBulletBookmarkColor", QColor("#FEE970")); + Colors = defaultColors = defaultColorMap; //read config for(int i=0; i Configuration::ApiFingerprints() { char setting[MAX_SETTING_SIZE]=""; @@ -70,7 +98,10 @@ const QColor Configuration::color(QString id) bool Configuration::colorToConfig(const QString id, const QColor color) { - return BridgeSettingSet("Colors", id.toUtf8().constData(), color.name().toUpper().toUtf8().constData()); + QString colorName=color.name().toUpper(); + if(!color.alpha()) + colorName="#XXXXXX"; + return BridgeSettingSet("Colors", id.toUtf8().constData(), colorName.toUtf8().constData()); } QColor Configuration::colorFromConfig(const QString id) diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.h b/x64_dbg_gui/Project/Src/Gui/Configuration.h index cb363f6d..4b6a2f0c 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.h +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.h @@ -12,18 +12,21 @@ class Configuration { - QMap Colors; - QMap defaultColors; - static Configuration* mPtr; public: Configuration(); static Configuration* instance(); void load(); + void save(); void readColors(); + void writeColors(); const QList ApiFingerprints(); const QColor color(QString id); + //public variables + QMap Colors; + QMap defaultColors; + private: QColor colorFromConfig(const QString id); bool colorToConfig(const QString id, const QColor color); From 8f90275a339693322f5dec532b5e7e68e2f33324 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 11 Jun 2014 03:54:27 +0200 Subject: [PATCH 064/676] GUI: added color customization dialog (seems to work) + fixed tab order in settings dialog --- x64_dbg_gui/Project/DebuggerX64.pro | 17 +- .../Project/Src/BasicView/Disassembly.cpp | 5 + .../Project/Src/Gui/AppearanceDialog.cpp | 441 ++++++++++++ .../Project/Src/Gui/AppearanceDialog.h | 75 ++ .../Project/Src/Gui/AppearanceDialog.ui | 646 ++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 1 + x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 7 + x64_dbg_gui/Project/Src/Gui/MainWindow.h | 2 + x64_dbg_gui/Project/Src/Gui/MainWindow.ui | 10 + x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui | 26 + x64_dbg_gui/Project/images/color-swatches.png | Bin 0 -> 613 bytes x64_dbg_gui/Project/resource.qrc | 1 + 12 files changed, 1224 insertions(+), 7 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp create mode 100644 x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h create mode 100644 x64_dbg_gui/Project/Src/Gui/AppearanceDialog.ui create mode 100644 x64_dbg_gui/Project/images/color-swatches.png diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 44421f1e..91d75bdb 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -11,8 +11,8 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets # Removes all debug output when defined #DEFINES += QT_NO_DEBUG_OUTPUT -QMAKE_CFLAGS_RELEASE += -O3 -QMAKE_CXXFLAGS_RELEASE += -O3 +#QMAKE_CFLAGS_RELEASE += -O3 +#QMAKE_CXXFLAGS_RELEASE += -O3 !contains(QMAKE_HOST.arch, x86_64) { @@ -67,7 +67,8 @@ SOURCES += \ Src/BasicView/HistoryLineEdit.cpp \ Src/Gui/Configuration.cpp \ Src/Utils/ApiFingerprints.cpp \ - Src/Gui/CPUSideBar.cpp + Src/Gui/CPUSideBar.cpp \ + Src/Gui/AppearanceDialog.cpp HEADERS += \ @@ -115,7 +116,8 @@ HEADERS += \ Src/BasicView/HistoryLineEdit.h \ Src/Gui/Configuration.h \ Src/Utils/ApiFingerprints.h \ - Src/Gui/CPUSideBar.h + Src/Gui/CPUSideBar.h \ + Src/Gui/AppearanceDialog.h INCLUDEPATH += \ @@ -141,7 +143,8 @@ FORMS += \ Src/BasicView/SearchListView.ui \ Src/Gui/SettingsDialog.ui \ Src/Gui/ExceptionRangeDialog.ui \ - Src/BasicView/CommandHelpView.ui + Src/BasicView/CommandHelpView.ui \ + Src/Gui/AppearanceDialog.ui INCLUDEPATH += $$PWD/Src/Bridge @@ -150,13 +153,13 @@ LIBS += -luser32 DEFINES += NOMINMAX !contains(QMAKE_HOST.arch, x86_64) { - message("x86 build") + #message("x86 build") LIBS += -L"$$PWD/Src/ThirdPartyLibs/BeaEngine/" -lBeaEngine LIBS += -L"$$PWD/Src/Bridge/" -lx32_bridge FORMS += Src/BasicView/RegistersView32.ui ## Windows x86 (32bit) specific build here } else { - message("x86_64 build") + #message("x86_64 build") LIBS += -L"$$PWD/Src/ThirdPartyLibs/BeaEngine/" -lBeaEngine_64 LIBS += -L"$$PWD/Src/Bridge/" -lx64_bridge FORMS += Src/BasicView/RegistersView64.ui diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 7ba2a044..5d5687aa 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -355,6 +355,11 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse { painter->save(); painter->setPen(ConfigColor("DisassemblyCommentColor")); + int width = QFontMetrics(this->font()).width(comment)+4; + if(width > w) + width=w; + if(width) + painter->fillRect(QRect(x + 2, y, width, h), QBrush(ConfigColor("DisassemblyCommentBackgroundColor"))); //fill bookmark color painter->drawText(QRect(x + 4, y , w - 4 , h), Qt::AlignVCenter | Qt::AlignLeft, QString(comment)); painter->restore(); } diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp new file mode 100644 index 00000000..9d9aec82 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp @@ -0,0 +1,441 @@ +#include "AppearanceDialog.h" +#include "ui_AppearanceDialog.h" + +AppearanceDialog::AppearanceDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AppearanceDialog) +{ + ui->setupUi(this); + //set window flags + setModal(true); + setWindowFlags(Qt::Dialog | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint); + setFixedSize(this->size()); //fixed size + //Colors + colorMap=Configuration::instance()->Colors; + ui->groupColor->setEnabled(false); + ui->groupBackgroundColor->setEnabled(false); + colorInfoListInit(); +} + +AppearanceDialog::~AppearanceDialog() +{ + delete ui; +} + +//Colors +void AppearanceDialog::on_button000000_clicked() +{ + ui->editColor->setText("#000000"); +} + +void AppearanceDialog::on_button000080_clicked() +{ + ui->editColor->setText("#000080"); +} + +void AppearanceDialog::on_button008000_clicked() +{ + ui->editColor->setText("#008000"); +} + +void AppearanceDialog::on_button008080_clicked() +{ + ui->editColor->setText("#008080"); +} + +void AppearanceDialog::on_button800000_clicked() +{ + ui->editColor->setText("#800000"); +} + +void AppearanceDialog::on_button800080_clicked() +{ + ui->editColor->setText("#800080"); +} + +void AppearanceDialog::on_button808000_clicked() +{ + ui->editColor->setText("#808000"); +} + +void AppearanceDialog::on_buttonC0C0C0_clicked() +{ + ui->editColor->setText("#C0C0C0"); +} + +void AppearanceDialog::on_button808080_clicked() +{ + ui->editColor->setText("#808080"); +} + +void AppearanceDialog::on_button0000FF_clicked() +{ + ui->editColor->setText("#0000FF"); +} + +void AppearanceDialog::on_button00FF00_clicked() +{ + ui->editColor->setText("#00FF00"); +} + +void AppearanceDialog::on_button00FFFF_clicked() +{ + ui->editColor->setText("#00FFFF"); +} + +void AppearanceDialog::on_buttonFF0000_clicked() +{ + ui->editColor->setText("#FF0000"); +} + +void AppearanceDialog::on_buttonFF00FF_clicked() +{ + ui->editColor->setText("#FF00FF"); +} + +void AppearanceDialog::on_buttonFFFF00_clicked() +{ + ui->editColor->setText("#FFFF00"); +} + +void AppearanceDialog::on_buttonFFFFFF_clicked() +{ + ui->editColor->setText("#FFFFFF"); +} + +void AppearanceDialog::on_buttonBackground000000_clicked() +{ + ui->editBackgroundColor->setText("#000000"); +} + +void AppearanceDialog::on_buttonBackgroundC0C0C0_clicked() +{ + ui->editBackgroundColor->setText("#C0C0C0"); +} + +void AppearanceDialog::on_buttonBackgroundFFFFFF_clicked() +{ + ui->editBackgroundColor->setText("#FFFFFF"); +} + +void AppearanceDialog::on_buttonBackground00FFFF_clicked() +{ + ui->editBackgroundColor->setText("#00FFFF"); +} + +void AppearanceDialog::on_buttonBackground00FF00_clicked() +{ + ui->editBackgroundColor->setText("#00FF00"); +} + +void AppearanceDialog::on_buttonBackgroundFF0000_clicked() +{ + ui->editBackgroundColor->setText("#FF0000"); +} + +void AppearanceDialog::on_buttonBackgroundFFFF00_clicked() +{ + ui->editBackgroundColor->setText("#FFFF00"); +} + +void AppearanceDialog::on_buttonBackgroundNone_clicked() +{ + ui->editBackgroundColor->setText("#XXXXXX"); +} + +void AppearanceDialog::on_editBackgroundColor_textChanged(const QString &arg1) +{ + QString text=arg1; + if(!arg1.length()) + { + ui->editBackgroundColor->setText("#"); + text=ui->editBackgroundColor->text(); + return; + } + if(arg1.at(0)!='#') + { + ui->editBackgroundColor->setText("#"+arg1); + text=ui->editBackgroundColor->text(); + } + QString styleSheet; + QString id=colorInfoList.at(colorInfoIndex).backgroundColorName; + if(text=="#XXXXXX") + { + styleSheet = "border: 2px solid black; background-color: #C0C0C0"; + ui->buttonBackgroundColor->setText("X"); + if(colorMap.contains(id)) + { + colorMap[id]=Qt::transparent; + ui->buttonSave->setEnabled(true); + } + } + else + { + ui->buttonBackgroundColor->setText(""); + if(QColor(text).isValid()) + { + styleSheet = "border: 2px solid black; background-color: " + text; + if(colorMap.contains(id)) + { + colorMap[id]=QColor(text); + ui->buttonSave->setEnabled(true); + } + } + else + { + styleSheet = "border: 2px solid red; background-color: #FFFFFF"; + if(colorMap.contains(id)) + ui->buttonSave->setEnabled(false); //we cannot save with an invalid color + } + } + ui->buttonBackgroundColor->setStyleSheet(styleSheet); +} + +void AppearanceDialog::on_editColor_textChanged(const QString &arg1) +{ + QString text=arg1; + if(!arg1.length()) + { + ui->editColor->setText("#"); + text=ui->editColor->text(); + return; + } + if(arg1.at(0)!='#') + { + ui->editColor->setText("#"+arg1); + text=ui->editColor->text(); + } + QString id=colorInfoList.at(colorInfoIndex).colorName; + QString styleSheet; + if(QColor(text).isValid()) + { + styleSheet = "border: 2px solid black; background-color: " + text; + if(colorMap.contains(id)) + { + colorMap[id]=QColor(text); + ui->buttonSave->setEnabled(true); + } + } + else + { + styleSheet = "border: 2px solid red; background-color: #FFFFFF"; + if(colorMap.contains(id)) + ui->buttonSave->setEnabled(false); //we cannot save with an invalid color + } + ui->buttonColor->setStyleSheet(styleSheet); +} + +void AppearanceDialog::on_buttonColor_clicked() +{ + QColorDialog colorDialog(QColor(ui->editColor->text()), this); + if(colorDialog.exec()==QDialog::Accepted) + ui->editColor->setText(colorDialog.selectedColor().name().toUpper()); +} + +void AppearanceDialog::on_buttonBackgroundColor_clicked() +{ + QColor initialColor; + if(ui->editBackgroundColor->text().toUpper()=="#XXXXXX") + initialColor=Qt::black; //transparent will set the alpha channel, which users will forget + else + initialColor=QColor(ui->editBackgroundColor->text()); + QColor selectedColor=QColorDialog::getColor(initialColor, this, "Select Color", QColorDialog::ShowAlphaChannel); + if(selectedColor.isValid()) + { + if(!selectedColor.alpha()) + ui->editBackgroundColor->setText("#XXXXXX"); + else + ui->editBackgroundColor->setText(selectedColor.name().toUpper()); + } +} + +void AppearanceDialog::on_listColorNames_itemSelectionChanged() +{ + colorInfoIndex=ui->listColorNames->row(ui->listColorNames->selectedItems().at(0)); + ColorInfo info=colorInfoList.at(colorInfoIndex); + defaultValueAction->setEnabled(false); + currentSettingAction->setEnabled(false); + ui->buttonSave->setEnabled(false); + ui->groupColor->setEnabled(false); + ui->groupBackgroundColor->setEnabled(false); + + if(info.colorName.length()) + { + QString id=info.colorName; + if(colorMap.contains(id)) + { + ui->groupColor->setEnabled(true); + ui->buttonSave->setEnabled(true); + defaultValueAction->setEnabled(true); + currentSettingAction->setEnabled(true); + + QColor color=colorMap[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editColor->setText(colorText); + } + else + ui->editColor->setText("#FFFFFF"); + } + else + ui->editColor->setText("#FFFFFF"); + + if(info.backgroundColorName.length()) + { + QString id=info.backgroundColorName; + if(colorMap.contains(id)) + { + ui->groupBackgroundColor->setEnabled(true); + ui->buttonSave->setEnabled(true); + defaultValueAction->setEnabled(true); + currentSettingAction->setEnabled(true); + + QColor color=colorMap[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editBackgroundColor->setText(colorText); + } + else + ui->editBackgroundColor->setText("#FFFFFF"); + } + else + ui->editBackgroundColor->setText("#FFFFFF"); +} + +void AppearanceDialog::on_buttonSave_clicked() +{ + Configuration::instance()->Colors=colorMap; + Configuration::instance()->writeColors(); + QMessageBox msg(QMessageBox::Information, "Information", "Settings saved (you may have to restart)!"); + msg.setWindowIcon(QIcon(":/icons/images/information.png")); + msg.setParent(this, Qt::Dialog); + msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint)); + msg.exec(); + GuiUpdateAllViews(); +} + +void AppearanceDialog::defaultValueSlot() +{ + ColorInfo info=colorInfoList.at(colorInfoIndex); + if(info.colorName.length()) + { + QString id=info.colorName; + if(Configuration::instance()->defaultColors.contains(id)) + { + QColor color=Configuration::instance()->defaultColors[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editColor->setText(colorText); + } + } + if(info.backgroundColorName.length()) + { + QString id=info.backgroundColorName; + if(Configuration::instance()->defaultColors.contains(id)) + { + QColor color=Configuration::instance()->defaultColors[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editBackgroundColor->setText(colorText); + } + } +} + +void AppearanceDialog::currentSettingSlot() +{ + ColorInfo info=colorInfoList.at(colorInfoIndex); + if(info.colorName.length()) + { + QString id=info.colorName; + if(Configuration::instance()->Colors.contains(id)) + { + QColor color=Configuration::instance()->Colors[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editColor->setText(colorText); + } + } + if(info.backgroundColorName.length()) + { + QString id=info.backgroundColorName; + if(Configuration::instance()->Colors.contains(id)) + { + QColor color=Configuration::instance()->Colors[id]; + QString colorText=color.name().toUpper(); + if(!color.alpha()) + colorText="#XXXXXX"; + ui->editBackgroundColor->setText(colorText); + } + } +} + +void AppearanceDialog::colorInfoListAppend(QString propertyName, QString colorName, QString backgroundColorName) +{ + ColorInfo info; + if(colorName.length() || backgroundColorName.length()) + propertyName=" "+propertyName; + else + propertyName=QString(QChar(0x2022))+" "+propertyName; //bullet + space + info.propertyName=propertyName; + info.colorName=colorName; + info.backgroundColorName=backgroundColorName; + colorInfoList.append(info); + ui->listColorNames->addItem(colorInfoList.last().propertyName); +} + +void AppearanceDialog::colorInfoListInit() +{ + //clear list + colorInfoIndex=0; + colorInfoList.clear(); + //list entries + colorInfoListAppend("AbstractTableView:", "", ""); + colorInfoListAppend("Background", "AbstractTableViewBackgroundColor", ""); + colorInfoListAppend("Separator", "AbstractTableViewSeparatorColor", ""); + + colorInfoListAppend("Disassembly:", "", ""); +#ifdef _WIN64 + colorInfoListAppend("RIP", "DisassemblyCipColor", "DisassemblyCipBackgroundColor"); +#else //x86 + colorInfoListAppend("EIP", "DisassemblyCipColor", "DisassemblyCipBackgroundColor"); +#endif //_WIN64 + colorInfoListAppend("Breakpoints", "DisassemblyBreakpointColor", "DisassemblyBreakpointBackgroundColor"); + colorInfoListAppend("Hardware Breakpoints", "DisassemblyHardwareBreakpointColor", "DisassemblyHardwareBreakpointBackgroundColor"); + colorInfoListAppend("Bookmarks", "DisassemblyBookmarkColor", "DisassemblyBookmarkBackgroundColor"); + colorInfoListAppend("Comments", "DisassemblyCommentColor", "DisassemblyCommentBackgroundColor"); + colorInfoListAppend("Labels", "DisassemblyLabelColor", "DisassemblyLabelBackgroundColor"); + colorInfoListAppend("Addresses", "DisassemblyAddressColor", ""); + colorInfoListAppend("Bytes", "DisassemblyBytesColor", ""); + colorInfoListAppend("Jump Lines (jump)", "DisassemblyJumpLineTrueColor", ""); + colorInfoListAppend("Jump Lines (no jump)", "DisassemblyJumpLineFalseColor", ""); + colorInfoListAppend("Selected Address Text", "DisassemblySelectedAddressColor", ""); + colorInfoListAppend("Selection", "DisassemblySelectionColor", ""); + colorInfoListAppend("Background", "DisassemblyBackgroundColor", ""); + + + colorInfoListAppend("SideBar:", "", ""); +#ifdef _WIN64 + colorInfoListAppend("RIP Label", "SideBarCipLabelColor", "SideBarCipLabelBackgroundColor"); +#else //x86 + colorInfoListAppend("EIP Label", "SideBarCipLabelColor", "SideBarCipLabelBackgroundColor"); +#endif //_WIN64 + colorInfoListAppend("Bullets", "SideBarBulletColor", ""); + colorInfoListAppend("Breakpoints", "SideBarBulletBreakpointColor", ""); + colorInfoListAppend("Bookmarks", "SideBarBulletBookmarkColor", ""); + colorInfoListAppend("Jump Lines (jump)", "SideBarJumpLineFalseColor", ""); + colorInfoListAppend("Jump Lines (no jump)", "SideBarJumpLineTrueColor", ""); + + //setup context menu + ui->listColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); + defaultValueAction = new QAction("&Default Value", this); + defaultValueAction->setEnabled(false); + connect(defaultValueAction, SIGNAL(triggered()), this, SLOT(defaultValueSlot())); + currentSettingAction = new QAction("&Current Setting", this); + currentSettingAction->setEnabled(false); + connect(currentSettingAction, SIGNAL(triggered()), this, SLOT(currentSettingSlot())); + ui->listColorNames->addAction(defaultValueAction); + ui->listColorNames->addAction(currentSettingAction); +} diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h new file mode 100644 index 00000000..8742f31c --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h @@ -0,0 +1,75 @@ +#ifndef APPEARANCEDIALOG_H +#define APPEARANCEDIALOG_H + +#include +#include +#include "Configuration.h" + +namespace Ui { +class AppearanceDialog; +} + +class AppearanceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AppearanceDialog(QWidget *parent = 0); + ~AppearanceDialog(); + +private slots: + void on_button000000_clicked(); + void on_button000080_clicked(); + void on_button008000_clicked(); + void on_button008080_clicked(); + void on_button800000_clicked(); + void on_button800080_clicked(); + void on_button808000_clicked(); + void on_buttonC0C0C0_clicked(); + void on_button808080_clicked(); + void on_button0000FF_clicked(); + void on_button00FF00_clicked(); + void on_button00FFFF_clicked(); + void on_buttonFF0000_clicked(); + void on_buttonFF00FF_clicked(); + void on_buttonFFFF00_clicked(); + void on_buttonFFFFFF_clicked(); + void on_buttonBackground000000_clicked(); + void on_buttonBackgroundC0C0C0_clicked(); + void on_buttonBackgroundFFFFFF_clicked(); + void on_buttonBackground00FFFF_clicked(); + void on_buttonBackground00FF00_clicked(); + void on_buttonBackgroundFF0000_clicked(); + void on_buttonBackgroundFFFF00_clicked(); + void on_buttonBackgroundNone_clicked(); + void on_editBackgroundColor_textChanged(const QString &arg1); + void on_editColor_textChanged(const QString &arg1); + void on_buttonColor_clicked(); + void on_buttonBackgroundColor_clicked(); + void on_buttonSave_clicked(); + void on_listColorNames_itemSelectionChanged(); + void defaultValueSlot(); + void currentSettingSlot(); + +private: + Ui::AppearanceDialog *ui; + + struct ColorInfo + { + QString propertyName; + QString colorName; + QString backgroundColorName; + }; + + QList colorInfoList; + int colorInfoIndex; + QMap colorMap; + + QAction* defaultValueAction; + QAction* currentSettingAction; + + void colorInfoListAppend(QString propertyName, QString colorName, QString backgroundColorName); + void colorInfoListInit(); +}; + +#endif // APPEARANCEDIALOG_H diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.ui b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.ui new file mode 100644 index 00000000..4c145873 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.ui @@ -0,0 +1,646 @@ + + + AppearanceDialog + + + + 0 + 0 + 522 + 401 + + + + Appearance + + + + :/icons/images/color-swatches.png:/icons/images/color-swatches.png + + + + + + + + 2 + 2 + 521 + 361 + + + + + Colors + + + + + 360 + 10 + 141 + 181 + + + + Text Color + + + false + + + + + 10 + 150 + 85 + 20 + + + + #FFFFFF + + + + + + 101 + 151 + 28 + 17 + + + + background-color: #FFFFFF; border : 2px solid black + + + + + + + + + 9 + 49 + 32 + 31 + + + + background-color: #800000; border : 2px solid black + + + + + + + + + 69 + 79 + 32 + 31 + + + + background-color: #00FF00; border : 2px solid black + + + + + + + + + 99 + 19 + 32 + 31 + + + + background-color: #008080; border : 2px solid black + + + + + + + + + 99 + 49 + 32 + 31 + + + + background-color: #C0C0C0; border : 2px solid black + + + + + + + + + 39 + 49 + 32 + 31 + + + + background-color: #800080; border : 2px solid black + + + + + + + + + 9 + 109 + 32 + 31 + + + + background-color : #FF0000; border : 2px solid black + + + + + + + + + 39 + 79 + 32 + 31 + + + + background-color: #0000FF; border : 2px solid black + + + + + + + + + 69 + 19 + 32 + 31 + + + + background-color: #008000; border : 2px solid black + + + + + + + + + 99 + 79 + 32 + 31 + + + + background-color: #00FFFF; border : 2px solid black + + + + + + + + + 39 + 109 + 32 + 31 + + + + background-color: #FF00FF; border : 2px solid black + + + + + + + + + 69 + 49 + 32 + 31 + + + + background-color: #808000; border : 2px solid black + + + + + + + + + 9 + 79 + 32 + 31 + + + + background-color: #808080; border : 2px solid black + + + + + + + + + 69 + 109 + 32 + 31 + + + + background-color: #FFFF00; border : 2px solid black + + + + + + + + + 9 + 19 + 32 + 31 + + + + background-color: #000000; border : 2px solid black + + + + + + + + + 39 + 19 + 32 + 31 + + + + background-color: #000080; border : 2px solid black + + + + + + + + + 99 + 109 + 32 + 31 + + + + background-color: #FFFFFF; border : 2px solid black + + + + + + + + + + 360 + 200 + 141 + 121 + + + + Background Color + + + + + 9 + 89 + 85 + 20 + + + + #FFFFFF + + + + + + 100 + 90 + 28 + 17 + + + + background-color: #FFFFFF; border : 2px solid black + + + + + + + + + 39 + 49 + 32 + 31 + + + + background-color: #00FF00; border : 2px solid black + + + + + + + + + 99 + 49 + 32 + 31 + + + + background-color: #FFFF00; border : 2px solid black + + + + + + + + + 99 + 19 + 32 + 31 + + + + background-color: #FFFFFF; border : 2px solid black + + + + + + + + + 69 + 49 + 32 + 31 + + + + background-color: #FF0000; border : 2px solid black + + + + + + + + + 9 + 19 + 32 + 31 + + + + background-color: #C0C0C0; border : 2px solid black + + + X + + + + + + 39 + 19 + 32 + 31 + + + + background-color: #000000; border : 2px solid black + + + + + + + + + 9 + 49 + 32 + 31 + + + + background-color : #00FFFF; border : 2px solid black + + + + + + + + + 69 + 19 + 32 + 31 + + + + background-color: #C0C0C0; border : 2px solid black + + + + + + + + + + 10 + 10 + 341 + 311 + + + + Properties + + + false + + + + + 10 + 20 + 321 + 281 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOff + + + + groupBackgroundColor + groupColor + groupProperties + + + + + + 440 + 370 + 75 + 23 + + + + &Cancel + + + + + + 360 + 370 + 75 + 23 + + + + &Save + + + true + + + + + + tabWidget + listColorNames + button000000 + button000080 + button008000 + button008080 + button800000 + button800080 + button808000 + buttonC0C0C0 + button808080 + button0000FF + button00FF00 + button00FFFF + buttonFF0000 + buttonFF00FF + buttonFFFF00 + buttonFFFFFF + editColor + buttonColor + buttonBackgroundNone + buttonBackground000000 + buttonBackgroundC0C0C0 + buttonBackgroundFFFFFF + buttonBackground00FFFF + buttonBackground00FF00 + buttonBackgroundFF0000 + buttonBackgroundFFFF00 + editBackgroundColor + buttonBackgroundColor + buttonSave + buttonCancel + + + + + + + buttonCancel + clicked() + AppearanceDialog + close() + + + 481 + 381 + + + 476 + 386 + + + + + buttonSave + clicked(bool) + AppearanceDialog + accept() + + + 393 + 382 + + + 398 + 376 + + + + + diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 0ac94c73..7505d8d1 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -49,6 +49,7 @@ void Configuration::readColors() defaultColorMap.insert("DisassemblyJumpLineFalseColor", QColor("#808080")); defaultColorMap.insert("DisassemblyBytesColor", QColor("#000000")); defaultColorMap.insert("DisassemblyCommentColor", QColor("#000000")); + defaultColorMap.insert("DisassemblyCommentBackgroundColor", Qt::transparent); defaultColorMap.insert("SideBarCipLabelColor", QColor("#FFFFFF")); defaultColorMap.insert("SideBarCipLabelBackgroundColor", QColor("#4040FF")); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index ee3c0fbc..e34f7a8b 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -135,6 +135,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(ui->actionThreads,SIGNAL(triggered()),this,SLOT(displayThreadsWidget())); connect(ui->actionSettings,SIGNAL(triggered()),this,SLOT(openSettings())); connect(ui->actionStrings,SIGNAL(triggered()),this,SLOT(findStrings())); + connect(ui->actionAppearance,SIGNAL(triggered()),this,SLOT(openAppearance())); connect(Bridge::getBridge(), SIGNAL(updateWindowTitle(QString)), this, SLOT(updateWindowTitleSlot(QString))); connect(Bridge::getBridge(), SIGNAL(addRecentFile(QString)), this, SLOT(addRecentFile(QString))); @@ -524,6 +525,12 @@ void MainWindow::openSettings() settings.exec(); } +void MainWindow::openAppearance() +{ + AppearanceDialog appearance(this); + appearance.exec(); +} + void MainWindow::addRecentFile(QString file) { addMRUEntry(file); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 48ce8c2a..0ecb881d 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -20,6 +20,7 @@ #include "tabwidget.h" #include "Configuration.h" #include "ApiFingerprints.h" +#include "AppearanceDialog.h" namespace Ui { @@ -62,6 +63,7 @@ public slots: void displayReferencesWidget(); void displayThreadsWidget(); void openSettings(); + void openAppearance(); void addRecentFile(QString file); void setLastException(unsigned int exceptionCode); void findStrings(); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui index e9ed7d2f..40b51651 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui @@ -91,6 +91,7 @@ &Options + @@ -497,6 +498,15 @@ Find Strings + + + + :/icons/images/color-swatches.png:/icons/images/color-swatches.png + + + &Appearance + + diff --git a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui index f50bc474..e1c025a7 100644 --- a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui +++ b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui @@ -421,6 +421,32 @@ + + tabWidget + chkSystemBreakpoint + chkTlsCallbacks + chkEntryBreakpoint + chkDllEntry + chkThreadEntry + chkDllLoad + chkDllUnload + chkThreadStart + chkThreadEnd + chkDebugStrings + radioSigned + radioUnsigned + radioInt3Short + radioInt3Long + radioUd2 + chkUndecorateSymbolNames + chkEnableDebugPrivilege + listExceptions + btnAddRange + btnDeleteRange + btnAddLast + btnSave + btnCancel + diff --git a/x64_dbg_gui/Project/images/color-swatches.png b/x64_dbg_gui/Project/images/color-swatches.png new file mode 100644 index 0000000000000000000000000000000000000000..26bbe1a6a36abd56b4157e16424fcc16c4ea34fb GIT binary patch literal 613 zcmV-r0-F7aP)5zmWwYilTgDr`zp*UKibJ zwT}5)7*r}1%;$40<2c53{}5Hj)IV?SeZlXeAE=s+)-TWALn&nx20VlikWwND0%N&c z!j=Lx*V22Ooh>A4ma8@IFBXf!V4rHBnK=u~vfd5`1Kf`t+)SkoNYntaHNgw@EIq7j zK<@u%-rap9FO@?0`W3Pu#!U^Fg_--;hj6MX^WGLS9}%;eF`wb$;vVPc|FrhJrz-X)G&3s|QopFekPL)2;8gg; zcbh#ROnE63o4sBxHS@uNpt4M}X4`=8`zr%>Jh}V>)2ZqoKE09n`SC9tGu2IE_B`+V za5(&x7nSPfYXfFs10ii#Zpx^X4=HT8C1%HQt|pVox6;MjX*_1pHBb>$sPtqc)?5>w zyidInG#ZUtipl3pXTU7n%BM|k(`jaIqIqf-y3Aa!*D)H6R*%nh-4E2pJL?_~F^?&e zue=V!kULSoV!q2KG@rBC8jrg??R>Dog8%~n5^o&eU9O#*00000NkvXXu0mjf4(S)A literal 0 HcmV?d00001 diff --git a/x64_dbg_gui/Project/resource.qrc b/x64_dbg_gui/Project/resource.qrc index df9e07fb..dbf9c14f 100644 --- a/x64_dbg_gui/Project/resource.qrc +++ b/x64_dbg_gui/Project/resource.qrc @@ -30,5 +30,6 @@ images/arrow-threads.png images/settings.png images/strings.png + images/color-swatches.png From a07857e2512f1ed869c46f06cd5015435ae9cc5d Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Wed, 11 Jun 2014 14:13:36 +0200 Subject: [PATCH 065/676] - complete rewrite of the RegistersView for more interactions with features: ASCII-hints, labelname, modulename, highlight value changes --- .../Project/Src/BasicView/RegistersView.cpp | 899 +++++++------- .../Project/Src/BasicView/RegistersView.h | 144 ++- .../Project/Src/BasicView/RegistersView32.ui | 871 ------------- .../Project/Src/BasicView/RegistersView64.ui | 1079 ----------------- 4 files changed, 530 insertions(+), 2463 deletions(-) delete mode 100644 x64_dbg_gui/Project/Src/BasicView/RegistersView32.ui delete mode 100644 x64_dbg_gui/Project/Src/BasicView/RegistersView64.ui diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index fc51793f..f038360e 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -1,15 +1,118 @@ #include "RegistersView.h" -#ifdef _WIN64 -#include "ui_RegistersView64.h" -#else -#include "ui_RegistersView32.h" -#endif -RegistersView::RegistersView(QWidget *parent) : QWidget(parent), ui(new Ui::RegistersView) + +RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) { - int wI = 0; - ui->setupUi(this); + + + // precreate ContextMenu Actions + wCM_Increment = new QAction(tr("Increment"),this); + wCM_Increment->setShortcut(Qt::Key_Plus); + wCM_Decrement = new QAction(tr("Decrement"),this); + wCM_Decrement->setShortcut(Qt::Key_Minus); + wCM_Zero = new QAction(tr("Zero"),this); + wCM_Zero->setShortcut(Qt::Key_0); + wCM_SetToOne = new QAction(tr("Set to 1"),this); + wCM_SetToOne->setShortcut(Qt::Key_1); + wCM_Modify = new QAction(tr("Modify Value"),this); + wCM_Modify->setShortcut(Qt::Key_Enter); + wCM_ToggleValue = new QAction(tr("Toggle"),this); + wCM_ToggleValue->setShortcut(Qt::Key_Space); + wCM_CopyToClipboard = new QAction(tr("Copy Value to Clipboard"),this); + wCM_CopyToClipboard->setShortcut(QKeySequence::Copy); + + + + // general purposes register (we allow the user to modify the value) + mGPR.insert(CAX); mGPR.insert(CBX); mGPR.insert(CCX); mGPR.insert(CDX); + mGPR.insert(CBP); mGPR.insert(CSP); + mGPR.insert(CSI); mGPR.insert(CDI); + mGPR.insert(R8); mGPR.insert(R9); mGPR.insert(R10); + mGPR.insert(R11); mGPR.insert(R12); mGPR.insert(R13); + mGPR.insert(R14); mGPR.insert(R15); + mGPR.insert(EFLAGS); + + // flags (we allow the user to toggle them) + mFlags.insert(CF); mFlags.insert(PF); mFlags.insert(AF); mFlags.insert(ZF); + mFlags.insert(SF); mFlags.insert(TF); mFlags.insert(IF); mFlags.insert(DF); + mFlags.insert(OF); + + + // create mapping from internal id to name + mRegisterMapping.clear(); + mRegisterPlaces.clear(); + int offset = 0; + + /* Register_Position is a struct definition the position + * + * (line , start, labelwidth, valuesize ) + */ +#ifdef _WIN64 + mRegisterMapping.insert(CAX,"RAX"); mRegisterPlace.insert(CAX,Register_Position(0,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBX,"RBX"); mRegisterPlace.insert(CBX,Register_Position(1,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CCX,"RCX"); mRegisterPlace.insert(CCX,Register_Position(2,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDX,"RDX"); mRegisterPlace.insert(CDX,Register_Position(3,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSI,"RSI"); mRegisterPlace.insert(CSI,Register_Position(6,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDI,"RDI"); mRegisterPlace.insert(CDI,Register_Position(7,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBP,"RBP"); mRegisterPlace.insert(CBP,Register_Position(4,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSP,"RSP"); mRegisterPlace.insert(CSP,Register_Position(5,0, 6, sizeof(uint_t) * 2)); + + mRegisterMapping.insert(R8,"R8"); mRegisterPlace.insert(R8 ,Register_Position(9,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R9,"R9"); mRegisterPlace.insert(R9 ,Register_Position(10,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R10,"R10"); mRegisterPlace.insert(R10,Register_Position(11,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R11,"R11"); mRegisterPlace.insert(R11,Register_Position(12,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R12,"R12"); mRegisterPlace.insert(R12,Register_Position(13,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R13,"R13"); mRegisterPlace.insert(R13,Register_Position(14,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R14,"R14"); mRegisterPlace.insert(R14,Register_Position(15,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R15,"R15"); mRegisterPlace.insert(R15,Register_Position(16,0, 6, sizeof(uint_t) * 2)); + + mRegisterMapping.insert(CIP,"RIP"); mRegisterPlace.insert(CIP,Register_Position(18,0, 6, sizeof(uint_t) * 2)); + + mRegisterMapping.insert(EFLAGS,"RFLAGS"); mRegisterPlace.insert(EFLAGS,Register_Position(20,0, 9, sizeof(uint_t) * 2)); + + offset = 21; +#else + mRegisterMapping.insert(CAX,"EAX"); mRegisterPlaces.insert(CAX,Register_Position(0,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBX,"EBX"); mRegisterPlaces.insert(CBX,Register_Position(1,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CCX,"ECX"); mRegisterPlaces.insert(CCX,Register_Position(2,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDX,"EDX"); mRegisterPlaces.insert(CDX,Register_Position(3,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSI,"ESI"); mRegisterPlaces.insert(CSI,Register_Position(6,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDI,"EDI"); mRegisterPlaces.insert(CDI,Register_Position(7,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBP,"EBP"); mRegisterPlaces.insert(CBP,Register_Position(4,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSP,"ESP"); mRegisterPlaces.insert(CSP,Register_Position(5,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CIP,"EIP"); mRegisterPlaces.insert(CIP,Register_Position(9,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(EFLAGS,"EFLAGS"); mRegisterPlaces.insert(EFLAGS,Register_Position(11,0, 9, sizeof(uint_t) * 2)); + + offset = 12; +#endif + mRegisterMapping.insert(CF,"CF"); mRegisterPlaces.insert(CF,Register_Position(offset+0,0, 3, 1)); + mRegisterMapping.insert(PF,"PF"); mRegisterPlaces.insert(PF,Register_Position(offset+1,0, 3, 1)); + mRegisterMapping.insert(AF,"AF"); mRegisterPlaces.insert(AF,Register_Position(offset+2,0, 3, 1)); + mRegisterMapping.insert(ZF,"ZF"); mRegisterPlaces.insert(ZF,Register_Position(offset+3,0, 3, 1)); + mRegisterMapping.insert(SF,"SF"); mRegisterPlaces.insert(SF,Register_Position(offset+4,0, 3, 1)); + + mRegisterMapping.insert(TF,"TF"); mRegisterPlaces.insert(TF,Register_Position(offset+0, 10, 3,1)); + mRegisterMapping.insert(IF,"IF"); mRegisterPlaces.insert(IF,Register_Position(offset+1, 10, 3,1)); + mRegisterMapping.insert(DF,"DF"); mRegisterPlaces.insert(DF,Register_Position(offset+2, 10, 3,1)); + mRegisterMapping.insert(OF,"OF"); mRegisterPlaces.insert(OF,Register_Position(offset+3, 10, 3,1)); + + offset++; + mRegisterMapping.insert(GS,"GS"); mRegisterPlaces.insert(GS,Register_Position(offset+5,0, 3, 4)); + mRegisterMapping.insert(FS,"FS"); mRegisterPlaces.insert(FS,Register_Position(offset+6,0, 3, 4)); + mRegisterMapping.insert(ES,"ES"); mRegisterPlaces.insert(ES,Register_Position(offset+7,0, 3, 4)); + mRegisterMapping.insert(DS,"DS"); mRegisterPlaces.insert(DS,Register_Position(offset+8,0, 3, 4)); + mRegisterMapping.insert(CS,"CS"); mRegisterPlaces.insert(CS,Register_Position(offset+9,0, 3, 4)); + mRegisterMapping.insert(SS,"SS"); mRegisterPlaces.insert(SS,Register_Position(offset+10,0, 3, 4)); + + offset++; + mRegisterMapping.insert(DR0,"DR0"); mRegisterPlaces.insert(DR0,Register_Position(offset+11,0, 4, sizeof(uint_t) * 2)); + mRegisterMapping.insert(DR1,"DR1"); mRegisterPlaces.insert(DR1,Register_Position(offset+12,0, 4, sizeof(uint_t) * 2)); + mRegisterMapping.insert(DR2,"DR2"); mRegisterPlaces.insert(DR2,Register_Position(offset+13,0, 4, sizeof(uint_t) * 2)); + mRegisterMapping.insert(DR3,"DR3"); mRegisterPlaces.insert(DR3,Register_Position(offset+14,0, 4, sizeof(uint_t) * 2)); + mRegisterMapping.insert(DR6,"DR6"); mRegisterPlaces.insert(DR6,Register_Position(offset+15,0, 4, sizeof(uint_t) * 2)); + mRegisterMapping.insert(DR7,"DR7"); mRegisterPlaces.insert(DR7,Register_Position(offset+16,0, 4, sizeof(uint_t) * 2)); + // Set background color QPalette wPalette; @@ -17,163 +120,86 @@ RegistersView::RegistersView(QWidget *parent) : QWidget(parent), ui(new Ui::Regi this->setAutoFillBackground(true); this->setPalette(wPalette); + QFont font("Monospace", 8); + font.setFixedPitch(true); + font.setStyleHint(QFont::Monospace); + QAbstractScrollArea::setFont(font); + + int wRowsHeight = QFontMetrics(this->font()).height(); + wRowsHeight = (wRowsHeight * 105) / 100; + wRowsHeight = (wRowsHeight % 2) == 0 ? wRowsHeight : wRowsHeight + 1; + mRowHeight = wRowsHeight; + mCharWidth = QFontMetrics(this->font()).averageCharWidth(); + + memset(&wRegDumpStruct, 0, sizeof(REGDUMP)); + // Context Menu this->setContextMenuPolicy(Qt::CustomContextMenu); - - - - mSelected = -1; - - mRegList = new QList(); - mRegNamesList = new QList(); - - mRegList->append(ui->AXRegLabel); - mRegNamesList->append(CAX); - mRegList->append(ui->CXRegLabel); - mRegNamesList->append(CCX); - mRegList->append(ui->DXRegLabel); - mRegNamesList->append(CDX); - mRegList->append(ui->BXRegLabel); - mRegNamesList->append(CBX); - mRegList->append(ui->DIRegLabel); - mRegNamesList->append(CDI); - mRegList->append(ui->BPRegLabel); - mRegNamesList->append(CBP); - mRegList->append(ui->SIRegLabel); - mRegNamesList->append(CSI); - mRegList->append(ui->SPRegLabel); - mRegNamesList->append(CSP); - -#ifdef _WIN64 - mRegList->append(ui->R8RegLabel); - mRegNamesList->append(R8); - mRegList->append(ui->R9RegLabel); - mRegNamesList->append(R9); - mRegList->append(ui->R10RegLabel); - mRegNamesList->append(R10); - mRegList->append(ui->R11RegLabel); - mRegNamesList->append(R11); - mRegList->append(ui->R12RegLabel); - mRegNamesList->append(R12); - mRegList->append(ui->R13RegLabel); - mRegNamesList->append(R13); - mRegList->append(ui->R14RegLabel); - mRegNamesList->append(R14); - mRegList->append(ui->R15RegLabel); - mRegNamesList->append(R15); -#endif - - mRegList->append(ui->IPRegLabel); - mRegNamesList->append(CIP); - - mRegList->append(ui->FLAGSRegLabel); - mRegNamesList->append(EFLAGS); - - mRegList->append(ui->CFRegLabel); - mRegNamesList->append(CF); - mRegList->append(ui->PFRegLabel); - mRegNamesList->append(PF); - mRegList->append(ui->AFRegLabel); - mRegNamesList->append(AF); - mRegList->append(ui->ZFRegLabel); - mRegNamesList->append(ZF); - mRegList->append(ui->SFRegLabel); - mRegNamesList->append(SF); - mRegList->append(ui->TFRegLabel); - mRegNamesList->append(TF); - mRegList->append(ui->IFRegLabel); - mRegNamesList->append(IF); - mRegList->append(ui->DFRegLabel); - mRegNamesList->append(DF); - mRegList->append(ui->OFRegLabel); - mRegNamesList->append(OF); - - mRegList->append(ui->GSRegLabel); - mRegNamesList->append(GS); - mRegList->append(ui->FSRegLabel); - mRegNamesList->append(FS); - mRegList->append(ui->ESRegLabel); - mRegNamesList->append(ES); - mRegList->append(ui->DSRegLabel); - mRegNamesList->append(DS); - mRegList->append(ui->CSRegLabel); - mRegNamesList->append(CS); - mRegList->append(ui->SSRegLabel); - mRegNamesList->append(SS); - - mRegList->append(ui->DR0RegLabel); - mRegNamesList->append(DR0); - mRegList->append(ui->DR1RegLabel); - mRegNamesList->append(DR1); - mRegList->append(ui->DR2RegLabel); - mRegNamesList->append(DR2); - mRegList->append(ui->DR3RegLabel); - mRegNamesList->append(DR3); - mRegList->append(ui->DR6RegLabel); - mRegNamesList->append(DR6); - mRegList->append(ui->DR7RegLabel); - mRegNamesList->append(DR7); - - for(wI = 0; wI < mRegList->size(); wI++) - { - QLabel* curLabel=mRegList->at(wI); - QFont wFont(curLabel->font()); - wFont.setFamily("Monospace"); - wFont.setStyleHint(QFont::Monospace); - wFont.setFixedPitch(true); - curLabel->setAutoFillBackground(true); - curLabel->setFont(wFont); - curLabel->setFixedWidth(QFontMetrics(wFont).width(curLabel->text())+1); - } - + // foreign messages connect(Bridge::getBridge(), SIGNAL(updateRegisters()), this, SLOT(updateRegistersSlot())); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayCustomContextMenuSlot(QPoint))); connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); + // self communication for repainting (maybe some other widgets needs this information, too) + connect(this,SIGNAL(refresh()),this,SLOT(repaint())); + // context menu actions + connect(wCM_Increment,SIGNAL(triggered()),this,SLOT(onIncrementAction())); + connect(wCM_Decrement,SIGNAL(triggered()),this,SLOT(onDecrementAction())); + connect(wCM_Zero,SIGNAL(triggered()),this,SLOT(onZeroAction())); + connect(wCM_SetToOne,SIGNAL(triggered()),this,SLOT(onSetToOneAction())); + connect(wCM_Modify,SIGNAL(triggered()),this,SLOT(onModifyAction())); + connect(wCM_ToggleValue,SIGNAL(triggered()),this,SLOT(onToggleValueAction())); + connect(wCM_CopyToClipboard,SIGNAL(triggered()),this,SLOT(onCopyToClipboardAction())); + + } RegistersView::~RegistersView() { - delete ui; + +} + +/** + * @brief retrieves the register id from given corrdinates of the viewport + * @param line + * @param offset (x-coord) + * @param resulting register-id + * @return true if register found + */ +bool RegistersView::identifyRegister(const int line, const int offset, REGISTER_NAME *clickedReg){ + // we start by an unknown register id + *clickedReg = UNKNOWN; + bool found_flag = false; + QMap::const_iterator it = mRegisterPlaces.begin(); + // iterate all registers that being displayed + while (it != mRegisterPlaces.end()) { + if( (it.value().line == line) /* same line ? */ + && ( (1 + it.value().start) <= offset) /* between start ... ? */ + && ( offset<= (1+it.value().start+it.value().labelwidth+it.value().valuesize)) /* ... and end ? */ + ){ + // we found a matching register in the viewport + *clickedReg = (REGISTER_NAME)it.key(); + found_flag = true; + break; + + } + ++it; + } + return found_flag; } void RegistersView::mousePressEvent(QMouseEvent* event) { - Q_UNUSED(event); - int wI = 0; - int wSelected = -1; - QPalette wPalette; + // get mouse position + const int y = event->y()/(double)mRowHeight; + const int x = event->x()/(double)mCharWidth; - if(!DbgIsDebugging()) //disable register editing when not debugging - { - wSelected = -1; - return; + REGISTER_NAME r; + // do we find a corresponding register? + if(identifyRegister(y,x,&r)){ + mSelected = r; + emit refresh(); } - for(wI = 0; wI < mRegList->size(); wI++) - { - if(mRegList->at(wI)->underMouse() == true) - { - wSelected = wI; - } - } - - if(wSelected != mSelected) - { - // Unselect previous register - if(mSelected != -1) - { - wPalette.setColor(QPalette::Window, QColor(192,192,192,0)); - mRegList->at(mSelected)->setPalette(wPalette); - } - - // Select new register - mSelected = wSelected; - if(mSelected != -1) - { - wPalette.setColor(QPalette::Window, QColor(192,192,192,255)); - mRegList->at(mSelected)->setPalette(wPalette); - } - } } @@ -181,145 +207,219 @@ void RegistersView::mousePressEvent(QMouseEvent* event) void RegistersView::mouseDoubleClickEvent(QMouseEvent* event) { Q_UNUSED(event); - if(mSelected==-1) //no selection - return; + // is current register general purposes register ? + if(mGPR.contains(mSelected)){ + wCM_Modify->trigger(); + }else if(mFlags.contains(mSelected)) // is flag ? + wCM_ToggleValue->trigger(); - if( mRegNamesList->at(mSelected) == CAX || - mRegNamesList->at(mSelected) == CCX || - mRegNamesList->at(mSelected) == CDX || - mRegNamesList->at(mSelected) == CBX || - mRegNamesList->at(mSelected) == CDI || - mRegNamesList->at(mSelected) == CBP || - mRegNamesList->at(mSelected) == CSI || - mRegNamesList->at(mSelected) == CSP || +} - mRegNamesList->at(mSelected) == R8 || - mRegNamesList->at(mSelected) == R9 || - mRegNamesList->at(mSelected) == R10 || - mRegNamesList->at(mSelected) == R11 || - mRegNamesList->at(mSelected) == R12 || - mRegNamesList->at(mSelected) == R13 || - mRegNamesList->at(mSelected) == R14 || - mRegNamesList->at(mSelected) == R15 || +void RegistersView::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + QPainter wPainter(this->viewport()); - mRegNamesList->at(mSelected) == CIP || - - mRegNamesList->at(mSelected) == EFLAGS) - { - //double clicked general register - displayEditDialog(); + QMap::const_iterator it = mRegisterMapping.begin(); + // iterate all registers + while (it != mRegisterMapping.end()) { + // paint register at given position + drawRegister(&wPainter,it.key(),registerValue(&wRegDumpStruct,it.key())); + it++; } - else if(mRegNamesList->at(mSelected) == CF || - mRegNamesList->at(mSelected) == PF || - mRegNamesList->at(mSelected) == AF || - mRegNamesList->at(mSelected) == ZF || - mRegNamesList->at(mSelected) == SF || - mRegNamesList->at(mSelected) == TF || - mRegNamesList->at(mSelected) == IF || - mRegNamesList->at(mSelected) == DF || - mRegNamesList->at(mSelected) == OF) - { - //double clicked a flag - setRegister(mRegNamesList->at(mSelected), mRegList->at(mSelected)->text().toInt()^1); //toggle flag (stupid way in fact) + +} + +void RegistersView::keyPressEvent(QKeyEvent *event) +{ + if(event->matches(QKeySequence::Copy)){ + wCM_CopyToClipboard->trigger(); + return; + } + + + switch(event->key()) { + case Qt::Key_0: + wCM_Zero->trigger(); + break; + case Qt::Key_1: + wCM_SetToOne->trigger(); + break; + case Qt::Key_Plus: + wCM_Increment->trigger(); + break; + case Qt::Key_Minus: + wCM_Decrement->trigger(); + break; + case Qt::Key_Space: + wCM_ToggleValue->trigger(); + break; + case Qt::Key_Enter: + wCM_Modify->trigger(); + break; + + default: + break; } } +QSize RegistersView::sizeHint() const +{ + // 32 character width + return QSize(32*mCharWidth ,this->viewport()->height()); +} + +void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ + // is the register-id known? + if(mRegisterMapping.contains(reg)){ + // padding to the left is at least one character (looks better) + int offset = mCharWidth*(1 + mRegisterPlaces[reg].start); + // draw name of value + p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),mRegisterMapping[reg]); + p->save(); + if(mRegisterUpdates.contains(reg)) + p->setPen(Qt::red); + else + p->setPen(Qt::black); + + if(mSelected == reg){ + p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(QColor("#eee"))); + } + // draw value + p->drawText(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); + + // do we have a label ? + char label_text[MAX_LABEL_SIZE]=""; + char module_text[MAX_MODULE_SIZE]=""; + bool hasLabel=DbgGetLabelAt(value, SEG_DEFAULT, label_text); + bool hasModule=DbgGetModuleAt(value, module_text); + bool isASCII=false; + + offset += mRegisterPlaces[reg].labelwidth*mCharWidth + QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper().length()*mCharWidth; + offset += 5*mCharWidth; + QString newText = ""; + if(hasLabel && hasModule){ + newText="<"+QString(module_text)+"."+QString(label_text)+">"; + }else if(hasModule){ + newText=QString(module_text)+"."+QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper(); + }else if(hasLabel ){ + newText="<"+QString(label_text)+">"; + }else{ + // can we interpret the character as ASCII ?? + if(mGPR.contains(reg)){ + if(value == (value & 0xFF)){ + QChar c = QChar((char)value); + if(c.isPrint()){ + newText=QString("'%1'").arg((char)value); + isASCII=true; + } + } + } + } + // are there additional informations? + if(hasLabel || hasModule || isASCII) + p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),newText); + + p->restore(); + } + +} void RegistersView::updateRegistersSlot() { - REGDUMP wRegDumpStruct; - memset(&wRegDumpStruct, 0, sizeof(REGDUMP)); - - DbgGetRegDump(&wRegDumpStruct); - - setRegisters(&wRegDumpStruct); + // read registers + REGDUMP z; + memset(&z, 0, sizeof(REGDUMP)); + DbgGetRegDump(&z); + // update gui + setRegisters(&z); } void RegistersView::displayEditDialog() { WordEditDialog wEditDial(this); - QString wReg = mRegList->at(mSelected)->text(); + QString wReg = registerValue(&wRegDumpStruct,mSelected); #ifdef _WIN64 - wEditDial.setup(QString("Edit"), wReg.toULongLong(0, 16), 8); + wEditDial.setup(QString("Edit"),registerValue(&wRegDumpStruct,mSelected), 8); #else - wEditDial.setup(QString("Edit"), wReg.toULong(0, 16), 4); + wEditDial.setup(QString("Edit"), registerValue(&wRegDumpStruct,mSelected), 4); #endif if(wEditDial.exec() == QDialog::Accepted) //OK button clicked - setRegister(mRegNamesList->at(mSelected), wEditDial.getVal()); + setRegister(mSelected, wEditDial.getVal()); + +} + +void RegistersView::onIncrementAction() +{ + if(mGPR.contains(mSelected)) + setRegister(mSelected, registerValue(&wRegDumpStruct,mSelected) + 1); +} + +void RegistersView::onDecrementAction() +{ + if(mGPR.contains(mSelected)) + setRegister(mSelected, registerValue(&wRegDumpStruct,mSelected) - 1); +} + +void RegistersView::onZeroAction() +{ + setRegister(mSelected, 0); +} + +void RegistersView::onSetToOneAction() +{ + setRegister(mSelected, 1); +} + +void RegistersView::onModifyAction() +{ + if(mGPR.contains(mSelected)) + displayEditDialog(); +} + +void RegistersView::onToggleValueAction() +{ + if(mFlags.contains(mSelected)) + setRegister(mSelected, ((int)registerValue(&wRegDumpStruct,mSelected))^1); + else{ + int_t val = registerValue(&wRegDumpStruct,mSelected); + val++; + val *= -1; + setRegister(mSelected,val); + } + +} + +void RegistersView::onCopyToClipboardAction() +{ + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(QString("%1").arg(registerValue(&wRegDumpStruct,mSelected), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper()); } void RegistersView::displayCustomContextMenuSlot(QPoint pos) { QMenu wMenu(this); - if(mSelected != -1) + if(mSelected != UNKNOWN) { - if( mRegNamesList->at(mSelected) == CAX || - mRegNamesList->at(mSelected) == CCX || - mRegNamesList->at(mSelected) == CDX || - mRegNamesList->at(mSelected) == CBX || - mRegNamesList->at(mSelected) == CDI || - mRegNamesList->at(mSelected) == CBP || - mRegNamesList->at(mSelected) == CSI || - mRegNamesList->at(mSelected) == CSP || + if(registerValue(&wRegDumpStruct,mSelected) >= 1) + wMenu.addAction(wCM_Zero); + if(registerValue(&wRegDumpStruct,mSelected) == 0) + wMenu.addAction(wCM_SetToOne); + wMenu.addAction(wCM_ToggleValue); - mRegNamesList->at(mSelected) == R8 || - mRegNamesList->at(mSelected) == R9 || - mRegNamesList->at(mSelected) == R10 || - mRegNamesList->at(mSelected) == R11 || - mRegNamesList->at(mSelected) == R12 || - mRegNamesList->at(mSelected) == R13 || - mRegNamesList->at(mSelected) == R14 || - mRegNamesList->at(mSelected) == R15 || - - mRegNamesList->at(mSelected) == CIP || - - mRegNamesList->at(mSelected) == EFLAGS) + if(mGPR.contains(mSelected)) { - QAction* wEdit = wMenu.addAction("Edit"); - QAction* wSetTo0 = wMenu.addAction("Set to 0"); - QAction* wSetTo1 = wMenu.addAction("Set to 1"); - QAction* wAction = wMenu.exec(this->mapToGlobal(pos)); + wMenu.addAction(wCM_Modify); + wMenu.addAction(wCM_Increment); + wMenu.addAction(wCM_Decrement); - if(wAction == wEdit) - { - displayEditDialog(); - } - else if(wAction == wSetTo0) - { - setRegister(mRegNamesList->at(mSelected), 0); - } - else if(wAction == wSetTo1) - { - setRegister(mRegNamesList->at(mSelected), 1); - } - } - else if(mRegNamesList->at(mSelected) == CF || - mRegNamesList->at(mSelected) == PF || - mRegNamesList->at(mSelected) == AF || - mRegNamesList->at(mSelected) == ZF || - mRegNamesList->at(mSelected) == SF || - mRegNamesList->at(mSelected) == TF || - mRegNamesList->at(mSelected) == IF || - mRegNamesList->at(mSelected) == DF || - mRegNamesList->at(mSelected) == OF) - { - QAction* wSetTo0 = wMenu.addAction("Set to 0"); - QAction* wSetTo1 = wMenu.addAction("Set to 1"); - QAction* wAction = wMenu.exec(this->mapToGlobal(pos)); - - if(wAction == wSetTo0) - { - setRegister(mRegNamesList->at(mSelected), 0); - } - else if(wAction == wSetTo1) - { - setRegister(mRegNamesList->at(mSelected), 1); - } } + wMenu.addAction(wCM_CopyToClipboard); + wMenu.exec(this->mapToGlobal(pos)); } else if(DbgIsDebugging()) { @@ -338,167 +438,23 @@ void RegistersView::displayCustomContextMenuSlot(QPoint pos) void RegistersView::setRegister(REGISTER_NAME reg, uint_t value) { - QString wRegName = ""; + // is register-id known? + if(mRegisterMapping.contains(reg)){ + // map "cax" to "eax" or "rax" + QString wRegName = mRegisterMapping.constFind(reg).value(); - // Basic registers - if(reg == CAX) - { -#ifdef _WIN64 - wRegName = "rax"; -#else - wRegName = "eax"; -#endif - } - else if(reg == CCX) - { -#ifdef _WIN64 - wRegName = "rcx"; -#else - wRegName = "ecx"; -#endif - } - else if(reg == CDX) - { -#ifdef _WIN64 - wRegName = "rdx"; -#else - wRegName = "edx"; -#endif - } - else if(reg == CBX) - { -#ifdef _WIN64 - wRegName = "rbx"; -#else - wRegName = "ebx"; -#endif - } - else if(reg == CDI) - { -#ifdef _WIN64 - wRegName = "rdi"; -#else - wRegName = "edi"; -#endif - } - else if(reg == CBP) - { -#ifdef _WIN64 - wRegName = "rbp"; -#else - wRegName = "ebp"; -#endif - } - else if(reg == CSI) - { -#ifdef _WIN64 - wRegName = "rsi"; -#else - wRegName = "esi"; -#endif - } - else if(reg == CSP) - { -#ifdef _WIN64 - wRegName = "rsp"; -#else - wRegName = "esp"; -#endif - } + // flags need to '!' infront + if(mFlags.contains(reg)) + wRegName = "!"+wRegName; - // General purpose register - else if(reg == R8) - { - wRegName = "r8"; - } - else if(reg == R9) - { - wRegName = "r9"; - } - else if(reg == R10) - { - wRegName = "r10"; - } - else if(reg == R11) - { - wRegName = "r11"; - } - else if(reg == R12) - { - wRegName = "r12"; - } - else if(reg == R13) - { - wRegName = "r13"; - } - else if(reg == R14) - { - wRegName = "r14"; - } - else if(reg == R15) - { - wRegName = "r15"; - } - // Instruction pointer register - else if(reg == CIP) - { -#ifdef _WIN64 - wRegName = "rip"; -#else - wRegName = "eip"; -#endif + // we change the value (so highlight it) + mRegisterUpdates.insert(reg); + // tell everything the compiler + DbgValToString(wRegName.toUtf8().constData(), value); + // force repaint + emit refresh(); } - - // Flags - else if(reg == EFLAGS) - { -#ifdef _WIN64 - wRegName = "rflags"; -#else - wRegName = "eflags"; -#endif - } - else if(reg == CF) - { - wRegName = "!cf"; - } - else if(reg == PF) - { - wRegName = "!pf"; - } - else if(reg == AF) - { - wRegName = "!af"; - } - else if(reg == ZF) - { - wRegName = "!zf"; - } - else if(reg == SF) - { - wRegName = "!sf"; - } - else if(reg == TF) - { - wRegName = "!tf"; - } - else if(reg == IF) - { - wRegName = "!if"; - } - else if(reg == DF) - { - wRegName = "!df"; - } - else if(reg == OF) - { - wRegName = "!of"; - } - else - return; - - DbgValToString(wRegName.toUtf8().constData(), value); } @@ -506,58 +462,87 @@ void RegistersView::debugStateChangedSlot(DBGSTATE state) { if(state==stopped) { - REGDUMP wRegDumpStruct; - memset(&wRegDumpStruct, 0, sizeof(REGDUMP)); - setRegisters(&wRegDumpStruct); + updateRegistersSlot(); } } +void RegistersView::repaint() +{ + this->viewport()->repaint(); +} + + +int_t RegistersView::registerValue(const REGDUMP* regd,const REGISTER_NAME reg){ + // this is probably the most efficient general method to access the values of the struct + + if(reg==CAX) return regd->cax; + if(reg==CBX) return regd->cbx; + if(reg==CCX) return regd->ccx; + if(reg==CDX) return regd->cdx; + if(reg==CSI) return regd->csi; + if(reg==CDI) return regd->cdi; + if(reg==CBP) return regd->cbp; + if(reg==CSP) return regd->csp; + + if(reg==CIP) return regd->cip; + if(reg==EFLAGS) return regd->eflags; +#ifdef _WIN64 + if(reg==R8) return regd->r8; + if(reg==R9) return regd->r9; + if(reg==R10) return regd->r10; + if(reg==R11) return regd->r11; + if(reg==R12) return regd->r12; + if(reg==R13) return regd->r13; + if(reg==R14) return regd->r14; + if(reg==R15) return regd->r15; +#endif + // CF,PF,AF,ZF,SF,TF,IF,DF,OF + if(reg==CF) return regd->flags.c; + if(reg==PF) return regd->flags.p; + if(reg==AF) return regd->flags.a; + if(reg==ZF) return regd->flags.z; + if(reg==SF) return regd->flags.s; + if(reg==TF) return regd->flags.t; + if(reg==IF) return regd->flags.i; + if(reg==DF) return regd->flags.d; + if(reg==OF) return regd->flags.o; + + // GS,FS,ES,DS,CS,SS + if(reg==GS) return regd->gs; + if(reg==FS) return regd->fs; + if(reg==ES) return regd->es; + if(reg==DS) return regd->ds; + if(reg==CS) return regd->cs; + if(reg==SS) return regd->ss; + + if(reg==DR0) return regd->dr0; + if(reg==DR1) return regd->dr1; + if(reg==DR2) return regd->dr2; + if(reg==DR3) return regd->dr3; + if(reg==DR6) return regd->dr6; + if(reg==DR7) return regd->dr7; + + return 0; +} + void RegistersView::setRegisters(REGDUMP* reg) { - ui->AXRegLabel->setText(QString("%1").arg(reg->cax, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->CXRegLabel->setText(QString("%1").arg(reg->ccx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DXRegLabel->setText(QString("%1").arg(reg->cdx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->BXRegLabel->setText(QString("%1").arg(reg->cbx, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DIRegLabel->setText(QString("%1").arg(reg->cdi, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->BPRegLabel->setText(QString("%1").arg(reg->cbp, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->SIRegLabel->setText(QString("%1").arg(reg->csi, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->SPRegLabel->setText(QString("%1").arg(reg->csp, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); + // tests if new-register-value == old-register-value holds + mRegisterUpdates.clear(); -#ifdef _WIN64 - ui->R8RegLabel->setText(QString("%1").arg(reg->r8, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R9RegLabel->setText(QString("%1").arg(reg->r9, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R10RegLabel->setText(QString("%1").arg(reg->r10, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R11RegLabel->setText(QString("%1").arg(reg->r11, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R12RegLabel->setText(QString("%1").arg(reg->r12, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R13RegLabel->setText(QString("%1").arg(reg->r13, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R14RegLabel->setText(QString("%1").arg(reg->r14, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->R15RegLabel->setText(QString("%1").arg(reg->r15, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); -#endif + QMap::const_iterator it = mRegisterMapping.begin(); + // iterate all ids (CAX, CBX, ...) + while (it != mRegisterMapping.end()) { + // does a register-value change happens? + if(registerValue(reg,it.key()) != registerValue(&wRegDumpStruct,it.key())) + mRegisterUpdates.insert(it.key()); + it++; + } - ui->IPRegLabel->setText(QString("%1").arg(reg->cip, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); + // now we can save the values + wRegDumpStruct = (*reg); - ui->FLAGSRegLabel->setText(QString("%1").arg(reg->eflags, sizeof(unsigned int) * 2, 16, QChar('0')).toUpper()); - ui->CFRegLabel->setText(QString("%1").arg(reg->flags.c, 1, 16, QChar('0')).toUpper()); - ui->PFRegLabel->setText(QString("%1").arg(reg->flags.p, 1, 16, QChar('0')).toUpper()); - ui->AFRegLabel->setText(QString("%1").arg(reg->flags.a, 1, 16, QChar('0')).toUpper()); - ui->ZFRegLabel->setText(QString("%1").arg(reg->flags.z, 1, 16, QChar('0')).toUpper()); - ui->SFRegLabel->setText(QString("%1").arg(reg->flags.s, 1, 16, QChar('0')).toUpper()); - ui->TFRegLabel->setText(QString("%1").arg(reg->flags.t, 1, 16, QChar('0')).toUpper()); - ui->IFRegLabel->setText(QString("%1").arg(reg->flags.i, 1, 16, QChar('0')).toUpper()); - ui->DFRegLabel->setText(QString("%1").arg(reg->flags.d, 1, 16, QChar('0')).toUpper()); - ui->OFRegLabel->setText(QString("%1").arg(reg->flags.o, 1, 16, QChar('0')).toUpper()); + // force repaint + emit refresh(); - ui->GSRegLabel->setText(QString("%1").arg(reg->gs, 4, 16, QChar('0')).toUpper()); - ui->FSRegLabel->setText(QString("%1").arg(reg->fs, 4, 16, QChar('0')).toUpper()); - ui->ESRegLabel->setText(QString("%1").arg(reg->es, 4, 16, QChar('0')).toUpper()); - ui->DSRegLabel->setText(QString("%1").arg(reg->ds, 4, 16, QChar('0')).toUpper()); - ui->CSRegLabel->setText(QString("%1").arg(reg->cs, 4, 16, QChar('0')).toUpper()); - ui->SSRegLabel->setText(QString("%1").arg(reg->ss, 4, 16, QChar('0')).toUpper()); - - ui->DR0RegLabel->setText(QString("%1").arg(reg->dr0, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DR1RegLabel->setText(QString("%1").arg(reg->dr1, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DR2RegLabel->setText(QString("%1").arg(reg->dr2, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DR3RegLabel->setText(QString("%1").arg(reg->dr3, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DR6RegLabel->setText(QString("%1").arg(reg->dr6, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); - ui->DR7RegLabel->setText(QString("%1").arg(reg->dr7, sizeof(uint_t) * 2, 16, QChar('0')).toUpper()); } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index 08210295..9dce2ea0 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -4,86 +4,118 @@ #include #include #include +#include #include "Bridge.h" #include "WordEditDialog.h" #include "LineEditDialog.h" +#include -namespace Ui -{ +namespace Ui { class RegistersView; } -class RegistersView : public QWidget +class RegistersView : public QAbstractScrollArea { Q_OBJECT public: - enum REGISTER_NAME - { - CAX, - CCX, - CDX, - CBX, - CDI, - CBP, - CSI, - CSP, - - R8, - R9, - R10, - R11, - R12, - R13, - R14, - R15, - + // all possible register ids + enum REGISTER_NAME { + CAX,CCX,CDX,CBX,CDI,CBP,CSI,CSP, + R8,R9,R10,R11,R12,R13,R14,R15, CIP, - - EFLAGS, - CF, - PF, - AF, - ZF, - SF, - TF, - IF, - DF, - OF, - - GS, - FS, - ES, - DS, - CS, - SS, - - DR0, - DR1, - DR2, - DR3, - DR6, - DR7 + EFLAGS,CF,PF,AF,ZF,SF,TF,IF,DF,OF, + GS,FS,ES,DS,CS,SS, + DR0,DR1,DR2,DR3,DR6,DR7, + UNKNOWN }; + // contains viewport position of register + struct Register_Position{ + int line; + int start; + int valuesize; + int labelwidth; + + Register_Position(int l,int s,int w, int v){ + line = l; + start = s; + valuesize = v; + labelwidth = w; + } + Register_Position(){ + line = 0; + start = 0; + valuesize = 0; + labelwidth = 0; + } + }; + + explicit RegistersView(QWidget *parent = 0); ~RegistersView(); - void mousePressEvent(QMouseEvent* event); - void mouseDoubleClickEvent(QMouseEvent* event); - void setRegisters(REGDUMP *reg); + + QSize sizeHint() const; public slots: void updateRegistersSlot(); void displayCustomContextMenuSlot(QPoint pos); void setRegister(REGISTER_NAME reg, uint_t value); void debugStateChangedSlot(DBGSTATE state); + void repaint(); +signals: + void refresh(); + +protected: + // events + virtual void mousePressEvent(QMouseEvent* event); + virtual void mouseDoubleClickEvent(QMouseEvent* event); + virtual void paintEvent(QPaintEvent* event); + virtual void keyPressEvent(QKeyEvent *event); + + // use-in-class-only methods + void drawRegister(QPainter *p, REGISTER_NAME reg, uint_t value); + void setRegisters(REGDUMP *reg); + int_t registerValue(const REGDUMP *regd, const REGISTER_NAME reg); + bool identifyRegister(const int y, const int x, REGISTER_NAME *clickedReg); + + void displayEditDialog(); + +protected slots: + void onIncrementAction(); + void onDecrementAction(); + void onZeroAction(); + void onSetToOneAction(); + void onModifyAction(); + void onToggleValueAction(); + void onCopyToClipboardAction(); + private: - void displayEditDialog(); - Ui::RegistersView *ui; - QList* mRegList; - QList* mRegNamesList; - int mSelected; + // holds current selected register + REGISTER_NAME mSelected; + // general purposes register id s (cax, ..., r8, ....) + QSet mGPR; + // all flags + QSet mFlags; + // contains all id's of registers if there occurs a change + QSet mRegisterUpdates; + // maps from id to name + QMap mRegisterMapping; + // contains viewport positions + QMap mRegisterPlaces; + // contains a dump of the current register values + REGDUMP wRegDumpStruct; + // font measures (TODO: create a class that calculates all thos values) + unsigned int mRowHeight, mCharWidth; + // context menu actions + QAction* wCM_Increment; + QAction* wCM_Decrement; + QAction* wCM_Zero; + QAction* wCM_SetToOne; + QAction* wCM_Modify; + QAction* wCM_ToggleValue; + QAction* wCM_CopyToClipboard; }; #endif // REGISTERSVIEW_H diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView32.ui b/x64_dbg_gui/Project/Src/BasicView/RegistersView32.ui deleted file mode 100644 index 3bfd07fd..00000000 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView32.ui +++ /dev/null @@ -1,871 +0,0 @@ - - - RegistersView - - - - 0 - 0 - 150 - 480 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 148 - 460 - - - - - 148 - 460 - - - - - 148 - 460 - - - - - - 10 - 405 - 50 - 13 - - - - DR3 - - - - - - 10 - 435 - 50 - 13 - - - - DR7 - - - - - - 85 - 205 - 30 - 13 - - - - DF - - - - - - 60 - 80 - 55 - 13 - - - - 00000000 - - - - - - 40 - 235 - 15 - 13 - - - - 0 - - - - - - 10 - 175 - 30 - 13 - - - - CF - - - - - - 60 - 420 - 55 - 13 - - - - 00000000 - - - - - - 60 - 390 - 55 - 13 - - - - 00000000 - - - - - - 60 - 135 - 55 - 13 - - - - 00000000 - - - - - - 10 - 375 - 50 - 13 - - - - DR1 - - - - - - 10 - 95 - 50 - 13 - - - - ESI - - - - - - 10 - 360 - 50 - 13 - - - - DR0 - - - - - - 60 - 320 - 40 - 13 - - - - 0000 - - - - - - 60 - 275 - 40 - 13 - - - - 0000 - - - - - - 10 - 135 - 50 - 13 - - - - EIP - - - - - - 10 - 20 - 50 - 13 - - - - ECX - - - - - - 60 - 35 - 55 - 13 - - - - 00000000 - - - - - - 60 - 65 - 55 - 13 - - - - 00000000 - - - - - - 10 - 5 - 50 - 13 - - - - EAX - - - - - - 60 - 260 - 40 - 13 - - - - 0000 - - - - - - 60 - 95 - 55 - 13 - - - - 00000000 - - - - - - 40 - 220 - 15 - 13 - - - - 0 - - - - - - 60 - 110 - 55 - 13 - - - - 00000000 - - - - - - 10 - 305 - 50 - 13 - - - - DS - - - - - - 85 - 220 - 30 - 13 - - - - OF - - - - - - 60 - 5 - 55 - 13 - - - - 00000000 - - - - - - 60 - 305 - 40 - 13 - - - - 0000 - - - - - - 40 - 205 - 15 - 13 - - - - 0 - - - - - - 60 - 20 - 55 - 13 - - - - 00000000 - - - - - - 10 - 390 - 50 - 13 - - - - DR2 - - - - - - 10 - 320 - 50 - 13 - - - - CS - - - - - - 10 - 275 - 50 - 13 - - - - FS - - - - - - 85 - 175 - 30 - 13 - - - - TF - - - - - - 10 - 290 - 50 - 13 - - - - ES - - - - - - 85 - 190 - 30 - 13 - - - - IF - - - - - - 60 - 290 - 40 - 13 - - - - 0000 - - - - - - 60 - 360 - 55 - 13 - - - - 00000000 - - - - - - 40 - 190 - 15 - 13 - - - - 0 - - - - - - 10 - 50 - 50 - 13 - - - - EBX - - - - - - 115 - 190 - 15 - 13 - - - - 0 - - - - - - 10 - 205 - 30 - 13 - - - - AF - - - - - - 115 - 220 - 15 - 13 - - - - 0 - - - - - - 60 - 160 - 55 - 13 - - - - 00000000 - - - - - - 115 - 205 - 15 - 13 - - - - 0 - - - - - - 40 - 175 - 15 - 13 - - - - 0 - - - - - - 10 - 160 - 50 - 13 - - - - EFLAGS - - - - - - 60 - 405 - 55 - 13 - - - - 00000000 - - - - - - 60 - 50 - 55 - 13 - - - - 00000000 - - - - - - 10 - 220 - 30 - 13 - - - - ZF - - - - - - 10 - 260 - 50 - 13 - - - - GS - - - - - - 60 - 375 - 55 - 13 - - - - 00000000 - - - - - - 10 - 335 - 50 - 13 - - - - SS - - - - - - 10 - 190 - 30 - 13 - - - - PF - - - - - - 10 - 65 - 50 - 13 - - - - ESP - - - - - - 115 - 175 - 15 - 13 - - - - 0 - - - - - - 60 - 435 - 55 - 13 - - - - 00000000 - - - - - - 10 - 420 - 50 - 13 - - - - DR6 - - - - - - 10 - 235 - 30 - 13 - - - - SF - - - - - - 10 - 35 - 50 - 13 - - - - EDX - - - - - - 10 - 110 - 50 - 13 - - - - EDI - - - - - - 60 - 335 - 40 - 13 - - - - 0000 - - - - - - 10 - 80 - 50 - 13 - - - - EBP - - - - - - - - - - diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView64.ui b/x64_dbg_gui/Project/Src/BasicView/RegistersView64.ui deleted file mode 100644 index 2c0053ba..00000000 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView64.ui +++ /dev/null @@ -1,1079 +0,0 @@ - - - RegistersView - - - - 0 - 0 - 180 - 600 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 178 - 590 - - - - - 178 - 590 - - - - - 178 - 590 - - - - - - 60 - 565 - 110 - 13 - - - - 0000000000000000 - - - - - - 40 - 335 - 15 - 13 - - - - 0 - - - - - - 85 - 350 - 30 - 13 - - - - OF - - - - - - 60 - 210 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 520 - 50 - 13 - - - - DR2 - - - - - - 10 - 180 - 50 - 13 - - - - R11 - - - - - - 10 - 505 - 50 - 13 - - - - DR1 - - - - - - 10 - 465 - 50 - 13 - - - - SS - - - - - - 60 - 535 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 135 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 225 - 110 - 13 - - - - 0000000000000000 - - - - - - 85 - 335 - 30 - 13 - - - - DF - - - - - - 60 - 180 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 390 - 50 - 13 - - - - GS - - - - - - 40 - 365 - 15 - 13 - - - - 0 - - - - - - 115 - 305 - 15 - 13 - - - - 0 - - - - - - 60 - 50 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 165 - 50 - 13 - - - - R10 - - - - - - 10 - 435 - 50 - 13 - - - - DS - - - - - - 10 - 420 - 50 - 13 - - - - ES - - - - - - 10 - 490 - 50 - 13 - - - - DR0 - - - - - - 60 - 520 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 405 - 40 - 13 - - - - 0000 - - - - - - 40 - 305 - 15 - 13 - - - - 0 - - - - - - 60 - 65 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 390 - 40 - 13 - - - - 0000 - - - - - - 10 - 195 - 50 - 13 - - - - R12 - - - - - - 60 - 465 - 40 - 13 - - - - 0000 - - - - - - 10 - 535 - 50 - 13 - - - - DR3 - - - - - - 60 - 435 - 40 - 13 - - - - 0000 - - - - - - 10 - 225 - 50 - 13 - - - - R14 - - - - - - 60 - 420 - 40 - 13 - - - - 0000 - - - - - - 60 - 110 - 110 - 13 - - - - 0000000000000000 - - - - - - 85 - 305 - 30 - 13 - - - - TF - - - - - - 10 - 335 - 30 - 13 - - - - AF - - - - - - 10 - 350 - 30 - 13 - - - - ZF - - - - - - 60 - 450 - 40 - 13 - - - - 0000 - - - - - - 10 - 150 - 50 - 13 - - - - R9 - - - - - - 10 - 135 - 50 - 13 - - - - R8 - - - - - - 10 - 210 - 50 - 13 - - - - R13 - - - - - - 115 - 320 - 15 - 13 - - - - 0 - - - - - - 10 - 35 - 50 - 13 - - - - RDX - - - - - - 10 - 265 - 50 - 13 - - - - RIP - - - - - - 10 - 405 - 50 - 13 - - - - FS - - - - - - 10 - 565 - 50 - 13 - - - - DR7 - - - - - - 10 - 320 - 30 - 13 - - - - PF - - - - - - 60 - 5 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 80 - 50 - 13 - - - - RBP - - - - - - 60 - 290 - 60 - 13 - - - - 00000000 - - - - - - 60 - 35 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 150 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 450 - 50 - 13 - - - - CS - - - - - - 60 - 20 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 95 - 50 - 13 - - - - RSI - - - - - - 10 - 240 - 50 - 13 - - - - R15 - - - - - - 40 - 320 - 15 - 13 - - - - 0 - - - - - - 60 - 505 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 550 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 50 - 50 - 13 - - - - RBX - - - - - - 10 - 110 - 50 - 13 - - - - RDI - - - - - - 60 - 490 - 110 - 13 - - - - 0000000000000000 - - - - - - 40 - 350 - 15 - 13 - - - - 0 - - - - - - 85 - 320 - 30 - 13 - - - - IF - - - - - - 10 - 65 - 50 - 13 - - - - RSP - - - - - - 115 - 350 - 15 - 13 - - - - 0 - - - - - - 60 - 95 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 265 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 20 - 50 - 13 - - - - RCX - - - - - - 60 - 195 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 165 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 365 - 30 - 13 - - - - SF - - - - - - 10 - 305 - 30 - 13 - - - - CF - - - - - - 10 - 290 - 50 - 13 - - - - EFLAGS - - - - - - 60 - 80 - 110 - 13 - - - - 0000000000000000 - - - - - - 60 - 240 - 110 - 13 - - - - 0000000000000000 - - - - - - 10 - 5 - 50 - 13 - - - - RAX - - - - - - 115 - 335 - 15 - 13 - - - - 0 - - - - - - 10 - 550 - 50 - 13 - - - - DR6 - - - - - - - - - - From 85599241889764989425ff44293190b24a537869 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 11 Jun 2014 14:42:16 +0200 Subject: [PATCH 066/676] GUI: fixed RegistersView --- x64_dbg_gui/Project/DebuggerX64.pro | 2 - .../Project/Src/BasicView/RegistersView.cpp | 58 ++++++++----------- .../Project/Src/Gui/AppearanceDialog.cpp | 6 ++ x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 5 ++ 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 91d75bdb..6a816563 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -156,13 +156,11 @@ LIBS += -luser32 #message("x86 build") LIBS += -L"$$PWD/Src/ThirdPartyLibs/BeaEngine/" -lBeaEngine LIBS += -L"$$PWD/Src/Bridge/" -lx32_bridge - FORMS += Src/BasicView/RegistersView32.ui ## Windows x86 (32bit) specific build here } else { #message("x86_64 build") LIBS += -L"$$PWD/Src/ThirdPartyLibs/BeaEngine/" -lBeaEngine_64 LIBS += -L"$$PWD/Src/Bridge/" -lx64_bridge - FORMS += Src/BasicView/RegistersView64.ui ## Windows x64 (64bit) specific build here } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index f038360e..bea80625 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -1,6 +1,5 @@ #include "RegistersView.h" - - +#include "Configuration.h" RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) { @@ -49,27 +48,27 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) * (line , start, labelwidth, valuesize ) */ #ifdef _WIN64 - mRegisterMapping.insert(CAX,"RAX"); mRegisterPlace.insert(CAX,Register_Position(0,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CBX,"RBX"); mRegisterPlace.insert(CBX,Register_Position(1,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CCX,"RCX"); mRegisterPlace.insert(CCX,Register_Position(2,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CDX,"RDX"); mRegisterPlace.insert(CDX,Register_Position(3,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CSI,"RSI"); mRegisterPlace.insert(CSI,Register_Position(6,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CDI,"RDI"); mRegisterPlace.insert(CDI,Register_Position(7,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CBP,"RBP"); mRegisterPlace.insert(CBP,Register_Position(4,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CSP,"RSP"); mRegisterPlace.insert(CSP,Register_Position(5,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CAX,"RAX"); mRegisterPlaces.insert(CAX,Register_Position(0,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBX,"RBX"); mRegisterPlaces.insert(CBX,Register_Position(1,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CCX,"RCX"); mRegisterPlaces.insert(CCX,Register_Position(2,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDX,"RDX"); mRegisterPlaces.insert(CDX,Register_Position(3,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSI,"RSI"); mRegisterPlaces.insert(CSI,Register_Position(6,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CDI,"RDI"); mRegisterPlaces.insert(CDI,Register_Position(7,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CBP,"RBP"); mRegisterPlaces.insert(CBP,Register_Position(4,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CSP,"RSP"); mRegisterPlaces.insert(CSP,Register_Position(5,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R8,"R8"); mRegisterPlace.insert(R8 ,Register_Position(9,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R9,"R9"); mRegisterPlace.insert(R9 ,Register_Position(10,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R10,"R10"); mRegisterPlace.insert(R10,Register_Position(11,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R11,"R11"); mRegisterPlace.insert(R11,Register_Position(12,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R12,"R12"); mRegisterPlace.insert(R12,Register_Position(13,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R13,"R13"); mRegisterPlace.insert(R13,Register_Position(14,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R14,"R14"); mRegisterPlace.insert(R14,Register_Position(15,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(R15,"R15"); mRegisterPlace.insert(R15,Register_Position(16,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R8,"R8"); mRegisterPlaces.insert(R8 ,Register_Position(9,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R9,"R9"); mRegisterPlaces.insert(R9 ,Register_Position(10,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R10,"R10"); mRegisterPlaces.insert(R10,Register_Position(11,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R11,"R11"); mRegisterPlaces.insert(R11,Register_Position(12,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R12,"R12"); mRegisterPlaces.insert(R12,Register_Position(13,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R13,"R13"); mRegisterPlaces.insert(R13,Register_Position(14,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R14,"R14"); mRegisterPlaces.insert(R14,Register_Position(15,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(R15,"R15"); mRegisterPlaces.insert(R15,Register_Position(16,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(CIP,"RIP"); mRegisterPlace.insert(CIP,Register_Position(18,0, 6, sizeof(uint_t) * 2)); + mRegisterMapping.insert(CIP,"RIP"); mRegisterPlaces.insert(CIP,Register_Position(18,0, 6, sizeof(uint_t) * 2)); - mRegisterMapping.insert(EFLAGS,"RFLAGS"); mRegisterPlace.insert(EFLAGS,Register_Position(20,0, 9, sizeof(uint_t) * 2)); + mRegisterMapping.insert(EFLAGS,"RFLAGS"); mRegisterPlaces.insert(EFLAGS,Register_Position(20,0, 9, sizeof(uint_t) * 2)); offset = 21; #else @@ -113,13 +112,7 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) mRegisterMapping.insert(DR6,"DR6"); mRegisterPlaces.insert(DR6,Register_Position(offset+15,0, 4, sizeof(uint_t) * 2)); mRegisterMapping.insert(DR7,"DR7"); mRegisterPlaces.insert(DR7,Register_Position(offset+16,0, 4, sizeof(uint_t) * 2)); - - // Set background color - QPalette wPalette; - wPalette.setColor(QPalette::Window, QColor("#FFFBF0")); - this->setAutoFillBackground(true); - this->setPalette(wPalette); - + //set font QFont font("Monospace", 8); font.setFixedPitch(true); font.setStyleHint(QFont::Monospace); @@ -149,8 +142,6 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) connect(wCM_Modify,SIGNAL(triggered()),this,SLOT(onModifyAction())); connect(wCM_ToggleValue,SIGNAL(triggered()),this,SLOT(onToggleValueAction())); connect(wCM_CopyToClipboard,SIGNAL(triggered()),this,SLOT(onCopyToClipboardAction())); - - } RegistersView::~RegistersView() @@ -219,6 +210,7 @@ void RegistersView::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter wPainter(this->viewport()); + wPainter.fillRect(wPainter.viewport(), QBrush(ConfigColor("RegistersBackgroundColor"))); QMap::const_iterator it = mRegisterMapping.begin(); // iterate all registers @@ -278,12 +270,12 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),mRegisterMapping[reg]); p->save(); if(mRegisterUpdates.contains(reg)) - p->setPen(Qt::red); + p->setPen(ConfigColor("RegistersHighlightColor")); else - p->setPen(Qt::black); + p->setPen(ConfigColor("RegistersColor")); if(mSelected == reg){ - p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(QColor("#eee"))); + p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(ConfigColor("RegistersSelectionColor"))); } // draw value p->drawText(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); @@ -339,7 +331,7 @@ void RegistersView::updateRegistersSlot() void RegistersView::displayEditDialog() { WordEditDialog wEditDial(this); - QString wReg = registerValue(&wRegDumpStruct,mSelected); + //QString wReg = registerValue(&wRegDumpStruct,mSelected); #ifdef _WIN64 wEditDial.setup(QString("Edit"),registerValue(&wRegDumpStruct,mSelected), 8); diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp index 9d9aec82..e46f0103 100644 --- a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp @@ -428,6 +428,12 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend("Jump Lines (jump)", "SideBarJumpLineFalseColor", ""); colorInfoListAppend("Jump Lines (no jump)", "SideBarJumpLineTrueColor", ""); + colorInfoListAppend("Registers:", "", ""); + colorInfoListAppend("Background", "RegistersBackgroundColor", ""); + colorInfoListAppend("Text", "RegistersColor", ""); + colorInfoListAppend("Modified Registers", "RegistersModifiedColor"); + colorInfoListAppend("Selection", "RegistersSelectionColor"); + //setup context menu ui->listColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); defaultValueAction = new QAction("&Default Value", this); diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index 7505d8d1..ea7b2ba8 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -60,6 +60,11 @@ void Configuration::readColors() defaultColorMap.insert("SideBarBulletBreakpointColor", QColor("#FF0000")); defaultColorMap.insert("SideBarBulletBookmarkColor", QColor("#FEE970")); + defaultColorMap.insert("RegistersBackgroundColor", QColor("#FFFBF0")); + defaultColorMap.insert("RegistersColor", QColor("#000000")); + defaultColorMap.insert("RegistersModifiedColor", QColor("#FF0000")); + defaultColorMap.insert("RegistersSelectionColor", QColor("#EEEEEE")); + Colors = defaultColors = defaultColorMap; //read config for(int i=0; i Date: Wed, 11 Jun 2014 14:54:42 +0200 Subject: [PATCH 067/676] - add vertical scolling --- .../Project/Src/BasicView/RegistersView.cpp | 27 +++++++++++++++---- .../Project/Src/BasicView/RegistersView.h | 2 ++ .../Project/Src/Gui/AppearanceDialog.cpp | 4 +-- .../Project/Src/Gui/AppearanceDialog.h | 1 + 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index bea80625..a4076c0e 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -1,7 +1,7 @@ #include "RegistersView.h" #include "Configuration.h" -RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent) +RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mVScrollOffset(0) { @@ -255,6 +255,23 @@ void RegistersView::keyPressEvent(QKeyEvent *event) } } +void RegistersView::wheelEvent(QWheelEvent *event) +{ + int numDegrees = event->delta() / 8; + // one wheel click ==> 2 lines + int numSteps = numDegrees / 15 *1 ; + + if (event->orientation() == Qt::Vertical) { + if ( numSteps + mVScrollOffset <= 0) + mVScrollOffset = 0; + else + mVScrollOffset += numSteps; + + } + emit refresh(); + event->accept(); +} + QSize RegistersView::sizeHint() const { // 32 character width @@ -267,7 +284,7 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ // padding to the left is at least one character (looks better) int offset = mCharWidth*(1 + mRegisterPlaces[reg].start); // draw name of value - p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),mRegisterMapping[reg]); + p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1 +mVScrollOffset),mRegisterMapping[reg]); p->save(); if(mRegisterUpdates.contains(reg)) p->setPen(ConfigColor("RegistersHighlightColor")); @@ -275,10 +292,10 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ p->setPen(ConfigColor("RegistersColor")); if(mSelected == reg){ - p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(ConfigColor("RegistersSelectionColor"))); + p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line +mVScrollOffset)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(ConfigColor("RegistersSelectionColor"))); } // draw value - p->drawText(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); + p->drawText(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1+mVScrollOffset),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); // do we have a label ? char label_text[MAX_LABEL_SIZE]=""; @@ -310,7 +327,7 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ } // are there additional informations? if(hasLabel || hasModule || isASCII) - p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),newText); + p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1 +mVScrollOffset),newText); p->restore(); } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index 9dce2ea0..26a9d248 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -72,6 +72,7 @@ protected: virtual void mouseDoubleClickEvent(QMouseEvent* event); virtual void paintEvent(QPaintEvent* event); virtual void keyPressEvent(QKeyEvent *event); + virtual void wheelEvent(QWheelEvent *event); // use-in-class-only methods void drawRegister(QPainter *p, REGISTER_NAME reg, uint_t value); @@ -92,6 +93,7 @@ protected slots: private: + unsigned int mVScrollOffset; // holds current selected register REGISTER_NAME mSelected; // general purposes register id s (cax, ..., r8, ....) diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp index e46f0103..53f038d6 100644 --- a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp @@ -431,8 +431,8 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend("Registers:", "", ""); colorInfoListAppend("Background", "RegistersBackgroundColor", ""); colorInfoListAppend("Text", "RegistersColor", ""); - colorInfoListAppend("Modified Registers", "RegistersModifiedColor"); - colorInfoListAppend("Selection", "RegistersSelectionColor"); + colorInfoListAppend("Modified Registers", "RegistersModifiedColor",""); + colorInfoListAppend("Selection", "RegistersSelectionColor",""); //setup context menu ui->listColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h index 8742f31c..78ab6183 100644 --- a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.h @@ -3,6 +3,7 @@ #include #include +#include #include "Configuration.h" namespace Ui { From 8e8643cb245f24ebab769e7ac03b8667d7146963 Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Wed, 11 Jun 2014 14:58:02 +0200 Subject: [PATCH 068/676] bugfix: register selection using mouse click is working even when scrolling --- x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index a4076c0e..5b740515 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -163,7 +163,7 @@ bool RegistersView::identifyRegister(const int line, const int offset, REGISTER_ QMap::const_iterator it = mRegisterPlaces.begin(); // iterate all registers that being displayed while (it != mRegisterPlaces.end()) { - if( (it.value().line == line) /* same line ? */ + if( (it.value().line == (line - mVScrollOffset)) /* same line ? */ && ( (1 + it.value().start) <= offset) /* between start ... ? */ && ( offset<= (1+it.value().start+it.value().labelwidth+it.value().valuesize)) /* ... and end ? */ ){ From 3c57f5e36897330941fd7aaf6f16ba2006375a00 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 11 Jun 2014 15:36:37 +0200 Subject: [PATCH 069/676] GUI: added support for UNICODE characters to regview + added checks for IsDebugging + fixed alignment drawing issues + no characters for flags etc + fixed highlighting --- .../Project/Src/BasicView/RegistersView.cpp | 77 ++++++++++++++----- .../Project/Src/BasicView/RegistersView.h | 2 + .../Project/Src/Gui/AppearanceDialog.cpp | 4 +- 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 5b740515..0a1390a4 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -118,6 +118,7 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV font.setStyleHint(QFont::Monospace); QAbstractScrollArea::setFont(font); + int wRowsHeight = QFontMetrics(this->font()).height(); wRowsHeight = (wRowsHeight * 105) / 100; wRowsHeight = (wRowsHeight % 2) == 0 ? wRowsHeight : wRowsHeight + 1; @@ -180,8 +181,10 @@ bool RegistersView::identifyRegister(const int line, const int offset, REGISTER_ void RegistersView::mousePressEvent(QMouseEvent* event) { + if(!DbgIsDebugging()) + return; // get mouse position - const int y = event->y()/(double)mRowHeight; + const int y = (event->y()-3)/(double)mRowHeight; const int x = event->x()/(double)mCharWidth; REGISTER_NAME r; @@ -198,6 +201,8 @@ void RegistersView::mousePressEvent(QMouseEvent* event) void RegistersView::mouseDoubleClickEvent(QMouseEvent* event) { Q_UNUSED(event); + if(!DbgIsDebugging()) + return; // is current register general purposes register ? if(mGPR.contains(mSelected)){ wCM_Modify->trigger(); @@ -224,6 +229,8 @@ void RegistersView::paintEvent(QPaintEvent *event) void RegistersView::keyPressEvent(QKeyEvent *event) { + if(!DbgIsDebugging()) + return; if(event->matches(QKeySequence::Copy)){ wCM_CopyToClipboard->trigger(); return; @@ -282,35 +289,57 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ // is the register-id known? if(mRegisterMapping.contains(reg)){ // padding to the left is at least one character (looks better) - int offset = mCharWidth*(1 + mRegisterPlaces[reg].start); - // draw name of value - p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1 +mVScrollOffset),mRegisterMapping[reg]); + int x = mCharWidth*(1 + mRegisterPlaces[reg].start); + int y = mRowHeight*(mRegisterPlaces[reg].line) + 3; + + //draw raster + /* p->save(); - if(mRegisterUpdates.contains(reg)) - p->setPen(ConfigColor("RegistersHighlightColor")); + p->setPen(QColor("#FF0000")); + p->drawLine(0, y, this->viewport()->width(), y); + p->restore(); + */ + + // draw name of value + int width=mCharWidth*mRegisterMapping[reg].length(); + p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, mRegisterMapping[reg]); + x += (mRegisterPlaces[reg].labelwidth) * mCharWidth; + //p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),mRegisterMapping[reg]); + + //set highlighting + p->save(); + if(DbgIsDebugging() && mRegisterUpdates.contains(reg)) + p->setPen(ConfigColor("RegistersModifiedColor")); else p->setPen(ConfigColor("RegistersColor")); + //selection if(mSelected == reg){ - p->fillRect(QRect(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line +mVScrollOffset)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(ConfigColor("RegistersSelectionColor"))); + p->fillRect(x, y, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight, QBrush(ConfigColor("RegistersSelectionColor"))); + //p->fillRect(QRect(x + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line)+2, mRegisterPlaces[reg].valuesize*mCharWidth, mRowHeight), QBrush(ConfigColor("RegistersSelectionColor"))); } - // draw value - p->drawText(offset + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1+mVScrollOffset),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); + // draw value + QString valueText = QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper(); + + width = mCharWidth * valueText.length(); + p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, valueText); + //p->drawText(x + (mRegisterPlaces[reg].labelwidth)*mCharWidth ,mRowHeight*(mRegisterPlaces[reg].line+1),QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper()); + p->restore(); //do not highlight the labels // do we have a label ? char label_text[MAX_LABEL_SIZE]=""; char module_text[MAX_MODULE_SIZE]=""; bool hasLabel=DbgGetLabelAt(value, SEG_DEFAULT, label_text); bool hasModule=DbgGetModuleAt(value, module_text); - bool isASCII=false; + bool isCharacter=false; - offset += mRegisterPlaces[reg].labelwidth*mCharWidth + QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper().length()*mCharWidth; - offset += 5*mCharWidth; + x += valueText.length() * mCharWidth; + x += 5 * mCharWidth; //5 spaces QString newText = ""; if(hasLabel && hasModule){ newText="<"+QString(module_text)+"."+QString(label_text)+">"; }else if(hasModule){ - newText=QString(module_text)+"."+QString("%1").arg(value, mRegisterPlaces[reg].valuesize, 16, QChar('0')).toUpper(); + newText=QString(module_text)+"."+valueText; }else if(hasLabel ){ newText="<"+QString(label_text)+">"; }else{ @@ -320,16 +349,26 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ QChar c = QChar((char)value); if(c.isPrint()){ newText=QString("'%1'").arg((char)value); - isASCII=true; + isCharacter=IsCharacterRegister(reg); + } + } + else if(value == (value & 0xFFF)) //UNICODE? + { + QChar c = QChar((wchar_t)value); + if(c.isPrint()){ + newText="L'"+QString(c)+"'"; + isCharacter=IsCharacterRegister(reg); } } } } // are there additional informations? - if(hasLabel || hasModule || isASCII) - p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1 +mVScrollOffset),newText); - - p->restore(); + if(hasLabel || hasModule || isCharacter) + { + width = newText.length() * mCharWidth; + p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText); + //p->drawText(x,mRowHeight*(mRegisterPlaces[reg].line+1),newText); + } } } @@ -410,6 +449,8 @@ void RegistersView::onCopyToClipboardAction() void RegistersView::displayCustomContextMenuSlot(QPoint pos) { + if(!DbgIsDebugging()) + return; QMenu wMenu(this); if(mSelected != UNKNOWN) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index 26a9d248..ab5abcac 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -10,6 +10,8 @@ #include "LineEditDialog.h" #include +#define IsCharacterRegister(x) ((x>=CAX && xlistColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); From 7fc0c9a31f8e94f334ee6b70e7b382d107fb269b Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 11 Jun 2014 16:04:56 +0200 Subject: [PATCH 070/676] GUI: added jump arrows when jump leaves the screen --- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 88 +++++++++++++++++++--- 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index d4882787..6ccf7865 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -167,7 +167,7 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo painter->setPen(tmp); const int JumpPadding = 11; - const int x = viewport()->width() - jumpoffset*JumpPadding - 12; + int x = viewport()->width() - jumpoffset*JumpPadding - 12; int x_right = viewport()->width() - 12; const int y_start = fontHeight*(1+startLine)-0.5*fontHeight; const int y_end = fontHeight*(1+endLine)-0.5*fontHeight; @@ -182,19 +182,85 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo //horizontal painter->drawLine(x, y_end, x_right, y_end); - QPen temp=painter->pen(); - temp.setStyle(Qt::SolidLine); - painter->setPen(temp); - QPoint wPoints[] = + if(endLine == viewableRows+6) { - QPoint(x_right - 3, y_end - 3), - QPoint(x_right, y_end), - QPoint(x_right - 3, y_end + 3), - }; - painter->drawPolyline(wPoints, 3); + int y = this->viewport()->height()-1; + if(y>y_start) + { + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x - 3, y - 3), + QPoint(x, y), + QPoint(x + 3, y - 3), + }; + painter->drawPolyline(wPoints, 3); + } + } + else if(endLine == -6) + { + int y = 0; + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x - 3, y + 3), + QPoint(x, y), + QPoint(x + 3, y + 3), + }; + painter->drawPolyline(wPoints, 3); + } + else + { + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x_right - 3, y_end - 3), + QPoint(x_right, y_end), + QPoint(x_right - 3, y_end + 3), + }; + painter->drawPolyline(wPoints, 3); + } } else - drawStraightArrow(painter, x, y_end, x_right, y_end); + { + if(endLine == viewableRows+6) + { + int y = this->viewport()->height()-1; + x--; + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x - 3, y - 3), + QPoint(x, y), + QPoint(x + 3, y - 3), + }; + painter->drawPolyline(wPoints, 3); + } + else if(endLine == -6) + { + int y = 0; + QPen temp=painter->pen(); + temp.setStyle(Qt::SolidLine); + painter->setPen(temp); + QPoint wPoints[] = + { + QPoint(x - 3, y + 3), + QPoint(x, y), + QPoint(x + 3, y + 3), + }; + painter->drawPolyline(wPoints, 3); + } + else + drawStraightArrow(painter, x, y_end, x_right, y_end); + } painter->restore(); } From 21bcc2e19bca52591c18c72767f6d38f6ae0a7ae Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Wed, 11 Jun 2014 17:37:55 +0200 Subject: [PATCH 071/676] additional colors added for various elements scrolling in RegistersView is now enabled better access to ApiFingerprints --- .../Project/Src/BasicView/RegistersView.cpp | 4 ++- .../Project/Src/Gui/AppearanceDialog.cpp | 10 ++++-- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 35 ++++++++++++++++--- x64_dbg_gui/Project/Src/Gui/CPUSideBar.h | 2 ++ x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 12 +++++-- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 1 - .../Project/Src/Utils/ApiFingerprints.cpp | 9 +++++ .../Project/Src/Utils/ApiFingerprints.h | 2 ++ 8 files changed, 64 insertions(+), 11 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 0a1390a4..6c761e3a 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -290,7 +290,7 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ if(mRegisterMapping.contains(reg)){ // padding to the left is at least one character (looks better) int x = mCharWidth*(1 + mRegisterPlaces[reg].start); - int y = mRowHeight*(mRegisterPlaces[reg].line) + 3; + int y = mRowHeight*(mRegisterPlaces[reg].line + mVScrollOffset) + 3; //draw raster /* @@ -302,6 +302,7 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ // draw name of value int width=mCharWidth*mRegisterMapping[reg].length(); + p->setPen(ConfigColor("RegistersLabelColor")); p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, mRegisterMapping[reg]); x += (mRegisterPlaces[reg].labelwidth) * mCharWidth; //p->drawText(offset,mRowHeight*(mRegisterPlaces[reg].line+1),mRegisterMapping[reg]); @@ -366,6 +367,7 @@ void RegistersView::drawRegister(QPainter *p,REGISTER_NAME reg, uint_t value){ if(hasLabel || hasModule || isCharacter) { width = newText.length() * mCharWidth; + p->setPen(ConfigColor("RegistersExtraInfoColor")); p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText); //p->drawText(x,mRowHeight*(mRegisterPlaces[reg].line+1),newText); } diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp index 81d65847..86c050c3 100644 --- a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp @@ -425,14 +425,20 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend("Bullets", "SideBarBulletColor", ""); colorInfoListAppend("Breakpoints", "SideBarBulletBreakpointColor", ""); colorInfoListAppend("Bookmarks", "SideBarBulletBookmarkColor", ""); - colorInfoListAppend("Jump Lines (jump)", "SideBarJumpLineFalseColor", ""); - colorInfoListAppend("Jump Lines (no jump)", "SideBarJumpLineTrueColor", ""); + colorInfoListAppend("Jump Lines (conditional jump)", "SideBarConditionalJumpLineColor", ""); + colorInfoListAppend("Jump Lines (unconditional jump)", "SideBarUnconditionalJumpLineColor", ""); + colorInfoListAppend("Jump Lines (selected jump)", "SideBarJumpLineSelectionColor", ""); + colorInfoListAppend("Background", "SideBarBackgroundColor", ""); colorInfoListAppend("Registers:", "", ""); colorInfoListAppend("Background", "RegistersBackgroundColor", ""); colorInfoListAppend("Text", "RegistersColor", ""); colorInfoListAppend("Modified Registers", "RegistersModifiedColor", ""); colorInfoListAppend("Selection", "RegistersSelectionColor", ""); + colorInfoListAppend("Name of Labels", "RegistersLabelColor", ""); + colorInfoListAppend("Extra Info", "RegistersExtraInfoColor", ""); + + //setup context menu ui->listColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index 6ccf7865..f75dbd25 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -81,7 +81,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) QPainter painter(this->viewport()); // Paints background - painter.fillRect(painter.viewport(), QBrush(backgroundColor)); + painter.fillRect(painter.viewport(), ConfigColor("SideBarBackgroundColor")); if(InstrBuffer->size() == 0) return; @@ -146,6 +146,29 @@ void CPUSideBar::paintEvent(QPaintEvent *event) #else //x86 drawLabel(&painter, line, "EIP"); #endif + + // read registers + REGDUMP z; + memset(&z, 0, sizeof(REGDUMP)); + DbgGetRegDump(&z); + +#ifdef _WIN64 + if(InstrBuffer->at(line).rva == z.cax) drawLabel(&painter, line, "RAX"); + if(InstrBuffer->at(line).rva == z.cbx) drawLabel(&painter, line, "RBX"); + if(InstrBuffer->at(line).rva == z.ccx) drawLabel(&painter, line, "RCX"); + if(InstrBuffer->at(line).rva == z.cdx) drawLabel(&painter, line, "RDX"); + if(InstrBuffer->at(line).rva == z.csi) drawLabel(&painter, line, "RSI"); + if(InstrBuffer->at(line).rva == z.cdi) drawLabel(&painter, line, "RDI"); +#else //x86 + if(InstrBuffer->at(line).rva == z.cax) drawLabel(&painter, line, "EAX"); + if(InstrBuffer->at(line).rva == z.cbx) drawLabel(&painter, line, "EBX"); + if(InstrBuffer->at(line).rva == z.ccx) drawLabel(&painter, line, "ECX"); + if(InstrBuffer->at(line).rva == z.cdx) drawLabel(&painter, line, "EDX"); + if(InstrBuffer->at(line).rva == z.csi) drawLabel(&painter, line, "ESI"); + if(InstrBuffer->at(line).rva == z.cdi) drawLabel(&painter, line, "EDI"); +#endif + + } } @@ -153,15 +176,15 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo { painter->save(); if(!conditional) - painter->setPen(QPen(ConfigColor("SideBarJumpLineFalseColor"), 1, Qt::SolidLine)); // jmp + painter->setPen(QPen(ConfigColor("SideBarConditionalJumpLineColor"), 1, Qt::SolidLine)); // jmp else - painter->setPen(QPen(ConfigColor("SideBarJumpLineFalseColor"), 1, Qt::DashLine)); + painter->setPen(QPen(ConfigColor("SideBarUnconditionalJumpLineColor"), 1, Qt::DashLine)); QPen tmp = painter->pen(); if(isactive) //selected { if(isexecute) //only highlight selected jumps - tmp.setColor(ConfigColor("SideBarJumpLineTrueColor")); + tmp.setColor(ConfigColor("SideBarJumpLineSelectionColor")); tmp.setWidth(2); } painter->setPen(tmp); @@ -275,6 +298,8 @@ void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbook else painter->setBrush(QBrush(ConfigColor("SideBarBulletColor"))); + painter->setPen(ConfigColor("SideBarBackgroundColor")); + const int radius = fontHeight/2; //14/2=7 const int y = line*fontHeight; //initial y const int yAdd = (fontHeight-radius)/2+1; @@ -283,7 +308,7 @@ void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbook //painter->drawLine(0, y, viewport()->width(), y); //draw raster painter->setRenderHint(QPainter::Antialiasing, true); - painter->setPen(QPen("#FFFFFF")); + //painter->setPen(QPen("#FFFFFF")); painter->drawEllipse(x, y+yAdd, radius, radius); painter->restore(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index 314ba652..7059ca27 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -6,9 +6,11 @@ #include "CPUDisassembly.h" #include + class CPUSideBar : public QAbstractScrollArea { Q_OBJECT + QPair mHighlightedJump; public: explicit CPUSideBar(CPUDisassembly *Ptr, QWidget *parent = 0); QSize sizeHint() const; diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index ea7b2ba8..ae59ed2b 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -54,16 +54,24 @@ void Configuration::readColors() defaultColorMap.insert("SideBarCipLabelColor", QColor("#FFFFFF")); defaultColorMap.insert("SideBarCipLabelBackgroundColor", QColor("#4040FF")); defaultColorMap.insert("SideBarBackgroundColor", QColor("#FFFBF0")); - defaultColorMap.insert("SideBarJumpLineTrueColor", QColor("#FF0000")); - defaultColorMap.insert("SideBarJumpLineFalseColor", QColor("#808080")); + defaultColorMap.insert("SideBarJumpLineSelectionColor", QColor("#FF0000")); + defaultColorMap.insert("SideBarUnconditionalJumpLineColor", QColor("#808080")); + defaultColorMap.insert("SideBarConditionalJumpLineColor", QColor("#808080")); defaultColorMap.insert("SideBarBulletColor", QColor("#808080")); defaultColorMap.insert("SideBarBulletBreakpointColor", QColor("#FF0000")); + // TODO: defaultColorMap.insert("SideBarBulletBreakpointDisabledColor", QColor("#0F610F")); defaultColorMap.insert("SideBarBulletBookmarkColor", QColor("#FEE970")); defaultColorMap.insert("RegistersBackgroundColor", QColor("#FFFBF0")); defaultColorMap.insert("RegistersColor", QColor("#000000")); defaultColorMap.insert("RegistersModifiedColor", QColor("#FF0000")); defaultColorMap.insert("RegistersSelectionColor", QColor("#EEEEEE")); + defaultColorMap.insert("RegistersLabelColor", QColor("#000000")); + defaultColorMap.insert("RegistersExtraInfoColor", QColor("#000000")); + + + + Colors = defaultColors = defaultColorMap; //read config diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index e34f7a8b..b9b535f9 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -23,7 +23,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // load config file mConfiguration = new Configuration; - mAPIFingerprints = new ApiFingerprints; //Load recent files diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp index b53a5f05..2f96d5d7 100644 --- a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.cpp @@ -2,6 +2,14 @@ #include "Configuration.h" +ApiFingerprints* ApiFingerprints::mPtr = NULL; + + +ApiFingerprints *ApiFingerprints::instance() +{ + return mPtr; +} + /** * @brief retrieves information (name, arguments) for given api function from database @@ -37,6 +45,7 @@ const APIFunction ApiFingerprints::function(QString dllname,QString functionname ApiFingerprints::ApiFingerprints() { + mPtr = this; // the config file should contain a list of possible data files for api calls QList files = Configuration::instance()->ApiFingerprints(); diff --git a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h index f4b1eb34..3db12c0a 100644 --- a/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h +++ b/x64_dbg_gui/Project/Src/Utils/ApiFingerprints.h @@ -21,10 +21,12 @@ struct APIFunction class ApiFingerprints { + static ApiFingerprints* mPtr; QMap> Library; public: ApiFingerprints(); const APIFunction function(QString dllname, QString functionname) const; + static ApiFingerprints *instance(); }; #endif // APIFINGERPRINTS_H From b26bb724b83f8f6b6abae8d173f149a532ec3ec8 Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Wed, 11 Jun 2014 18:14:47 +0200 Subject: [PATCH 072/676] new features: - register --> follow in Dump - label "eax", ... will be displayed in CPUSideBar bugfixes: - RegistersView now accept the RETURN key instead of ENTER key for modifying values --- .../Project/Src/BasicView/RegistersView.cpp | 38 ++++++++++++++++++- .../Project/Src/BasicView/RegistersView.h | 4 ++ x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 27 ++++++------- 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 6c761e3a..99586038 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -15,11 +15,14 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV wCM_SetToOne = new QAction(tr("Set to 1"),this); wCM_SetToOne->setShortcut(Qt::Key_1); wCM_Modify = new QAction(tr("Modify Value"),this); - wCM_Modify->setShortcut(Qt::Key_Enter); + wCM_Modify->setShortcut(Qt::Key_Return); wCM_ToggleValue = new QAction(tr("Toggle"),this); wCM_ToggleValue->setShortcut(Qt::Key_Space); wCM_CopyToClipboard = new QAction(tr("Copy Value to Clipboard"),this); wCM_CopyToClipboard->setShortcut(QKeySequence::Copy); + wCM_FollowInDisassembly = new QAction(tr("Follow in Diassembly"),this); + wCM_FollowInDump = new QAction(tr("Follow in Dump"),this); + @@ -143,6 +146,8 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV connect(wCM_Modify,SIGNAL(triggered()),this,SLOT(onModifyAction())); connect(wCM_ToggleValue,SIGNAL(triggered()),this,SLOT(onToggleValueAction())); connect(wCM_CopyToClipboard,SIGNAL(triggered()),this,SLOT(onCopyToClipboardAction())); + connect(wCM_FollowInDisassembly,SIGNAL(triggered()),this,SLOT(onFollowInDisassembly())); + connect(wCM_FollowInDump,SIGNAL(triggered()),this,SLOT(onFollowInDump())); } RegistersView::~RegistersView() @@ -253,7 +258,7 @@ void RegistersView::keyPressEvent(QKeyEvent *event) case Qt::Key_Space: wCM_ToggleValue->trigger(); break; - case Qt::Key_Enter: + case Qt::Key_Return: wCM_Modify->trigger(); break; @@ -449,6 +454,26 @@ void RegistersView::onCopyToClipboardAction() clipboard->setText(QString("%1").arg(registerValue(&wRegDumpStruct,mSelected), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper()); } +void RegistersView::onFollowInDisassembly() +{ + + if(mGPR.contains(mSelected)){ + QString addr = QString("%1").arg(registerValue(&wRegDumpStruct,mSelected), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr(registerValue(&wRegDumpStruct,mSelected))) + DbgCmdExec(QString().sprintf("disasm \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } +} + +void RegistersView::onFollowInDump() +{ + if(mGPR.contains(mSelected)){ + QString addr = QString("%1").arg(registerValue(&wRegDumpStruct,mSelected), mRegisterPlaces[mSelected].valuesize, 16, QChar('0')).toUpper(); + if(DbgMemIsValidReadPtr(registerValue(&wRegDumpStruct,mSelected))) + DbgCmdExec(QString().sprintf("dump \"%s\"", addr.toUtf8().constData()).toUtf8().constData()); + } + +} + void RegistersView::displayCustomContextMenuSlot(QPoint pos) { if(!DbgIsDebugging()) @@ -469,7 +494,16 @@ void RegistersView::displayCustomContextMenuSlot(QPoint pos) wMenu.addAction(wCM_Increment); wMenu.addAction(wCM_Decrement); + int_t addr = registerValue(&wRegDumpStruct,mSelected); + if(DbgMemIsValidReadPtr(addr)){ + wMenu.addAction(wCM_FollowInDump); + //wMenu.addAction(wCM_FollowInDisassembly); + } + + } + + wMenu.addAction(wCM_CopyToClipboard); wMenu.exec(this->mapToGlobal(pos)); } diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index ab5abcac..ad65a1a0 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -92,6 +92,8 @@ protected slots: void onModifyAction(); void onToggleValueAction(); void onCopyToClipboardAction(); + void onFollowInDisassembly(); + void onFollowInDump(); private: @@ -120,6 +122,8 @@ private: QAction* wCM_Modify; QAction* wCM_ToggleValue; QAction* wCM_CopyToClipboard; + QAction* wCM_FollowInDisassembly; + QAction* wCM_FollowInDump; }; #endif // REGISTERSVIEW_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index f75dbd25..0bd6364e 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -147,25 +147,26 @@ void CPUSideBar::paintEvent(QPaintEvent *event) drawLabel(&painter, line, "EIP"); #endif - // read registers + // read registers and add register labels REGDUMP z; memset(&z, 0, sizeof(REGDUMP)); DbgGetRegDump(&z); + const int_t cur_VA = CodePtr->getBase() + InstrBuffer->at(line).rva; #ifdef _WIN64 - if(InstrBuffer->at(line).rva == z.cax) drawLabel(&painter, line, "RAX"); - if(InstrBuffer->at(line).rva == z.cbx) drawLabel(&painter, line, "RBX"); - if(InstrBuffer->at(line).rva == z.ccx) drawLabel(&painter, line, "RCX"); - if(InstrBuffer->at(line).rva == z.cdx) drawLabel(&painter, line, "RDX"); - if(InstrBuffer->at(line).rva == z.csi) drawLabel(&painter, line, "RSI"); - if(InstrBuffer->at(line).rva == z.cdi) drawLabel(&painter, line, "RDI"); + if(cur_VA == z.cax) drawLabel(&painter, line, "RAX"); + if(cur_VA == z.cbx) drawLabel(&painter, line, "RBX"); + if(cur_VA == z.ccx) drawLabel(&painter, line, "RCX"); + if(cur_VA == z.cdx) drawLabel(&painter, line, "RDX"); + if(cur_VA == z.csi) drawLabel(&painter, line, "RSI"); + if(cur_VA == z.cdi) drawLabel(&painter, line, "RDI"); #else //x86 - if(InstrBuffer->at(line).rva == z.cax) drawLabel(&painter, line, "EAX"); - if(InstrBuffer->at(line).rva == z.cbx) drawLabel(&painter, line, "EBX"); - if(InstrBuffer->at(line).rva == z.ccx) drawLabel(&painter, line, "ECX"); - if(InstrBuffer->at(line).rva == z.cdx) drawLabel(&painter, line, "EDX"); - if(InstrBuffer->at(line).rva == z.csi) drawLabel(&painter, line, "ESI"); - if(InstrBuffer->at(line).rva == z.cdi) drawLabel(&painter, line, "EDI"); + if(cur_VA == z.cax) drawLabel(&painter, line, "EAX"); + if(cur_VA == z.cbx) drawLabel(&painter, line, "EBX"); + if(cur_VA == z.ccx) drawLabel(&painter, line, "ECX"); + if(cur_VA == z.cdx) drawLabel(&painter, line, "EDX"); + if(cur_VA == z.csi) drawLabel(&painter, line, "ESI"); + if(cur_VA == z.cdi) drawLabel(&painter, line, "EDI"); #endif From d2c7fcd4903b7632f0143f6f87d9fbd1a8ea0aba Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:40:44 +0200 Subject: [PATCH 073/676] DBG: fixed a bug with detaching while paused sometimes --- x64_dbg_dbg/debugger.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index e9e90d30..829505d1 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -867,6 +867,7 @@ static void cbException(EXCEPTION_DEBUG_INFO* ExceptionData) dputs("DetachDebuggerEx failed..."); else dputs("detached!"); + isDetachedByUser=false; return; } else if(isPausedByUser) @@ -2005,10 +2006,25 @@ CMDRESULT cbDebugAttach(int argc, char* argv[]) return STATUS_CONTINUE; } +static void cbDetach() +{ + if(!isDetachedByUser) + return; + PLUG_CB_DETACH detachInfo; + detachInfo.fdProcessInfo=fdProcessInfo; + plugincbcall(CB_DETACH, &detachInfo); + if(!DetachDebuggerEx(fdProcessInfo->dwProcessId)) + dputs("DetachDebuggerEx failed..."); + else + dputs("detached!"); + return; +} + CMDRESULT cbDebugDetach(int argc, char* argv[]) { unlock(WAITID_RUN); //run isDetachedByUser=true; //detach when paused + StepInto((void*)cbDetach); DebugBreakProcess(fdProcessInfo->hProcess); return STATUS_CONTINUE; } From 5ee06be0145c8e687baf1e2ec91d8c9ad99115dd Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:41:13 +0200 Subject: [PATCH 074/676] GUI: fixed a crash with the CPU SideBar --- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 4 +++- x64_dbg_gui/Project/Src/Gui/CPUSideBar.h | 2 +- x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index 6ccf7865..e55d28a2 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -40,7 +40,7 @@ void CPUSideBar::repaint() viewport()->repaint(); } -void CPUSideBar::changeTopmostAddress(int i) +void CPUSideBar::changeTopmostAddress(int_t i) { if(i!=topVA) { @@ -93,6 +93,8 @@ void CPUSideBar::paintEvent(QPaintEvent *event) for(int line=0; line=InstrBuffer->size()) //at the end of the page it will crash otherwise + break; Instruction_t instr = InstrBuffer->at(line); int_t instrVA = instr.rva + CodePtr->getBase(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index 314ba652..5797f19c 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -17,7 +17,7 @@ public: public slots: void debugStateChangedSlot(DBGSTATE state); void repaint(); - void changeTopmostAddress(int i); + void changeTopmostAddress(int_t i); void setViewableRows(int rows); void setSelection(int_t selVA); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp index 6f5802f1..d60a8833 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUWidget.cpp @@ -8,7 +8,7 @@ CPUWidget::CPUWidget(QWidget *parent) :QWidget(parent), ui(new Ui::CPUWidget) mDisas = new CPUDisassembly(0); mSideBar = new CPUSideBar(mDisas); - connect(mDisas,SIGNAL(tableOffsetChanged(int)),mSideBar,SLOT(changeTopmostAddress(int))); + connect(mDisas,SIGNAL(tableOffsetChanged(int_t)),mSideBar,SLOT(changeTopmostAddress(int_t))); connect(mDisas,SIGNAL(viewableRows(int)),mSideBar,SLOT(setViewableRows(int))); connect(mDisas,SIGNAL(repainted()),mSideBar,SLOT(repaint())); connect(mDisas,SIGNAL(selectionChanged(int_t)),mSideBar,SLOT(setSelection(int_t))); From 68e57ce49fb5d76b92d3c63161880997ac512a06 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:41:31 +0200 Subject: [PATCH 075/676] GUI: fixed a bug with the previous commit --- x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h index eeeed8f6..62eafbf1 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.h @@ -77,7 +77,7 @@ public: signals: void headerButtonPressed(int col); void headerButtonReleased(int col); - void tableOffsetChanged(int i); + void tableOffsetChanged(int_t i); void viewableRows(int rows); void repainted(); From d975c1fe1ffca28aa4e5a28dd8b2b73550796b59 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:41:48 +0200 Subject: [PATCH 076/676] GUI: added BeaTokenizer class --- x64_dbg_gui/Project/DebuggerX64.pro | 6 +- .../Project/Src/Disassembler/BeaTokenizer.cpp | 256 ++++++++++++++++++ .../Project/Src/Disassembler/BeaTokenizer.h | 86 ++++++ .../Project/Src/Disassembler/QBeaEngine.h | 1 - 4 files changed, 346 insertions(+), 3 deletions(-) create mode 100644 x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp create mode 100644 x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index 6a816563..c4dc6105 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -68,7 +68,8 @@ SOURCES += \ Src/Gui/Configuration.cpp \ Src/Utils/ApiFingerprints.cpp \ Src/Gui/CPUSideBar.cpp \ - Src/Gui/AppearanceDialog.cpp + Src/Gui/AppearanceDialog.cpp \ + Src/Disassembler/BeaTokenizer.cpp HEADERS += \ @@ -117,7 +118,8 @@ HEADERS += \ Src/Gui/Configuration.h \ Src/Utils/ApiFingerprints.h \ Src/Gui/CPUSideBar.h \ - Src/Gui/AppearanceDialog.h + Src/Gui/AppearanceDialog.h \ + Src/Disassembler/BeaTokenizer.h INCLUDEPATH += \ diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp new file mode 100644 index 00000000..7426ba16 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp @@ -0,0 +1,256 @@ +#include "BeaTokenizer.h" + +BeaTokenizer::BeaTokenizer() +{ +} + +//djb2 (http://www.cse.yorku.ca/~oz/hash.html) +unsigned long BeaTokenizer::BeaHashInstruction(const DISASM* disasm) +{ + const char* str=disasm->CompleteInstr; + unsigned long hash=5381; + int c; + while(c=*str++) + hash=((hash<<5)+hash)+c; /*hash*33+c*/ + return hash; +} + +void BeaTokenizer::AddToken(BeaInstructionToken* instr, const BeaTokenType type, const QString text, const BeaTokenValue* value) +{ + BeaSingleToken token; + token.type=type; + if(type!=TokenRequiredSpace && type!=TokenOptionalSpace && type!=TokenMemorySpace) + token.text=text.trimmed(); //remove whitespaces from the start and end + else + token.text=text; + if(value) + token.value=*value; + else + { + token.value.size=0; + token.value.value=0; + } + instr->tokens.push_back(token); +} + +void BeaTokenizer::Prefix(BeaInstructionToken* instr, const DISASM* disasm) +{ + if(disasm->Prefix.LockPrefix) + { + AddToken(instr, TokenPrefix, "lock", 0); + AddToken(instr, TokenRequiredSpace, " ", 0); + } + if(disasm->Prefix.RepPrefix) + { + AddToken(instr, TokenPrefix, "rep", 0); + AddToken(instr, TokenRequiredSpace, " ", 0); + } + if(disasm->Prefix.RepnePrefix) + { + AddToken(instr, TokenPrefix, "repne", 0); + AddToken(instr, TokenRequiredSpace, " ", 0); + } +} + +bool BeaTokenizer::IsNopInstruction(QString mnemonic, const DISASM* disasm) +{ + Q_UNUSED(disasm); + //TODO: add instructions like "mov eax,eax" and "xchg ebx,ebx" and "lea eax,[eax]" + if(mnemonic=="nop") + return true; + return false; +} + +void BeaTokenizer::Mnemonic(BeaInstructionToken* instr, const DISASM* disasm) +{ + QString mnemonic=QString(disasm->Instruction.Mnemonic).trimmed().toLower(); + BeaTokenType type=TokenMnemonicNormal; + int brtype=disasm->Instruction.BranchType; + if(brtype) //jump/call + { + if(brtype==RetType || brtype==CallType) + type=TokenMnemonicCallRet; + else if(brtype==JmpType) + type=TokenMnemonicUncondJump; + else //cond jump + type=TokenMnemonicCondJump; + } + else if(mnemonic=="push" || mnemonic=="pop") + type=TokenMnemonicPushPop; + else if(IsNopInstruction(mnemonic, disasm)) //nop instructions + type=TokenMnemonicNop; + AddToken(instr, type, mnemonic, 0); + AddToken(instr, TokenRequiredSpace, " ", 0); +} + +QString BeaTokenizer::PrintValue(const BeaTokenValue* value) +{ + return QString("%1").arg(value->value, 0, 16, QChar('0')); +} + +QString BeaTokenizer::RegisterToString(int size, int reg) +{ + ARGUMENTS_TYPE regValue=(ARGUMENTS_TYPE)(reg&0xFFFF); + QMap registerValueMap; + registerValueMap.insert(REG0, 0); + registerValueMap.insert(REG1, 1); + registerValueMap.insert(REG2, 2); + registerValueMap.insert(REG3, 3); + registerValueMap.insert(REG4, 4); + registerValueMap.insert(REG5, 5); + registerValueMap.insert(REG6, 6); + registerValueMap.insert(REG7, 7); + registerValueMap.insert(REG8, 8); + registerValueMap.insert(REG9, 9); + registerValueMap.insert(REG10, 10); + registerValueMap.insert(REG11, 11); + registerValueMap.insert(REG12, 12); + registerValueMap.insert(REG13, 13); + registerValueMap.insert(REG14, 14); + registerValueMap.insert(REG15, 15); + if(!registerValueMap.contains(regValue)) //not a register + return "UNKNOWN_REGISTER"; + QMap registerMap; +#ifdef _WIN64 + const char Registers8Bits64[16][8] = {"al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"}; + registerMap.insert(8, (const char**)Registers8Bits64); + const char Registers64Bits[16][4] = {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}; + registerMap.insert(64, (const char**)Registers64Bits); +#else //x86 + const char Registers8Bits32[8][4] = {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"}; + registerMap.insert(8, (const char**)Registers8Bits32); +#endif //_WIN64 + const char Registers16Bits[16][8] = {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"}; + registerMap.insert(16, (const char**)Registers16Bits); + const char Registers32Bits[16][8] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"}; + registerMap.insert(32, (const char**)Registers32Bits); + if(!registerMap.contains(size)) //invalid size + return "UNKNOWN_REGISTER"; + return registerMap[size][regValue]; +} + +void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, const ARGTYPE* arg, bool* hadarg) +{ + if(arg->ArgType==NO_ARGUMENT || !arg->ArgMnemonic[0]) //empty/implicit argument + return; + + if(*hadarg) //there already was an argument before this one + { + AddToken(instr, TokenComma, ",", 0); + AddToken(instr, TokenOptionalSpace, " ", 0); + } + + //print argument + QString argMnemonic=QString(arg->ArgMnemonic).toLower().trimmed(); + if(disasm->Instruction.BranchType != 0) //jump/call + { + BeaTokenValue value; + value.size=arg->ArgSize/16; + value.value=disasm->Instruction.AddrValue; + AddToken(instr, TokenCodeDest, PrintValue(&value), &value); + } + else if((arg->ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) //immediat + { + BeaTokenValue value; + value.size=arg->ArgSize/16; + value.value=disasm->Instruction.Immediat; + AddToken(instr, TokenImmediat, PrintValue(&value), &value); + } + else if((arg->ArgType&MEMORY_TYPE)==MEMORY_TYPE) //memory argument + { + //initialization + QStringList segmentNames; + segmentNames<<""<<"es"<<"ds"<<"fs"<<"gs"<<"cs"<<"ss"; + QMap memSizeNames; //lookup table for memory sizes + memSizeNames.insert(8, "byte"); + memSizeNames.insert(16, "word"); + memSizeNames.insert(32, "dword"); + memSizeNames.insert(64, "qword"); + memSizeNames.insert(80, "tword"); + memSizeNames.insert(128, "dqword"); + memSizeNames.insert(256, "yword"); + memSizeNames.insert(512, "zword"); + //#size ptr #segment:[#BaseRegister + #IndexRegister*#Scale +/- #Displacement] + AddToken(instr, TokenMemorySize, memSizeNames.find(arg->ArgSize).value(), 0); + AddToken(instr, TokenRequiredSpace, " ", 0); + AddToken(instr, TokenMemoryText, "ptr", 0); + AddToken(instr, TokenRequiredSpace, " ", 0); + AddToken(instr, TokenMemorySegment, segmentNames.at(arg->SegmentReg), 0); + AddToken(instr, TokenMemoryBrackets, ":[", 0); + + bool prependPlusMinus=false; + if(arg->Memory.BaseRegister) //base register + { + AddToken(instr, TokenMemoryBaseRegister, RegisterToString(arg->ArgSize, arg->Memory.BaseRegister), 0); + prependPlusMinus=true; + } + if(arg->Memory.IndexRegister) //index register + scale + { + if(prependPlusMinus) + { + AddToken(instr, TokenMemorySpace, " ", 0); + AddToken(instr, TokenMemoryPlusMinus, "+", 0); + AddToken(instr, TokenMemorySpace, " ", 0); + } + AddToken(instr, TokenMemoryIndexRegister, RegisterToString(arg->ArgSize, arg->Memory.BaseRegister), 0); + AddToken(instr, TokenMemoryScale, QString("%1").arg(arg->Memory.Displacement), 0); + prependPlusMinus=true; + } + + //displacement + BeaTokenValue displacement; + displacement.size=arg->ArgSize; + if((arg->ArgType&RELATIVE_)==RELATIVE_) //rip-relative displacement + displacement.value=disasm->Instruction.AddrValue; + else //direct displacement + displacement.value=arg->Memory.Displacement; + if(displacement.value) + { + BeaTokenValue printDisplacement=displacement; + QString plusMinus="+"; + if(printDisplacement.value<0) //negative -> '-(displacement*-1)' + { + printDisplacement.value*=-1; + plusMinus="-"; + } + if(prependPlusMinus) + { + AddToken(instr, TokenMemorySpace, " ", 0); + AddToken(instr, TokenMemoryPlusMinus, plusMinus, 0); + AddToken(instr, TokenMemorySpace, " ", 0); + } + AddToken(instr, TokenMemoryDisplacement, PrintValue(&printDisplacement), &displacement); + } + AddToken(instr, TokenMemoryBrackets, "]", 0); + } + else if((arg->ArgType®ISTER_TYPE)==REGISTER_TYPE) //registers + { + BeaTokenType type=TokenGeneralRegister; //general x86/unknown register + if((arg->ArgType&FPU_REG)==FPU_REG) //floating point register + type=TokenFpuRegister; + else if((arg->ArgType&MMX_REG)==MMX_REG) //MMX register + type=TokenMmxRegister; + else if((arg->ArgType&SSE_REG)==SSE_REG) //SSE register + type=TokenSseRegister; + AddToken(instr, type, argMnemonic, 0); + } + else //other + AddToken(instr, TokenGeneral, argMnemonic, 0); +} + +void BeaTokenizer::BeaTokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm) +{ + //initialization + instr->hash=BeaHashInstruction(disasm); //hash instruction + instr->tokens.clear(); //clear token list + + //base instruction + Prefix(instr, disasm); + Mnemonic(instr, disasm); + + //arguments + bool hadarg=false; + Argument(instr, disasm, &disasm->Argument1, &hadarg); + Argument(instr, disasm, &disasm->Argument2, &hadarg); + Argument(instr, disasm, &disasm->Argument3, &hadarg); +} diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h new file mode 100644 index 00000000..64bcfad8 --- /dev/null +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h @@ -0,0 +1,86 @@ +#ifndef BEATOKENIZER_H +#define BEATOKENIZER_H + +#include +#include +#include +#include +#include +#include "BeaEngine.h" +#include "NewTypes.h" + +class BeaTokenizer +{ +public: + BeaTokenizer(); + + static unsigned long BeaHashInstruction(const DISASM* disasm); + static void BeaTokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm); + + enum BeaTokenType + { + //filling + TokenComma, + TokenRequiredSpace, + TokenOptionalSpace, + TokenMemorySpace, + //general instruction parts + TokenPrefix, + TokenGeneral, + TokenCodeDest, //jump/call destinations + TokenImmediat, + //mnemonics + TokenMnemonicNormal, + TokenMnemonicPushPop, + TokenMnemonicCallRet, + TokenMnemonicCondJump, + TokenMnemonicUncondJump, + TokenMnemonicNop, + //memory + TokenMemorySize, + TokenMemoryText, + TokenMemorySegment, + TokenMemoryBrackets, + TokenMemoryBaseRegister, + TokenMemoryIndexRegister, + TokenMemoryScale, + TokenMemoryDisplacement, + TokenMemoryPlusMinus, + //registers + TokenGeneralRegister, + TokenFpuRegister, + TokenMmxRegister, + TokenSseRegister, + }; + + struct BeaTokenValue + { + int size; //value size + int_t value; //value + }; + + struct BeaSingleToken + { + BeaTokenType type; //token type + QString text; //text to display + BeaTokenValue value; //jump destination/displacement/immediate + }; + + struct BeaInstructionToken + { + QList tokens; //list of tokens that form the instruction + unsigned long hash; //complete instruction token checksum + int x; //x of the first character + }; + +private: + static void AddToken(BeaInstructionToken* instr, const BeaTokenType type, const QString text, const BeaTokenValue* value); + static void Prefix(BeaInstructionToken* instr, const DISASM* disasm); + static bool IsNopInstruction(QString mnemonic, const DISASM* disasm); + static void Mnemonic(BeaInstructionToken* instr, const DISASM* disasm); + static QString PrintValue(const BeaTokenValue* value); + static QString RegisterToString(int size, int reg); + static void Argument(BeaInstructionToken* instr, const DISASM* disasm, const ARGTYPE* arg, bool* hadarg); +}; + +#endif // BEATOKENIZER_H diff --git a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h index f7a471bf..8145026e 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h +++ b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h @@ -4,7 +4,6 @@ #include #include -#define BEA_ENGINE_STATIC #include "BeaEngine.h" #include "NewTypes.h" From 46beff5aa0713ac647b19a162de26ffe2ec7f85c Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:42:46 +0200 Subject: [PATCH 077/676] PROJECT: updated gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 512b8abd..4956d586 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,5 @@ help/output/* *.autosave *.~vsd release/ +x64_dbg_dbg/test/mmx_sse_fpu/x32/*.exe +x64_dbg_dbg/test/mmx_sse_fpu/x64/*.exe From 5c2fbab5cb2603c348dd894161adafda9bbfad7a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 19:45:06 +0200 Subject: [PATCH 078/676] DBG: updated Scylla+TitanEngine --- bin/x32/Scylla.dll | Bin 468480 -> 472576 bytes bin/x32/TitanEngine.dll | Bin 609792 -> 508928 bytes bin/x64/Scylla.dll | Bin 512512 -> 517632 bytes bin/x64/TitanEngine.dll | Bin 679424 -> 600576 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/x32/Scylla.dll b/bin/x32/Scylla.dll index ea20b38f4066461c9e3d145c172dedc11d0e4569..c2da5e4411f9067449ca4d69fb97c36e63999b9a 100644 GIT binary patch delta 155972 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

    3J6Q{n8`A)1QC4-t?brdWjHk5av;0ejy%=^P*G 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 delta 152692 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

    bclM1Ie8l6EoXOEb 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%0AYt1-VD&9<0Ak-xFI?=1GMisL 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%0DGEuv8D;w{45omjA5>|<$9x0!Qe59#>6@af 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

  • Y#f4c<_VL?g*aF;b0H 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 diff --git a/bin/x32/TitanEngine.dll b/bin/x32/TitanEngine.dll index a5b770ddd8c7d0e0bd705068a89df4019aa7eabe..2bc209ac87205f843889a8687fdcad53d4aa5718 100644 GIT binary patch literal 508928 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%0Ap2Tr@(3vElD`Tv2uHrA07%B>U>32ff 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%0D(z7 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

    MR4{(U|TWnyE7z&AwoiM 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

    Q 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

    N6h89eMfrt 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 z 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 z⁣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 z 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

    =E^YI>AmRtspgC}!{cDW25%SC46&3;6?oSo+x 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�)O`KJR0(VVUmk5xNzO23y;>@nNUK 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¸%3!O! zP4LPiE1s$TD{#XXQdnepYRO|8C8E4T?q$sF>~*`D+ZA$en+pupVD_Z)6cJ~e8?>!- zlX7L=_wiNf8EMfJR=gV_U`rw29@v{&nEgHMEw~(} zi$6&x%JIc!G2FL5Y_|6tO7&NK%=mdtxnCFMYY8hy-rCt->d{fHnRMmiOvi~I)Z zv*1ov!B~o5Z5Eqf0Na}xJ3!{Nc}DLbwWpEsnlm$4{vkzW%v`}#jSqAF2{9NSVZn}m zT!jVSlJ;XV^2SM@Cw<15iBXyP4wwm!mOe}R-1NLLyxb4n4NM*q!)J@yncg6o|56Tt z+<=c~(w-ai9wcPOyjbBb_h;R6rLe0My5sPT5s%DI&-t2l>vV=cgQ)2r|N@$z^)&ZN*Z~=A=~5_hhZ7(^(mz7E0$)= zU|=XNUmi?6c5_RZTW&?fB7bV`SP`osYqDW$TMFdr-4v1tyY_$@hW z;i-+=4z|V7K3OLY^~urrI;^P0Ig%zF);+CFgV>#(vute|NH|T9Qn!b;%u$j3sfNQk{fd&~3-mR>}8M1?r_$w5T22z^2 zQkom<^)&C>u)BM1L&M(@w5@>%R!joPfnR(Ig6X+~rsuTy0_%{Z7MnZpcr^J}Snri@ zLlMB@hD?pGH4HnMCs0i*>ChS?AwM_rrl4+iI>C&wn_{_T-J8TGF$QpM{?F*Dmy?o~>Ippj*zU z661Xj+%^cqA4Y(Gax1nVqzN;14A48D#JxX5fCyZRxYNY$J^rOXR6w z)t?PLYneYra(eu;bW%)uG_&julA>7&oK^S?^kYz5v6GXnOV=~zhQR99=g-wif3^

    iUfEIATO~bI8C(mor7vf}&*SWv-2GBjgD?9ZG-< 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 I{3aaue@Y6hVgLXD literal 679424 zcmeFa3wTu3)i*xLBq2cJ1j%4ftWige4Qe#l#wO?tOvo7-Y^B^sQFgQpHPKeXA9%<)T&-!X;b;M5}-|yq`E;P%Af;^ZkBnpEI`%f!6o`z0d!7 zJ|DxGvoC9}z4p58wJ&Gfh4UOvhr^MFKhtzLmf*?%yz+0~{}{+V=!mBeay-@lg(H{b z1YbCE{M4V#EN`B1^-pJ9c2)VL%YOdzt3&0NUr|1z<>%!;`+2$l$LEw^b@k*cPAo1S z;ITj#{_Q7!3T~?V%Kkh5#}9lp2Jh$p`0lT6!n6LrAOC8!#r`5 z=byhCC(l1w&->;1lb=nRN|<&J8tWa7$+s3b4tXX296N2hQ0^*D$&|k-!xD&SDW(Qvc0{-71@sF z%?<&n>8}JQbr@IwhybMt)BVm#`3@9oU(I6f*YP%TF@CxtR7qNNzGo_NVreblA+bU;fl?Xvd?;2krlfkXUe>`y6TB7HNCK|C)QS1f|FJOALE_Vl1bH@ zO!rR+*6cD@0r0FPny!E@%+YiU62npis@EAmCyd$4NzY5V7UslX!rxo#QvXY( zch!=<>Am20sTf&ly;J zXnreTBxybsZwE;8dTBfx&GXUzCD};6>9@(=SR}t%aIqQ6bniStNFH95OPVh_Fq-fA zA>i(l=2~>3r|^6&{BgOa?>5~rwh${G@@9c>Fg2exX|wSI;1<+hYk%#ggQtuN*Iha> zG$3HEHP?=7f9>W^wMkv*Q^UlT^EG{g={^%6VqKIqM@#Yi9#_|ph#)>=N zC~%CcTo$bC)?%eK!O9H*vtyoX@c=EnEH_|wPw_>AgZ8$3s>Sl}MoCSd=&91e%gZnA z(sVFj;w_b1)~yTbuLq*jN&?ZDW#{|G`_4sA8ml|%t3T27&%KLt{^5Wuj*CuP5{QoO zz+X51HsWtH{I&01{ODgM~xL8j@xA|2pM0#Hi<$c{9J@_qWpai?E@-?gZq z{gcpeZ=0FZQXT0C9fgFt@)>z`H(fKp>sn++I()ABZ#8qJ`9jN9DOK#ReBT%TChwX& z$WHDl9hyGf)2iuDdD@6*czL7mV&B9|yKE{E!LswA!@M8_blB@pC1i?fO4GM!`W}nl zEeQ(To#*ho79Xa?&dIHJz9yODCUqHapK3{lroU>s!<8Z$cLD*$pc>@+mn;JLZzAZ~ z%h_fU6+wyklxWcqkpj~N^j(_%g<$cbYZ3HO-HD+=pu-^7A}5p!OIO9?k&c$UQ##@k zG;^(_1of_9WhbQE7$-Qn3&LPq3jJ5#C;y(4gX(ohyN>WW0IN6^)@NGfR#XS48iP>R zrr|`6Z^+|S3}+J$PqtTh?s-Jk3zpLK;*YkHIk%ebN7xqdrzTlI;_JohCGREEeV62I z&<)f5U-EN3N*YIeZDK@2*VI?9)>ipFRjA~68h_sUm=Ah$J<=-L@Q!CWNC(}0u~goy zg?E{uvw~1dt$uw4=nuXkgmM%@sWVtAHXfX)uQlC0cx&$nm4s(`nsY<_CG8EQQ8iEW zG@*;$OE0;&i>#CKYV}#hhx{T#sOLZWWP)EBg9^m`f|#vylM*xOB4 zgnnLT=h{@~Hl%hAJ`2#^RY3x(&K*zuy&^8hC-L{%_#ZC#_q>C8Y`^ho2aqw{XB{tH zyP}G-)k@;eUd~ZTlPK@G=bQ({r^O!i zEcnJWIdIh3dj6LSt$}NA1hv7sB5GUNkDt_6zsCXGi;OA$=wwf$aqh3J5q#LDu+VNV zu~I~x$)7Z*vx2avWmf9NDs{<3RGSj@2OA|Fn$&c!K^Ev91pF#V?Stmm5DY|#WKZFQ zBNU;@$%+$TUIrs=VNTB)aGKV>!xed6v79s`Bbr5)6uS*dHq!EY!N}sG3S?kBn=qa) z-jwL@02WtVgx-8}Y`#O<@W&d&UuZ<%_Q639qpViDD&!&qef=XcP!FdEsck-sGHCNB zX!GJ^o4;YrM4NN)cAyj-!I~gni>|f5=88PRVWcv6_86p3>Td72X^86xKL#mWHx|}g zJR$f*H-82r-QLkU7`E7I_@!~q4&$qnzz+#TOaM7hME=4CEulU(Db(Xtf0IKA+%%-w z3OFWQ3Wgucmci)YV%V`uF1k2j$`baY9Qs&nJ(+&5VtR^)p1=381k;1wLH+FjFj4j` zLuE~#m**JQ{+=ts**)9^do+X5>7J_kSba`FU)NhVjPbB@+l5b?C_+?2ptIoyIMguR zBT!-_Q*S;*-aU8^=r5xT2yNVZBFQR>4#vt0Qdx>xu{Y92APwv?op4Eii$$*h7}}Zp zMLgZd&H^6HHr-C5#Ghyd_U~wGq|ggV?L+9ULs`2s!PL%ZcUXfDe+Fe#ci;|4d*`qg zx&Y-WU0Qnr3d0f)t`R=}TLzy$h2klQUv)zQ@iPUGjd&g2gvAa3@s6YRf%qN2Od$R! z%A_OyJJw1;{9p_53x6nx?;&Mr!#)!d123B-Mh(HzwLPC8M3_q2>P|})qwPwJO4LX| zmh@MRCx%hwJ4L`!KJK~(!rCZePK4>{u0_x zV>YC%LRwM)IdTxdHI?k`e9yyVL1l5orG(31`9sQet9}hL2B?tGr5a^MkDKlv0t0B8 zI{J6;r*^uIaJZg3sI#k|xuP0=<_7w)?t@XN)|mAH{Vfz?Rk&jlVf@2%_W42{NKZ** z`}B_Bq%}dkvwhP|hXKCNwWu(%I#k%%(a-hV>grDDv4FX{#rV=v8!|t*NM<;g7wB7o zb70lzZj7-bbt-`02L86UZwif_!v9=HL|8@$TJBpyS4~);2-pXKTa|D2*A7RHBXqp{ z$aRFuIYFoa`p(^2ZTGc#m0MbtC0(w@OH&*!yjbp*_?Pg9r+doIQ~q#AP+u0HSH2N8 z+jQ5JlNAg&nW4#&hAGD^PnGGelni>Gp$1L=r+B|dNZJN{yXhXrpU68%CN;)aP?PYY z4`1bENQo{6fRM&A0z!J3kbg+xdsQjPMo|pQB?)}J%H5d#@jYZ0J%8@Qmd1^E7!L&I z0q9444|H$!YAp(iRCj1mKSme-X#A&<|4iUNP0X*ViFmf5rYmwUY23c4rQURZ?+Es~ z+aLR}OwDRUf^v`ueV38NxtZ5=zxTa-hmK}^mCK!IBVJU!Nyck3iqBg*?m}3;(+0Lw zX_L;W(_*)4Xi)FKFwHz3(M5)hyso`Uhy=m`eSJ^NWn z6XZDiIT(_95S|0@SAaj6`^^=qQ)~xUKx}6(=dg&~v_?#gm+xHPc|Oiznjp2DQ)QYq z+x+=sqjOC6hli8=V&+_t2dM{uEA*kb=LZ8nzrGzoF!2=ut%5xPgz8PGo-3T#fDMR2p_;)?uu{8->%5pC>og5Pe%# zLg>}>I|UuOdCQN@b8x=dZiXuT`sfn; z@Qa3TYj z0;K=6Puq{l>!UxLklU+2@ygzv*?rhPI@7x!pPoV$vOGS5N+Y6(3r0}ghj(-kdIQ-Q z9DY{PWOj&T6D^=dczKiWQr{)YT3w_Bz(u`IMDBuo1OYxj&}mAbwE2sd}~PJ`U|l5#uh*z2doKM+7?w8xlF& zBNEBREo5x_N&8qXF06>5BZ6ln5nLcCdk`5}8SyLt2;mZwQ#nY){YWtGZ_jfu z6L~6=I5HFOMg*DQYt98hKmw3XxhZcb!vtgFgj}RzE7B}bGu@7%N;zP<;)>i%6oEk-vMdd=5c$+FVkR=xOF)0Y zbPqw3K`Zn!*a9#I0J3P9F9D3|s|nW775M-JRO)3sQZTxjG2mzn6U?C|S|uo2B|w9^ z!Eo(XU4DmTpLA`VYq9_Iq)KVO7X)WgL9D2a&r$>dyURGC_MSHJ^j24-6$Nzv>9d>- zb)#Z;mQ%}6|H<_(9*E8&w?U8eR)u)lZ}uiso>We>in>fUfNA9 zpszLt9EETnv1CfKhQdw8jw8W6`tnNu>8(s{${97xdd(T-N&G5L{3_DVEDyr`qM2@r zNh@^R)Y=QnZX9A4$$)Pp zPbJ|^1~Bm^gP3?L^66SRTWQpsYZ4>rtDUf~q1>iT8dc|yK2$;?W{hU}3HE3{ zh0KhBd)J+1G}j|B>u6>`UOAkQpAxkdZ^+1e1ex*Cv>^03Fd>>CI%5-H!*&csFlj<= z=wL}(NhJDNMUx0Zsriwk)VXM4sPiYk2L~iJ-$Pv;&@b`^^qG*KcM}#z*&Ax0vR?YV z5sU);e(4{Q1_&uZL?-ml*{qls+8SdW^r8Jeo-R6Y=`JPa)>6czv#5qnE_+&eHp@cz z1zDL=yR2mZT!oW44)Olg9q}6=4kxz;ojZK`P386alwq24FXs*wLFWhc`p-Q<=cm=L z(IfNKUQ%}BY5E~>OyNqI?#raPmP2EChhehoLuCsl3M7>3L`4 z-FQIdHQkb)cNyM|Tam{lVG?Q1L{ByTPClh$4rU$rYs8=j@i!iS)8|Ay&0z(B@qA+Z z3%nbC1--dFBMB6UH>@sj7<*>rDcJ`N3BLR$ zxE}A@i8rb?%h9&65s6PLQJCu?Jxq7YATU$xPI+Tx_7-uA5~jK!Ekq0K~P5EuQ~dxryDi( zRn$x1q0M;FCcOoa-;gFSL9Z|yB&4wa1;2euNe%j8~B+2Lv*gH0*$-t_s>aS2#gBgs1_bVoGw2k~Arx0$SpQ)-_Z=#&IcK?lhE(3PHlMjYgEk@^-QjEY_r4@Xxij-F2 ziT@q(8x!3`6tVS7#LUqgq80}X0S-)cPW%U&{+8DHF4~M(ZAON%O~k2)Su`@tYIzu2 z=6^C!5V;O0+VJjvuE-Cuw<)~4&=omRe)M-mj=>KK?!zoj60b$w@a`NnOQ)nPWDcGZ zCBUDvWb(?i2mLU_TkqZ>bOOE@<(R(iZU|LP=MWv%f;EvIXZtNnfqF*9=Xr^@DVn4MqhW8iFI^MV!CgT8O7UJWl|9kOfBDs_d= zMI9ZE$40GkW1w;q(AmhEwHsaG!qpB9sj`{JxE4EowH={S z1a)$4;ASU_#ot1nb0h1;iehLJo!m_auoY4=LP_F8ybRQwa|KW1iq}ci&>{L@M8PBp zICMN;08KHVe{v)_(`f=BoYG-ZZ()w*rJMo{Kf?A@pg@SG47}9Q!X5BHQQ0Q4+1c}Z z#JF9HLRe1-dPW3wgoU4{%h>Y(YF2mj1dF(Pw*trXr<;ELoj#?kq9K3&mW1ftI`5={#NwTk`R*0*TsFyMkI zNM?tvZ5h}Y(ASvm_&|yX=K7pXK~Ju6-7*(2fwj_;kgjgmZPy`5NmaG!Ztb^Esru)K zN~!`Vp8^$>YvtU36a>qW;@-CuiD-?|{f^f7kSVnrT;V%)nGn{eo=a8Izl45D5!Sn(g|IIB1q0p~5T8D(1QDAW!cIcg`&lZ6w1Le@ z@^Gr)^c;syK%gNk^F2Z)h_i{UQ{V$iQ)^E#JT%p5uzag@{8RQ0;Fkp$D(}Wy0_|`A zL9|7|Y=s=B;Qa10!13%FPf8WH2AFd{@ihV39^yGj5 zqBeTwqo+_5M;GFe)SLs@u~Xq7q$vvYsu?;URYy?#w*iDq9gr_N0%@YaEuHh7R0d#< zFgeE>fxqUSClHVojhNu`eu#|k?jJe`{uM3m09X5B$RFa@lzpx~Gr&5_<7I5~UBnWp zsHje8Mk(nW>hP`{*O*RZ@C75y=}$96|CZ?hg_$x30=Wiq!Q3(+jCnMP7CISas(E%4830Mp*(EWp2#xZne!JdqlHL3OtNw^$vJ^HTY|-ZHC5}55T$$ku&3pe=1BTAtlL6b3L3- z8^%@EjF{bsA(0dAmyn3M7zH7%bFPp!7{mM=b?ClJv1eaVfCm7uUDtF!mrI&qUoA?Z zH0D1{s8yruYJUT$CPes0Pg8{L5wu4^M7m!=nn;&m|FuyIylBYSU7y}ug3iKufL^kM zS}U7b4)36L8D%=vaZpafc9yrD1}HuZ6<_IPP-5Q*+)3XfD50IEH z{tyaozuv}X;0PVCPe9!06HrM^i02U*Oo>|#HtCNsvl|e5=5Q+?LJbv+3xv+rV(O=c z@S}#xZ6nux3CB8guok|dFsJ2cO&^H;b|6!{Or;ExZncpF$Z16m#-yh`Q0GJN|=m9oCxtFTKqX5fv&s6}vI!`)sq5x=30?32$q_3x3 zG58H_Aa{5VW~npehqI-agER-Y_IxcVa3Ic-9|K&Gdien-gYoY09?W+CBtP;)mEk>w zp(EkTg*w7}28Nyq?h$c{Ty{U zAve_3`3PrG`G%j(6@DQa=5`|t&;+hi(;u}%U&e*4kMN${mT7Gxx8FmoE(bwg-ku=HIhh0*1%kYOt_(PF5rVW-wv9aWZ@>t219A&Nu!;XMOd;##;{0*MSC zGsgX!0#>Jr4u>5omnUs+iNM1W?DNq%>OUl6>7e-WyZR&KUA%w~oT1p+qd8yH zI`l*A_wUPY3mkBlFSrv<|HN6;EN!@T|fn?2m!ZSlDE4 zj31P22EtN>C4gVaP9g3S!dZ>J@Hs-^Q*yxg{B=C=`Bh#5pI7cw_)N9%nR-C@lw;CX zLO-TZwn~RTE>{aLuLYh>Ay{Kj&%X)qgO&ML;}Ou82X-3t{<9G5e4Aj!L~y$^f#9jA z**2@N+0lY&^sK^02X~SC3meti$j0~~$tGcoG&yqsDmI#3J=ehxB_St}klex}Y(#n% zGCqwC%<`0R3v#)&n+In)AZl38C=A1*t8-~pND0P9zOu3av(8zb8f#)u&aFA4yjl!q z-uT%Sd60zH7y)X7P}q?mK4sQw#TEFzz{;mJ<@-WBwbfPk-my!whG9l*vG2tdkMI{lsSQ@qK#*rH2rUk^^ zlEn1=11by~a2#UUzQl{wAQ3R#KS(yH5>BvSe{8{4sfQp{DAlScbp{Y8J}UP*)`85yB}CBBELqgoxm1qT+x6*B1ApAMG8Kk_uP* zAUJlGQ&!%ShZiaGE{d=LN&;2$*ABJ(NLj)1V>y;>D+2lrRpazY*j8vQ-zGJ7Qr<+V zLML1~Psno-9@=xZz8J^jM=NCuY&I%$T@i4nU zc0l83WKq$e{EVgQunu%O_sl9qOXVx?*kmdx345UQg^mAz-y!(_9*^&ef5Q%vU+^EV zpw{E@pW>fiNR-$keXTZab!*$KoMybETP~a`v$_OQ_56|@aBsyU@QghGfyy-jy^9+F zvydz_re5#H7GA%@F?ywcP%{ob6+ft;+({^vYkb%ytak;%ovqpGW0Nt=;tZTn6?>LW z&kF@m@mM^*D?NAqD?!gZ1@)`gccAAIR8FC%kaDFzr#UBuLqLh&q8R9TJ0AZbJ<&?> zISPuOP`(pA2MD0zujhVudj9##1U;VuI4HG0;_)Bz=TxGUF&nknbDeeOv;q|I zNt5}f;1T#ol25w>`U>pj%*JP~$V%#HSW+*yfNQk#jkNRFl=C`{h{B!)^k9XC^`|dr z_3~fQiP6Yc@qiqT)uz4H$`EL{t5vIgD}>3;%sE&chH3RJX$55C#BZFO`L!b2#u6>> zpz`lf8K8863V+tBMMuuT&p_oa>{|k=Xju!dfLMISxLTU;qt$M8-7-zw6rf1TG;+H* zycl#qXi~wwmq}#`jl|BCr}L{b;Ki zjicblV2kxRadrnNNeg=Mq-52p$*SX0s%i!!#i&}AG-V`?7f#*xKrN-a)7`p+58vC~ z?1>8J#_{;B`sHqHas$_QHL>v$(CQXm@3Hxo~ zU(12s;wt9XZgGWg#lT>M%ZNj5*R|INDzSPs3+8KyEhgH|xE8A$taX~0oUBrllU-VE z@mF*DJ6Z-CL+EMg#c$yaa5mz>(cxMEhS&}JYVrH&yTR{z@nRN$^MJSz6nwP!&wK}> z7h$$j`~Y5Bii|E{mg2e0Qb25>*}Y4E%#cb_|EG!iYW^nYHDr^Q#;Jvx&gqAHSu8dK z_8$AXdbHXvLzVL|nFEhn=-o%i6vgl=h~t+OM|wE=;RUP-meI6u90=bCopAUUw=qoy zVTGK^$RxG0_u-GJdsd(@)ZHRH0#DmS6>n}C6i+agHz?4#s~`ZohIwDm*`X~t@+kQ) z7mKFXVBbOUqz24n*6eU%imDgiL^wEy0xJpEB#VWGQ*zB2n!ZL`qQD%LtG(Ex!6|~9 z=&s%rsNEQFjoQcp;pG)Qhmh9J7n7+5ymF36MVFVv^U7IfcyNeFa{>f4*hCge0+;Xe*c^MwWGU1!SmCA;)R{N4G`~upoMk@#ebEo$N>=K~sVFbSAnD64O zf?GR7{Xxv10WfwvAb8M-S{PaGiiE1DFrMGzgyVg93C{un;R-nWbY#H7_QvMNm2X#yEkn`&+={v?olxUrM!S*W^+ixd3<{J%P10(2n&G{CX z;gfdMoVEjRJGJPkuktNAvYQWZ2zo(+g>kOCD`(C7R*+F@I7xAD}0#!>t;(V0ITjGv~fZj7s--gpduIHh* zj@5yNy@HBpSV>jf+OA$qS-fNZG7RrAH$I>tZ=9$mLaZikLMH`AR zRD_8v<|-F{#EHaqp7nG^9!HYwP7g%$JUE9C=M;LiUth(<^@LIpt>;Q{x#_+RndG5* zPD40pLrFTS(Hw5d=w@M*x`?Gv!ONnDvM48iIC+YrFPL2!GymnJO@VP$Gd?VgEw`z8B(Y^4vffAhrwk-Z&Y zGRb}&(*A9-r`vx_=ypS4K=$-6AQ!5UOE~c5A}I%{6rQ3kx35OXMVjI;o&~~c+U^fY zNc<>7j#U?Ln+!oYSr=(5kwy*T?IpLinjn5WZ=F0v^SkCmw8;xugF7dx;v;Im#95kv zzT3z-2f(2>e1iI6#EL~IY1xm{Y(|k_3~?PC!qDVMqk$dd4*R5=w1ye|@t;#yV{WfHl9U535J5rH0xBV-TJoLy+)X-7Hb1e=c%Co}4V zh!SR+n#fL`12|l=Hxo#+29&-0RgN{b5_&pVfqGT;mw);JY3_=QDMa$5Yw7~CS91L( zFnccxx^BH6jR$tF;tj1LTSep(bTR|Yyiz#&F#;Ata~A=Xa-STX^6a{&^t zGZHXR3RMI8D?F7n8_9C4$M2b%CHr#8&P072v{(}FAD|3Y5(f6f5H(SFVF|4qT|=o= zayn+c@%ak16!|lh2~L{AJ=^{f>Ud1`COLEWS7_4Y5sc9&SMORpYea$1Tvf08M>Jxd z?b{g|QG*@a{HFuzys&!H&d>E-*p!cFtTo5=_-@>F@ zlXvSmYA-QV)+D?4tKWk<(BI?^j|peR9xCIRAs%agM)+m4t4( zZvg}vp;Wku#!YuuCJY>%@ep7-lsZ7^MFUj?WDp9R3`nzAvEMyhWb#9qBqS7e7rFcF z$i43zKu4Aeru*#3o=h0oJ2DecdUXU2h24v308`Dq)4`sR65HHhEZl*uI;k4rK9)%& zKqLGT2{^zE*D)nMh~3%lP+C!}UgMkxl5oCxJq01W+U%K+AKz6zM?R_K^I8J^_vCZN z+iCJSm=F@Wfpp~XzB_VB zCXDPIc@@QabtFYLH@w+PHcPRmJ}HW@)=t1kCO|g7KqWZzmm@TV6PE9Nky>6v^hH8V zNVACOb4bDwrxR73g=uxr#(l^JecROBgz_)t;S?>z2qaFXrLIV)_;XE^9X)@|l!QM= zS4!`(W`6M1yhMjfd35Ja34kcPTPOn9;?ikvAce(ffU~=F`9KIamQ`O6N35S(m(F4Kvt83a^6Q;~6rvTp`7qATSoao<1XAJ+;S_MU@yJ&S zuW}o&IVfu3mGHu6F)fLgxYQCFWso$SIv-ZfG>%@Qx%_cgB#5t^X}JFeZ^Q#xQ=I87 z##0SKeao3%|C*wFAI`M?Iz<{#g1j(}GXtX>1DEMczy3bRHhVeI0l5$$)0b<}377#+ z#e}bTeke;V07w2e{^aI&f^n3{RLimH~dj$5Q@-1 zVzO;JXeg8EyW!luR5p~C_AhuX!gM^H%lj2XK+qBPXTcbywXi!IW)p`O*NJk{a5D?M z9M>&R0%_%vo9@Yg3Xk?$+jnVH6-@VEwkjYY-%>Bjt1aS5Xr_BLs!};>wtJu281}Ox z8;7zzA(jbcsUMa4mLq3@$GMUhtU$mmKtP)vC(1n!0t1{+Fx`JgVpep&*|I-$5A7S> zivYP#bhipY6uPoNoPz5sXg#36q0L@NbU85X)8L#?YQ5-@>Ap(v7Lip~S|RN+q$Twl zW}OD0EX?6q+BWnzYfK`o{1TLh7F^F6p7$IjKU0$WXz`2q zz@bNrqP+CYN`(4QUK-lPb^v`v>`XBA8ob#G!b{15>f%I?Dq!qr$D^NI7bzQ(T zGnBZu6X(s?3Fxl#alrtDkbM#%v?t$qX479#UQ}A!p}~NeXs;7ekUKq1dsSMfmD}2D z4LY8wy`E!Q3TpdQUxE)b1D5DhLISrnB}PGMvCnZW(=J?+nWn~!?W1H6LI@m##Rt5q z2A~fewn~b?BKTd4Aav^uTo2GogB|)dgR%34n8^kHcdYs)Xk3ByZJI}^A4Oh!HKvx0HPk7JKA5ykH~AGp>1CybroLdR90xGVSeih zFXnqJ)_kOz2GBGcGkqj?tm%l9v`dp|a>J5~$g47#ui>H(9Q~Z)KkdP?OcJ%9Ky4QGa=Kj+R6sepZMbejbIt-N zI0hBIrB%``2pC+QJT^(+@EPbE-tj=Xf?{$DQjCK~K|1Iy5hM<>b$KA=C&{mt%k%2R z34Rr=k;<+KwPEY7?rND=xAYdrb0%Xua_+~ zfq1iWz8*whEqpZF`MR5FW(YS?^D@9EWm11=m(H*T%Rtt_|59!GI31cfsyNhrkou@!*u8Iur4;bxGNZ| zpQFxjA+EwRG<586?*bapFP>MuTAQ>=JTk;|S1d^0Z^gr@8WHlE?n^*SxJz`<^aqrK zmJd#XU&c~ZiRc;1^mfozzexGrrW~|4pj$*p{tG{_Um?{$bBt8JO2R*b%fsCOwtvP& z727{s4xp(H57xAJBaG=D$kyOl&FbZ!DQKqqcyuO^6>W+^C1|IRMZBP~Fx zZQl*CTX>Q%ai;tIjTm#wIa>g9#W^e67p|A0bl=%}2HXfyL|04=m@;n~$ENQEdmgZ@lg#_NKLXJWlX&RJNTKU20S*2Vza0qOfm&Uy@xYQ(PT<6 z)oN{{pF5>Y_wRvb=7h2hY-8&y=r;U>2~SA}du3IPJ-xODT zgMSVdevN0W3Gp$=)o@c`5DJ_tS;5$~`2DP>O@1%oGEp$*sR^jC{52P=B|eGU<6Z-_ zmnN8ZAt8OO=T$BRU4vxlN?Y3Wad#ybx=eSe^f**1HF*J={J;%p)4OpuI0)~90v(}Hs@LDIM-YM) zB@zLx-Xhgq5tFjcR>nc)$}FC(s3tB$86Zs@UqdnDiMQnTGrEVEpNvDGf?*9?bsmk< zX(YJ?{lhF1+Dyoc!&*XGU5&M-ZRMA+7dF9OvMZ02+#O6=umKfwO z%FO?x%0H3$&?DGU4EJ<95-p|Xw_UdPkd{W4X{zSG*s|0_=pXS0Rdo0TxU#r>bw-Kx#?@B;OZ;QxseWh){)Wk-n>^up&5#$YRW zgvde@fz_=A$(KPFQAeixab(I3t4n|yfmKi<0HAskYUj#e50-B4B7g}p;k*L%#cNTT z!WTO)52gljXSRe=>dLw^Pzo?)lZotR(v1G-EBD*03lOo=BG;;7Ep5GV(8J0((B zq%pWwwY18$cvMnTLx9n9&_m4(BI6KD7 z*Eny4R)?CQ-dJnQhET!Dxdc66e7(_VOcnuAb?X9JWHlM*qAXPg7h_HL2Ec^-<3Y`I zkSC&84^JXnM7VaFYjJM^l-*4Ngq9z8=g(W2-ucj+{dfHPsKbt5zcsVtbKYRb<5N|y zFHGiV_WDv3O!j&U03r-`vf4YLX*ifc{uFL(K^{~OFJ@($t$n6Q73%9|%u>1S$eTEG zfeAYHY^2`L>OCu=J(RbSaX;(ADsVEiLya`KW;tcKPjSC(g;m5j21wa5F0divZ)4>X zb1Ql%$s>CS|5bfX$hx1k1N%3i-tHThKyaa?;1ZO%o;JX)-l4x~t1{{qUK(gPfNyHz zJZKXmeo~&J=J3N1F>^&eLQR&IjDv5_#i?{xcb_Z*p(W}S1Pb3-QWxX=CA%i}a1=Dojf#w)n6xXv2NM-2GZL*^yQQV8- zJPIb-U_n0m0OinX>CkD&^urOCt)5h&{AKG$*9jJ!W(jiIy7X)) zUFgz334&DF^h$8X9v&bV0mFl^Aem7!o>>R3!fuT8>tw}E?y#oXS7TVj^@|O!fx}Rr zqE7kUhom|kgSS+#&Zmo4w_sU98#IYyCliTo!;7Y|fPXPAtbU36oCv%0teC%|4A;SdrJKdrQ&bbsTg2##}A3?jHHwRmod;)-AwGAl!kyC)ht^t|1_^3$r?Je5qf5 z1(Y0LU;EOH)A18Qe;)=gw#4hXNWDe zkLD@8V7l){nJ00IPDwuWW|0wrlL}+>1xDOx#c!CG5AYjFZ{cCJjLl{UnPTY*H?llqSeeM=D&SO2N6;1~5)vZee{Z>h`oCJ(as~Vv_#UC;+hxZ4)TKAT4G>-Nrks z{~ve#d)&3K`#`ztR+P-fU2ozVku>gl?797O*J;nEa)EHyv9}6$@m4|OQ2YjW&B1SQ z7oDhV+%-9+WsAE`M%ziQH8!;qPTEDgjiOb5hH_|?7wtC6MZ3_n7b7ik(QXQmm;j-V zAqEvzdF(0`YoW=7&wy>py?h3H?!l)u|DX|vf!r+ zVELA3@z%E=amGKaB5K9Y$QJMT^~!`dkvd~Y#D_BH3u;Y$oW6_K$FkJEj9#1iCc`;E zlV4O2V>glAg??_bjNMJhlnFyOhLgZ5kg1FvKgl2t^g99orwd@YKB3QxA`@7a<)EhQ zPckecJ*fMoWEV=>7p6}onHr5PE6A*qJ&oKFiq9~tLuG6UrLXzs@0DxM)v3TFzlReB z+zyjEVc3YQq=n;AF65U2a!DDTW-v~*es*c?OEV7h<3ith#Dw!|w}!B15~dts1$`?_ zf*lg3elcGhSr$y!ih~58i(<*@N=Fdk`NF zDQw&a?tcKBq|c5CpX!(}MCa29pPikRpfEx+Pa>Je1?GF&kh%}IJt2Z*Ao;$e6#3`b(a={lGX!SCBaOghq$4(+V63bawGU5K166+!fd<5=2_D}!39-^UwmDQ_NRL~!7 zD#zbu{NY;RkAaH?e~A2t%N_9TF~27V63I1~HWbPXBbe?0 zJ8HYV(@~F;+2wN-oQc`scu~TJ!?PXD^sAvlFrD~jF@afXB^Q;!`b1CZ1X+501Vwm8 zfU$XAe3$lpB(YBA#9@O`ay0tL3o3#bwKkMg>u_qh=bCyuSb7=YQ3*YU5_UAs;A$ogGU3~)ymlk4R-ILA1WH4YHl}3~52-7Qo~m|2GSrVu`Ivadfyl?o zBLSE;iOq2qXFSD}bop5QcNW^8e1sPfN65$TqA&fpdG%I57v-$lO1Oa}(A0TXwwfS8Iu(2*+y04dFp_|n9*p}ar*H@YDYL)y` zyQXYIO{q3o8cK+HB69b4K)7}Bt!GF zB80)NCcJIGsQo`F5#PCW2g1)gzDLGN<>&X9lFrY&pJbu^@$=vQMkWA1uaV+?^7Cyh zyI+3Z@@yacoRD8-&GP5hCi?45v2Q_7c|uhCOK0b%e+K?vhZB`MB~dOj$9JZI-AKl? zXP#@ir;|THp>ph?DJjDDZ(`mnNQ^27Kh|+j6z`XaTZHs)FCN#`SSZhRNg%kBn z_sJ-1?~DO8i6yMsm(QqPHY=;f?qtT_I)0Sw8y!rXz)c&oD)u1}e>?LD_NY(#_p^s6 zYy9mpVw5fZW`A#)_7XlPzDmQ-d2fN?nrb|1eTAq8d`nYS<;S-=E%AqRC(K+@YaB{E z?KMAc3AKD?;*ZKuQ*tdPzAQc6Qz2g+0uBEzmE`Ms7sSrZRZ0P~U=~95z08K^*$f{! zR0AjyPj4nUT8*VoI~|oF&(xrfH~ke^)>>-}hD@q`Gl=)AFEBIsHXc31!W>|=n(mVT z767^7d8!>kJsN4;8q)hy&0=6ue~?iKYaUqJbdP5DASs88GS#$^A78T1GRw5lYdnCvX!$`quQhFaK|*6#W_rQ+b4)p} z41EVC)pOQZkv?mD2|3AGBR$8=S!3BMpQqg6z_uhcHEfcpVK9!5=mlk~u1~(gYv{{O z6CbhmG&@2+6bvN(tf*@~rXn05J;boc_zZl8DPkQuW4w#sm<96cMI;@MhXt6^MG28{ zZhQiuGrYmUdqUOV_0kzQ^h2qh&6%BW9pT5v0y;tm+LO+%L{Co6?8&KVJ?U>8BRz?? z7{dgq_;jxSWb43m0JS@?9d~fU=k-EQVPL%!Fhl}jdT)DF^b{jJ*sXG~q}_ltJHq3& zA^cS!XgZ{gG7mE}{qHKgL#=?hC9dL{iDjX8<(qvx!mIqp@mNx}LOPWr5_-c6?hRu7 zegU~y-{ONSXq}W$G6UJcIhEUofDvJ(&Jna8`ft2pI3&7~v4CuS#qYAePzbCK-m<8l z0Tdh?#LjPQF_7tq;lXHSe&BDxQwasgi33hgsCZOjO?dXl+XoQU{3+FmPHaPpAEApT zA6I{=vM@!)DiY(-Xcq*Icp3*%Ow}c}Nrix`he0&szul=?5;rS@8pd52iByP28xpx2 zQQsl^5bO0%`3%h9;n)+OC-{a9w{~@5k48e|#dNVKY(j)|@)Cp6gUcgWIW5 z1nQMozTk}YASR}+Qz<13ETR8!p7RmvoejqCZ%F80mGLAq08G6N!&|R)DrT{WbnVK& zCG@YPQ~#caQH@VZLV4xk6#bi4dw7=GWvqQnDq*E#XP1(&cDtrK2dF`=l1au%A5%|- zMy6JkF&ToY@nchy1)@2aG!O;Du9)t>0?++y4)BTYR>dzxaRdn{eVCr|)bgtUW9jbO zk*Rby^l|zY0UuN{sI*#u88G+s=CZ`ci-8?)u6b zak&07p27BG6V*KQVstFn_O+Do4=7R4a^MN4Ozdw8%pGVvfr2gBdy=@Df{U3k5De9)6ZNbopzve zDRu({0z>}zPYM4PpWy2+X`_+m)4xiX4#gI}XQApGI67b9y7eJy12{QVNJ%^E&zXJF z>G6AZCuR4TKW0kK`G8_cP9rk?vAP1aHcU5)kW<%(@wEj(?ymv{5(FbJ;=}KUCU%h{!+$unc!N*g<;-6E?PxaS+NfuWxfE9p@ zO~$A7@T-8J3(SrwxNe{z=8t~exy>1LZo}0Kp2B+lY+lRY;T06TrQr*GyU+Fb7tYTC zbMmNIUQX@ynf-juFZf!YGu>0-i{T@vEolFR3p`Cs$@^cawbcEznCcvp9ht zU7739SN5C)eQ3Oi-~2)Zej{lZbt$m&sx^be%4`K1N&+z+QI$ST>W!5aM&?qeffX6U zNXl~L9k$a%TJ98gDLHIo9>^HB{zmoBIBfA7jPK(IF7cj$m!BtrLup&<=+^^&%4mHJ z3yI>^_d~sOdYeQS{1-Y8hM?2iBu+0B+O0@SXs#3>iv$S$Ub=hqdqe*%z9Rj>v~$_G z{j8?C1DXU(jU_G2zl_}oaUeucLw9&xmi*uHJaQr*;(?{b^z(Q-D-!Oe7d%Q|8ApIJ zP8A!M4TQQ%EQ8)~AKoC1eK^WB3#=kMH>AIk^?c3TN0fh0?;ZYqdA9R47QQKNvK1pZ zBZ)WX3-xkt=_8yqPW7zX0NMECfK(@#v#nnvrETOggs{>=1Bk z{cdkgxT^EShwUdcu|oyFxHpTd%7WxW!Rq;k6Rs-L0Tbto0V6e3Pzfm6Lj|+5)V_+f zGeQNA^v@P5_%%|wTgAc!`#8|he)ghbKh>C&P{H;;V0`UJnSApa{Ah;?4g)w}Y*xMl z+o-(C;Y{wQ8UwA1dEw0{!<8vUyX6KD)EDQp+%}cxsbIk+EQrh|DH^1iwDzPnkq0%S z<8h=NTRK532CZ#yXvO^AePF_%S_d&_jbN z>MOshul#Z}J|k1^JKo!CtgtbjKPG2-Nkux?I{-E%_L0UeP7FRZm>v8062})1=-3Y886V;|Vju6}HAy1sT?-Fr2#NsK8iL_AvF2Q!3rX!r8;;QL#oF+&cr#)!iFgfoB#r3L zK9MB47jTmC8jYq)$>poROPDUN9j{r7G~0A(HYR&7BLvzlJ6`kbgG!%U@ft7mIj)Ax z{OYxYqU9egT6|ippF?by*so~u$!YI;{?Lr~L8G6DBBnq3-X{v66+C9 z--9=>ZyyHi+TU75vc|Jtd>|3d+2?*>#HB1-_3I-O$dOjrjFbcT*~p4u8J{|7qz*?& zE6qq9a>@RU)J$}bMr!Pp8Aj@I>9=j9*4@27BXuacNhd0%b{30~Dga?pjnu7xlHEwX zet+-U-M}EzNadlY*z}tb&;B$w!$|!B4OQ>xbI-3o%|-=L!3v2?P$7{Qp#-go-L=S6 z(E&oNfZC+t;TIjoKoH=sy@>+cM1`D2F+K1NVTj;8DFYR=?9+2>C1IcZCZ1 zL2adFoNj{6u}c3#L2bgXE%nKe31jJI2RGrBV}%p$lsb)7dZ$&!Shfcq)7qB5a?x|H zoc@yd{~stg^Rd2(wyeuL6UG8a6W>C)y1+&aAJD;iw*vMrwSroO=?}g&r0k3ReH>P* zLQoyk97NQ4YsZ@sc;nv2>P@ofWSl-z$>wt8a0kAGRj_xx#8ta*c6kq@QegI$rG@?)?oQiyp# z`0G+vq)dLeU6JGE#}HRL0_lhnwvk6Okr3A&@vvJyLt(r$md1(}A?_Q9<(0q%$|=M6 zwG8GbuX@qw_?E%?DDYS2D1M*mg}u`&nO@pEeK^xgdZ(Y@YQGRj>7zWo^T1O#qT>kQ zm68*C7XXjpe8!008M%^C(L3W1$r#={qf9cgu&Yxtpo}spkS7`VykcfXev6v~&q9O( zse-s^W);QVZCQpc{BqeI4Ssor^Fh$Pa%HkSfRUq4;8}u@9o)-mF=p%H6@+Gk(;EQ2( zjlfybbWdd&6xZN-;u0)bPKUYms%17~_HSq!@s91R*sNe2i9KH8d@wA4n+S0y_GV+< zgLMD939AXhS(XmZ7Cnq75Fr*F_sD@TiG44A&z==|@Bx zs_=_mL$m?ks2(c23mR(hiylF=p$@;uJJAL&eo?hX8?cHplpa77dr2chY44*ALHwe1 zk2W;o7u7_xVLX~Dj5bUl1_i)iBHkxN8=Ck&5$}`vV+ejsK^0o;Xv0+Hw|SL}N?%cF zM6@9f5A>8BMo)|IKu_6k^pyQZPcbP{J!Q|)({en}QxAZ*3Gj+UGwi+U6??CGH3G$3 zqv*PS=q%Om4yna{Q_-t_FOXmCH~wr28Oj@RIMcludYfBeunKL6)GZ z+JH8dn6*G^x_xNZl0N3y3&N)$SrL%CkOe>r3I8+t4cQ0%#vr{9e09$2!up(%$R*U zz7EMn-8#&#hoKa%$HzyNqZd@+QJ}+El2XDHs$Haf#(9!Ch+Qbe>o$2kSbA81_l@#CnAsEX+9|K4 zl06acPsqDl-iP4*et924_z?x4Q$o;n4j#4Jul;E(ZxL3N@r_`NoDlqKsc}3SxUdKS zWS(n&pRYvcY{{+UE9pH-UWfCw1h3WddIDcPc=g~FO&yL$&k*%{5FWi5h8J(9GE5xr zWSFAp1tWxCwn{>RU)IWNf?uAM*D^GFK^2;POkNW#bFaK6Smq9SO|s0*@?OwV>{{Fv z^^t3?k`&>ZHbt|GBt^K!qGCW&gljC0_@Sf-*H|2JjHC=CTCD)f+f~A55npHFwV%8S zzjUZpzQQAH3coB@Dep>(@XG>~!gGjWQ~2c}mGZo#B>07V6*iOnvOwMw{KAM=*i7=v zY=9MaM+dO?UgN3qH<89Xu}jYkG(x>JkhB3}!e$D=ISBwiN=kKi|W zBwiIZEBPA?68D77;rtEmh?j-U6Zjjf5ibJl!gwD3m8(4yGa#&NHPU^^@_oTV@n5Ob ztWD?PkDH*Fi$G?$rHqA1xb8c6TEY^0`V!Mz}|EF;-;$8IpWl4~}Kh5h#+#93J zYrK*+RhDGx-(9SHq0=L0#= zW$E^F#U;vq@=KAN572!~v7P?{!zFF!G8EGLMMq=0+W_8%PpmhT;8CGBl;Sa5Zy1J0 zqux-C$9UJ`2G11yDAgM(@Tk)phT~DAH&jK{TtIIafnPLgdP5C<(U|ECb@)XirZ?a# zNa8i?4SxKhiqae4rO8}CZwTTSjg;Qdh+kA9dc%19qEXTtCZMT8U;v*OlL5V<2@g2Q z4U_o}C%It?e+T($DE~JJfW6ck@=#_3`ickoScC`q$R4BP>@m7ph6lSk z%<3w;j+!1k(A5e+Zxe)uTkWXsQv<8+t8Uexcq{vk$$;v3hm>H)saaLW7sxMmoSKv! zSDhShb&{QCC#BQuiA#VTptXdjS4x7VWhDh7{>a_5Ww>N4h>ifo%SN zs&;yjW%~4AKWtC;U;BNV-G4pl*S3JEV8ed=f3%y$e?0}s-^u^aLcbyVpx+pz_otw-=8Dt^jozr|NmG24*hb_ZWj7|asB@22iM>F6b3Z1td@k=LNQ{+ z1fgLwelb9f$O2NG zm-!Fi7Ad&-@*t-o(wg{yW3e92ho#y#QbbbEP%qFaL~e5?Y; zig0sY>U`-z5G$$kk3hM~>#F?vtGcfySi8~Z8nrdy4*R)TSAEaC9v=rC?Z>LcxY}jc z9*0#5AJ*w>H(om|psxv3c5@k`w)@(H^b1Szk==k(h+CtDmsRkriPvYY=Gl{~_>%g_ zd-(b$Hc#Yh&Nt%)?WX4PzsZq60Kco}*T4K63G&SZ*-xm3ZF8?-JN$e#Y|kNQAM@O8 zY2$Vm3f9c`v>~yjNNeBGl8;f0=T`3BC((QbxYUGWcqYbhjWvdy$uV4=HilcWjA6GQ z+6H6jTBOcv;7H1e9LmCg^K}_QBpe>7eSOBDv9Y}2TJ7d*vHH-}^D%J5pwj%Zba9~e z4VA&eb;ww!9xL$3?9qt-`#q}2?9n0Y(LrNlMd;C%Yx5b@JsfN?l;sAnFOoC>N!huD zd+t@}+x}K0C0y)rl3yeqV#zl(qb1+GjW=Ds|21AQ%8AHPda;yxG4-Y!dR$4}$RjV6 zJN^249Nwr4)^-<-*-Z}96U1-xGXda@c9-;|E4?Ywp~cfjBvVlV_9 z9HBWkDT6Vwf>Q=ef39p^=m zHxBm%{SeVAd!hf_b2vPqBRMp##X+p?`)b#Ril)@AMXX7mUQ-qCkAFwRotpkB?r4@R z0+?k{T{Ou+8-o>u!_pz-6GA_~KDnkb?hNW5q|{Z_UjKf84k25s5ZBJh4 zpf-FXxyb*cWi97z_BYM{p-#9g;$>)-jvVx1&>UCIZ-lx$?JEi-YKj*#2DY)YxdP} zwh~rek*kEY*Tst`fr*mBT1Up>?TKf`CRXq~+7$)$dQ06B2h-KZTm3Ho_WEc`T|GCI zbAi>bk1f?lmyC)P71G2)#}74E^H*ElX^xg+U+wB^3ROb<6JMp|s6E0vaIZLyd8`zz z?yv3SF%R_uDIQcG9XDPdjfiP|jUV?C;#Ls+i_gTvpd&V-k1locwM)H5M+4(h7w#!= zZZJ;1-s#ZC;v`SKwHcWwcsekSBhUuU?#R#R=)y#8b0z3n<1^Rsz)4-tQESFg|Mvtcx$b|QK=DFQC+@^Q)^ckIHiuV_gF!^kUBZ*jDI1>B@2@+3XFg7g z;D)J)+Azhq{C4#@tK_DvN48)#0Yy7f_S|<}h1my!Nqua4ZTq=Z1h-x5ud4g56^hAy zSubP1zP%qS^?QNDFXf;{M>H%^&6Fsb_#!)or*c zBPe9Ci!GX-WmhZ<64C+)wULMZa}OsLswADq8MXt4x(!#sYzCCXuGqBNE3fHY`$^VL zzYUiii@!=rWZZ_!j7`YE;+l;SzT=GMsOe;6+fal%39u@_87sFhByYn-2Tb=VC~n=` z3D1~^g|R*)6Vs_yEOP=%$o5!2!6I0cxa@)V;o_{y^8$jmo?s7_Rk?{}%T;6(`x(^v zje7;Pl+(hp_sY5oH+foEGahSUr)Fi`hWj$CpYh~arIc|n%2LYEJ+8Fx5JX-|)5`pW zv6P@%E~n2l%Tpja8Am9TJ`Q>6cqE;%rF4Dlg+BhCs9&$9W0PuI-Jmq3?6sA$x3^OE zrYdDGl=9$u=yj!)VHHI!}K^GnxdF-dgPOqLccz()bE^D!t=|1i5uhQR>YCHout{g z2UnoTm9(IWBjh8S>(+X##s2s%)HM499YqtwDmFepITyQzR`gs)`FIa6RQ$Z4n29)6 zB|Br~JVFyF>StS1jp1mEyH?d%WaBZb+Nmfm$n*>#01oqh2l4H!gLq`hAmV#N|EuG; zVa9hF$3yQNnE3`@a%QzlirN;3I(9;-(7mnjYc;PrQ1Z*ud;5b%t94Di# zBpl=YlcZX_8G0gqrhIK2Tm%iG;hRHPh`{;+^vBgxB_eg4IwFbn2Bb|w8jb;|!cq}# zE|^6o@%WlN);Pec*i`VvO=&I8R4sDb0Zk0|4p;p`Y!q!!+8Ig}sZsyZE9!L~^25&( z=E^IKnDsp5+5F}M?5esJcG{Hv+SQ7m+IDr{=OJe`|0m}mEi-#k5^vJLKL_;YMmF9U zg8K$~S=l?V2%efKR`z-(zE*Si!#TZ-?0uD~MizQAyOG^>1&!TZfT%0; zcsAa8UFDHxChxmC!%SjxnhrXr8rgw>lHJH&mZkPM*6wX&Z{4^LBYPDxtQ$FK_D%ON zb^$zdfJXL($t1-tWnYiLF&@gm1k1keLMD#hBPEDGOjT3w;l-vyFNkQmFGP#h8I&fm zw7<$%V5YJ{rllPr_(eQzkW(prB}%Jx!^EZO2K|r)3wo?;qBM94lPyxRx2WFMI=*sAhX8EZ_9F;}~h3Urdqfl-Tg~8_5;h zY30296YdCJK)gV`oj6*dwg}$l|NE_d&fJoqzVG`z z|L@~@$egpzzO23W+H0@1_S$>jU^+^oMzzsaj*D@mE|}!QX@J2ST1syy4>Is&;O|C% ze$?BE2gJmpG*{V%nI~gU<`alRK!j;#I7h(Y3{@CBKsM~8ABQRQ%ftF1_$|^Rn{ey_ zk+`e_66HVw)t7crJ%d?d!78lz1hZzhK0Pgm#(tP&z^pZ|6x-|P3|IbGAx+s{EyNCT z!Dx<@?e$k-QXiG$`tpe0CRnY7;k6?;F2^<}6Ux+t3arB+#U|I6hb**_;1E9r=VTU+ z%W)UVi6p*oKUdk?^Lu+j@-%uawoHf5s8=Yr8stSBTpT4X*^Ff zYHyF9bB2rVFab6VM!gz9TW?63aI%c%b7Viw#Zc^w6?n#C-+6dOXv5j~iPkX{Sio#& zEl1`i$o@Gh(=jliAcJw!z9Y(!%lH)K$oudX<-O}Vbi3Cj-R_F-cE#wD3CwTu-=Gc* zkZZA?53GmtE69;DL_GQz z8Nc0&TH>^uZYom{sj-C)+=jEIsGx*xRr-IF>Vi@6z8n1xT?ZovVmxr2=sG3Pb-Zaf znUk&u3O=pYt1AK0e#aL z0_r7Su`~bX1nnpO;zUzv^XhL`1+U4e3eHk@&6^kQ@TxWV8P1C#UIPfQ#;SZi*CO5e zzp$V+mkx)$>|}rs;1}|Vb8j7eX%naL@6-yM_hiPL4rze~<*W$Rq`E>A(_F3P52dE0 zrG&<(;&GWRB|Rl{rwxzG?I{^4&D~HO&Q~daLd;q|J=xsdggw=ab3EkhpPF&*j6AJq z&N83=(wuERt!&OQpPp^*Wj;OE+}nI=YCh3?YHsdhKE2TFFrQv(?rT21(%jE{YH7|j zpVnblXD|S<8L0}E*W>>pVz|V$sQi8sAga!QNTO2c>tx3R?kB0G`f-#lrj;m5X)-lu z;0cg6Kul$(5b1FK3|)b>ii->Q%)+ogfk!5T;qOBt=3_{SXeaNSt_o@fAnugN(0JuH zm|~_sWTk%w>2bY426Y($g5^BMoSUf2V6W?@hWr%tdk<66ZbkRvmJ&LAd}T_fxq%f< zMyQN!uWlPrQ-L7D#_oWr1Cxf0$<-QHp%35;sB!D%n08$}mf?^Kn=|yaIGCY3l?U7t z6wZ`~(A-p_c<-=!QG-UIl#rfGl0yB1b&6l%EU2E`ybsB&7MN9L!_7FbJ zU3MqVI2(D)x#%SY(N<-cxm0T0?X5Mv%1M*WF>W>@kuS?jA{wxLa2<-_VQJB?Rrsnk zjT!Dbz3s@plXutuBLgXTKLICStB8C_v^byJFsB6Wti|y^Zeq%Jxt@GVV|ib#VHze} z5YYx`s(VhxNTcN^nz5{ z9C@a$=P`c&52fpYJQMWs*j&|S{H|2yybArw{wQnC2)z>f@9tqaL-euv{2ioM=DI`a ztOOcTdZw$abxvQsGLOF}zzxmc4EM14S+lc&DvuRRZ9k2u1-`@G=G+}@BII5KuN7H= zl!)Tg131y|1)Q#eW^)wWKcQ@XpIMi?n&HBN%y^A*tj;)nGK>%XJt`cyaDD5X6TuEx zE1%i3DzG74P74ofR{i??KJc_mh_v!=c$Ecq>tplWwlO6_84D3;G1!kqwyi(d878?M zFnQ>PAA?D5=a^tv3Rf)^ibeS%>mx)=WSR(f3*70mYxiCa66y~u2Qk>|V@O)|dOpDc zIs#P3YYVw$J-+j;CPr!fdt8Q1^M?+?gUF~q!0cp$r5CC3xE1e;@M30>@K0Zl(Hy!e z-2|gECK?X{_DWu(QuAA8`wjT3hS)l`MGY}3AVTa12(yNmwy=Q+cR9?4 zzGsmc!|VY@VUWZZTqq;WtB=D-+d0RL*tk&E0zMAY$H_>$0C94mJ~Gfk={-2E1|mq1 zzx{0M_>Sn~N=Mn2sEc;}NE#!*#tLI5BGJTD*Y_ z+QRO5PrMt~#k z)L6YS6ncxL!G2Ki))vDqv+z+yRe zxceQ`QAtH83tk;dszuQpDrg?!%(@&ooI{R8_5b>p@;OQ|%ViUv!2BExo-{lbx8Pt) z=BUS4DI3SXRomKx5D7wj-`i2{nohpzJ}44F6;9ycY-sUQ2r^h9m4KS?W%48H?ZgSD z=R#G2-t-qo95cs52f&IWRKS75NZu$G&L%0tsR|-NhRbrz2`TeAk#Qk|*fYvPoaODLu0EbpLe&)LvCj;}i)2vI75QG?n z)@87D49ejoZ?3xc2Ar=wMJP-A)qGPrARL7G>Qq5U{&r#|15d;i{ z0P%?eUp0Z`+9>cP0HbAb^mW(nrP$LSXhBt+PZ;|qBJLuB0~-Lg<`bD=%1hjMj}bY3 z?jDQbrQ`yR0YFCbQ6Z*Mj7Ln(+QRn%bLl-1^L7Gy3zKz~%hrncwvjGur#yPY6sx{QJDrg*jQ~lW-8<+7IFWVO#JeP4H zsm=qFdQ{Skw;H?t-TE~plAsEAS@nb~p$u&+do@-u<|uSMrnvA+7A~lWy+XXA9Z&|* zDIGv4JD|tx>-7iPfGsM%ih_8o9$@H}sl7RmD~R9OYZ2TO#Af7(ObHIu070AqLEH_~ z0$<|=@hV6q)ZbIPcR8xlAJ`>0Xbtz{R~Ud3j~-yKxQWXgZYhI=t+GLu`SNG@rr>}a zL@BE7orAE;?>u1Rr;tNyTAVNYU@lGZRl~WHUM2<2PG6M~J_YW=45K&V5v)`VEzR(~ zrr@AZsJzUk^o5tCsPK!(leVgx`ALWx)4jtGA!tR`>}&N0XgPw46G+7|df@FC<|E>% zn5YB)_RZsvkhh7Ma~Vm<*LV{COjUjYE9a1ptNha+RQZ78RZdkou5!M{SAG~W4J}X8 z?j4CQ`U8{|9Ka=blm4TXqX(#NSOfTLJaOa7rBdb3#ltia;c-rCt&ZgF)^nWd{E{U_CCyFM>0mh%BO9t4 zp6)+cYihyd!Q$XwbZ-i$t+ZR1(tg_&9h3hBu_a@Y4eF+?F7JbIsoY$I>5jpn!ruIO zTGLDUC*#``iI2Sr=K*Hn{DsWQP@i0wnX^h^J=!buPr`lmF=CQBGhu{=rqcFoudsz( zfn%w&&r~7N4f#ij4??HiWv|Y$yUW^V_jIn#psC3k%!uB3;a|J-8XR-&giZ)6ZrkjB z+#c7s`|oUxR?&)vFnQQ60M~+zDTg@d8pK|851UrAMh4WVwMa;#R%VS@i=T(sqiA9o zQ8FwCklNDt0*}}~%U=b99gXAItcG*OTEWU|*7+I0n~q6UCx zEw#WH{F<aET{ty-`2M|4jd7Cbdz~7HYahYph--oy^S}KX*y{fC)4KK<<_@&ZDWdr-x4Kz3;5Sm`mTzZT`!#df8N32 zRXBC7a-0LSeu#s^b@`8RD|G4Lh!V#dj4`eF4_NB!h)G8W$Lh;|3?@I$!BL2dX+`$Z zYV8(yk-Z=Fad515;^W|6HET+v${WuDRx6_-=Y^f*f_NVXv(r#od1jYBj*T@PeH^O* z`|tWV{K)%1_Hh(-f>eLNeyES5WePGLd=pFCuz(OjQYyZzXJNEDHl%Hlx;}k#nrc*)m>VX&^&AH^bJT!Yd+5`or zkEf98Z`p<)fA z;Kj5+t3D>&q8N??hF)0Nrk{g>vMs=f7mQl#oiS_vT;iqt9jDG*iVIIDmS z>B8|rueKQeV$s9ru=jA4SWtk94ebb$0R9XjF!ISJn@^f>1SBOdo4 zCHIfS=tWPgNACtU)EamcfM*T<@L#>Bajh>${2XpnWJdis;`UWs&<=0Q_q#)uxjJ))Z2EETkT)TMI=DmDnZN{h$TI-O zxkF@#!Xxr4$iDwTaGN}h_UaEDz+dVpzr(L^$$bO|KEPi~M-gXxlIvs|BvH(D zGN}{SiR_0B#QY~LG0uOoJBLiJ+$H}5|H+>reN>CGW?vKaVqC@<(xV6Bycie9^Le78 zebuI}$oW0~lk=jLpTNp#8N-EQRsKzsgmaEl`CA*is{DKWC#xU?RmS0|uQVP0O20vIQT;H`LF6WIN6dm3AKFmAGH*gteUncJX8aOsTOA zV{;!@kzFdV{r;g)Tlt+Q88KW$&hU2QHYqRTdWtvWp0-jm2_n0=u6H)*m>k;mxC@1v z2YAPA7(+Z);*POA)}Y&OY>8sZl_*AXVaHgI3n==&YU-#Zr_x=GJ2!CoG5^#ed<&~1 z)xj5MKoPV8yxfa$4wS1Y)s1xnIP);o?2rI9=#|x8Xy(7sR~!C(~3PH`|94mh}!*L#&=`aIJZ+hFo3jb5EI1= zlF9%r)g6ozSZDzf=OI98UJPTdT^=4CFz{ z@a{=KKDxC^!00`Xak2*8PiEen#|1{oUM{aEh3- zvZmi5#Ky9fj8k8M^f9ePT^8wW{vuZ4X`MIxGOq}g``|c^t>kkblo)5QaK)|@-7$*rtuIrZKR}$H0uiSyaUtG? zOZF!tU$y?Z7i+)G_@L}NT(@Vf*t-|uqH#uyPC$gHYT;=p%T%MG{2acnLoN6SL}Y?!~My~+eDQ)%kr|3tIK^n4;D?Xjwt zc0q&hCoA+1zN9+BK<)~?BtLv|1$sfu(>oGAVWT!zs_96voN7n#9JTM&`uu)?Zg<4i z=e5Nv0BQd%{t%Il%k&czNlrjrrbBXmbeX<;Z(;mfxlBJ5;a^;)zlll_$S{$&gK}kx zzYpQp8#1F8LrVqD#B&Eq0XR)oK=k9_+CZjG@%6x+P%j)E80;3#7AJuVJxe)+C3ysq znGKC!)Q2tw6rYgpM*x0JO454%{vkAAH()(qrD=alY}e`e)7_Y6S+ooit!dN=!*R}_ z+2O8sYRdKVdokP*Puwb-ir?Ygv?1Ch3C3s({T z91OP`^PT2OAD^RPc913}tsi^AVn40nS1iPg|AScp#=BCYlD5yOvZ9i<&$&dRlD5ye zC@CswN5KckX1&T+Vh{XA=SX2p;X1Pz>J;V%x`!Enx$O_e#RdimU7CAQYj z3s&ZOgLlpi_w5vl<3Auw;4~d&bJZVB^`Gc29fboDqXc_S2nJ=f@qRwtt)*xUi}0kP znuInCjf;zF0(pi362AZ{qX1HtQ5P7QuPHWMxF$v#I$~mBad&B?j@Ixp$t>}RW?0-* z<9_UqNDPasHRc26dWmsymj4UlVk!{*7fW^L*Q)TiT5Gv`IlwAH?xI+P+zewVikadb zc4PjG+4ka=DcBPt@o+EYGrcN?A#t_g^|6q+sYYri2z@pT?&7&%VN+7uFaj)!hJU)L z(w3?RSZJ^^QxPs$ndJ?>NKkl81^6PCdg$>}R0HGgsK`QIc9~8atq2 zv)0J@89jUwO3nnYH-_*|_+tv5OIp(b&2d1xTCI0;jll9$`|dzj&zTtKq24}cbZ1>0 z?cJwWi|hbK?C*qS?p{gD+_ML4s_YMvaM%Vb^He3lO6&)Fk)Znd=YajlbZA2#;yMq{ z#MOsi;0jmLPw^BBuBpYFux3(l4OsJggKG{qQSvb8&I+zcbS1qHj5x?r^-LI7W`Iq# z%eE1Iq{_qqo1qGd>s8_dY)(_qldTY%zmm)nrh_0Glrp=UjN$NIjIUvoh$3?rv3Vnb zt~tHkg1KZWrU*C8`^~;M;l@`Q~yx@xj)z5du5a}C-NKYa{jS&iz zg~)4o6^GIHA=3U_=ZK)=11vLG=~hn4V5J9$5L7?EI)=!JafoCQk-dqCy!}HFsp|p} zFA!mwLELdAK{&xmsM97QSH}?P7l+6RM8rr$B~5 z{Fe&(I2OiaBP;4bJadf9HNL}!xeA0hcH5NE!@X!W&JJ!rABk}efBpfa+vH4z zRbyr(Un*^6v6x`ST4csnukSR#k8fmPLs0!(8X1`3AcXWKD5`5$$(mK*4s_^pRv29( zQ|)~j76RnyqQg+%6KOT;!5?a6-2T|{XcoRyT2;VSMc2{pL3P&p5Cn}GC=(Sm-GFhN zmBDp1jwh}MS@s4G;I7ucwCoMFV3uHSV9OY`x>Bo=VXwjBFMaO%QKyphinQcIoN)(mD$Tk*OF^ zr&?_{1^_2c66hYbutGmKKiti10o|iy~bA)gQ28SN@Ie zXWu-}DiRHm?%152Y>514uw{st2FSN8?FSnmP00S^4Ul@|N=9TlU|kv@eq~aSY+``0 zvC04;D14=8cZpWWh~sBD6&Iy%VwboOGl^b21gD4#oz|HxLYpq$7FmLK+9H2caIr-m z#xsWk4d&?Dkupaf0tgegWsXGGjKmx{&RXQje->fVg*lS2WMr8mtV+xgepTiOLCPHY z6FAEprtWngS4LMRg#v8Uju8gqsFnhq=6Rk4qkbXeiWo&YQ7Y0<@NDsXYD+-3sHT)7*| z)A0668nvt~lae*!qOJMW)7D_~-6EsJcSGEowi(j7Vvx10tpMiA_C|AM8|FEWY%t~Y za?}}qP8lq_@GJ%k^?YTp5EN&y+=ExsV7UVZ%WTzQVzW@-$C(O=8v1c~>y@VzZ*^v~ zu*_g3Y!;TLY!-r)&0^w0nTTxh(oOfgvLqWK9t(B3Lv!djQuIwT9F1 z5t3zkn%2-)3f|hzJ5o81XW;h-tz(_ipIW$iV$rTN?qi1&E8-XfI96mjTeiZ+{^#-4 zQg3G>Q)eqx53^(_;w|7XaWYjQVQi&Jz_L>H)R~yqWjlZTGL>xOf9C7&L@gPLth^UP z?{m_EuhcI7k1!dSOI5fl1B-a5#$7t!=If(ZX5wy!<#^XCv+(qU`jP`5Rwb{Cn2QbP z_?d^){h2xsX%rzhP$*xV;EV z?&l;93b17FlVzcu7u-y@F1X16OdXXX+Z(Zpo^=LzZNUbvI(K?ToSbirFpIYsgLabK zrS33Vb&(X=vwk9n7#Cf$p1b<05tT0ss#~p7r6Whlt+?(P2TqtbI>G}qrEH6@hk26! z7C*KFxpVvSw0dj}&Yp#9k32Yy**q2*zww9F;ki?MZeIMu@cH@wK0e&1my0vFCwM|D z@{7L1w71|>N)0UGKf2sp!f$K?b)gjV8U)-QfiXUVo2xubhUN59^mIyVV+#@$x2((D z)VKjp2=Bnb!^JJoqApr*d~^?biFSFNh&9|{v@HK9vKx~q)ZT^i&&JC+6)6yO{j^`;d+i@Gp_J(jiJHDrTLqafxzn2HWMI3d4 zO!hFrY(Gi{X2UJa*5f@HGfiRkQ1?zSTknWrHU|mfF~i|337EZ!vMtQg1Q|B6L?IV( zwBa+@T33DM(L=%y7<|7RNJ0NxehPbL!3Oe;s}{$Qvj_8v+X!RDChClg542C)T*%B0+rPlF9y+)Rp}{4n>YQ8db$j zJRzC0;;ndRcc7{0ZWbfFrx5zekd5&-n1a_z@ z-L0>~0QIObaw)42JI&vd6L$?o*tP4?U3baBzc>jk;ux*)coD}O3+aYPCW-PLN5Xkr zYl={u1Qj8gP%%9Z^BBOx`u(S>5rKZIGcSX)-KS9;|AO*Us1f@8yrxBkNCMv{amhoes|DLV8eS5 zdVviEmfYs~TA37*IlS~MPd|*pGm)bTQVchZh2KMipbdEUw0U*x< zEA<2ioW;^XV2A|!x+j2Q(7u&FftE~9tNl4V@}DO-A{*G?W0QQ`kawMhj+#GeI6U(d zy)m_+Bd0Q7#Id6n)i?+fi0_{wFD?o2cc-q_*oyC7J$n*?!2x6O;|k!I`h0icfM30f zx^T|fROKhC(s5@@EzVszh!CCjMZ`zX9*hh)NU3lwm~HA)Hs2sDUZm-3J;Ce~SyU9> zn{YtCeVkApdOuZ)t^&)c;*DRRSlzx22~h6q_$jn&i5RdBl(7omj9R4j1nevD3^uVp zsIvW@*)UZAY3+rtHMJHlNS~|H&qIPV^kYr(1dKASXBma|k^BMSqofrci}iQHeW`oV z*ZSd#;t$-x8+m+6t8nDSw3A7mmnEa)_xLGXhx-CBpp47##o{$!a1Xvk9E)?(QS z_O}|9heUCy=y3I%Z-jLPksrgv{_D5NX1I4P_>#Kn&F*H6_OtL8+8i~{@cG{0nSJq& zJI*dZTpw~ELkTi0$5-8cqGb5bqmqG|Ig)>jHz;~PQ0>$HT!y9L4W)j9W7P3u(*@NaQLNWhiVVY-W7&nebLYN2Rz|R4K+RGB39XXN=Cvg%+_)ipF8+ z=RBuZhztT5Xn#raTnNDmCjTLA4PGPJ}=-nMH);Hzrzn!bs{()!v;zQvk7Nj z9Mg?674=y-aPj@?)(d1vO9ITAKt1{fPjG53FL}VAs|R{$;zcM1O*~wsANBIM>2^=6 z^C^5vX>}4`{Lr36lW(W)9GsZx4LMhu(|vGiPQ-C#Pt|g`Gq87wL@~7ikG`Fg32u@p zMiNd6b~X4+v4_;J|g*P?MLGI_E6hXFU+O?7!Bn(tbZj(XK>3feGM`2i_srzG9W zm_}6QgkBNLcneZc?G&#sC4;s8vBx;U0qzcsPp7~rG3TSN`q)weWhuT2jqxWqUaV-= z#aQ_$8Ih8gk}~Uj95g86C0590WJoULc~ywN#S+kRcF*Uy-P%?74saD7*lzqDOKcnu z%h4(?IG98xC$Hr1f(`ZffdYLk!m`n3yorQ+8l`|!Tk(I-wkmyXwZ4n{$8~h@?)GJa zW4aLgIQe`3^Af*1$Kx`3>H9j67OeH+{ZWBiBamh0g&2pc5yy&{ZAbjf3Lti|p}a1T!2_L_B6gTuL`tu)XCc`prwynnMduwAf$6d<`L#VH9gJ|^aR zf-~|w!I~UT(31&r@zNm|XQ=~d6%-^jP!PTD(%6 zci5&FPYEIBk0TxA!`x&?-6$9d5L;QK6LRb#dCBD~XnO%b7E18iT?L~C7LL#p1!7|Y zQqM7;Vks744 z+&@*(u;1USYHb+7zDOZwZ%++>5-N{)Chy{Q1`lVWi8K)ElmUZeGpcOg@Q|-1K+KIV zPFHAt1Qd4S{tAqd`_2O)wWf@VZCXPn9$hbGO2Qj)c5U%z?w~cX9r5a4BbS?3iA;pZ z$4!riXZH0J{!7)SF4CM~`-&ywR;u|o@oJDeD?$}el;v8PMJU!dC5Pl#CXvP7vSo56 z&&-qgMD*t5xTwJZO;v07R8M4+DnGKGbKwlRg9H~z$|X@#!@p)FeXH~%UN*T3=W8+% z>@|1zB34_-Grnz0^Gi{xC?AXS>8dl_UqJE&HsQ2#QYx?>56I^UeBO=d%e2vX&Fx$0 zl!B9?8E9HElVR)gya;h%0P*s2TDen-tXa$b-Jj%ijB zMcXbhcZled3n{~nzL-)EPw1s!$m>94OQVzx@e_@iJbaYXPHsxyBV(f0T+e zOr2J^qh88KK@#s*K?dew(dK>t7#bjr)5vE|ZFOzFbBZM4Vfj~?QDW6lXUs$m6?$z+NfkG~Z^ib+{5q3F zkd<{DisO((XlT*oJBuc8wkVpkhcR8WKZHM!r?n~mZWTdaNlDmVjh~`uH)E3vJNoB+ z)#U@rfk%q(Qkk!o%DiX|-iTv=#AaTw#8j}yvW&J(!Vt9ojF<3?*@MR!gGcVck5t0r zS7t!;Pw;@V<{BBONZmiMoS7C%rtno!eD)BVgO1pA16@Yp7;*Ff0;rbL%>-+@`R+Sg zbh`1x6?~o)EK?gLEL7c3yJ7mrJVJ?kym`d358>~q4wmP}@9D&4n-%&&+#K%J+YxdP zeH$mw=kWM>cs;N-@tNx>3QZz3ZGG~d(SJeKI8OXIhCym`Iw4S6$T?6hc(0o+Y%XV zjJ8V{ZAC^p=n_BLO!voUSZ8-*CZqnT#++%g%dnf5?~%boO*n46nRlP9VqR^vQmoXd z`w+#*sGEvmv9);X6kK1xxlLRBs;BG??VgQz9vwT8^kysl3X|p*J_u>#ER@s(V<;*M1>Sp24&3!g_ z9TF;115zq-8VBvRlu>%^c^HtbP>emPkQlK6>EwWX1xd^S8KoJGxU5p-grOGr5!Fu{`)?06`sobajf-oT+NL2bKU{9 z&2Ps9Rod4o1Jnq70sr7mcW9&oZb!q3JB~1$N_ADX34@Ew+v`;8s&S!`xYdlOu-8Fi zD~KDhQ5Qm5&ED9zN~0-zZbj5W)iyzgG*d`gVZYfD@@8a&R70S zViQGF-)nq}{ecwE6attJaSdMhSCINxC}-!1)k}_0n-L<86OM`Or|**AEb}08R1Ome zZ1BW}kmFr^((-Q9Z<@%WAU5Yryq9Ab4gB*@($;*Q+_3(NiD1iRY znkv1;tFNnqN01BN$0CkpUn;I9-%&dhI2PdH*o!z8%10IN$*B-4Vd4UsBk-;I(TKw* zk6^+>#;-OBchrKvqh3`Oi3?j?V1w=PLkcViwRQCoR=$_M6CZ9hgPwye{8C99OUOea zq&iL2X57|OE|rG*REI0Tv7`h|5f27R0iQ$%7*pkPIbK;I7tQCFq!1D`%?Z<`8|l6j~M6#>0gJ5+%l8tu$^)p8Vq=i zOhaH3{(feR6EKF6l~(_cQ3hCb;|E&9J77xL?Q_`|Dl-cuwNjr33T$KmHZNwUgZDktNHR+wKX$y9P&#K?1;} zE2USe2t8W>-~j+FVtDl(6$lL1U&psRV1<--BCqaKyw*IeZDv6U8oNASs%4^IGY@wc-x`OuS;H5CMIor#wbX>n38 z%nH!jI?9N-lo5555m;`{L@py;nyWm|bPrNQQD#h}pVP^Vr63_y(h7YWE=dER2msFf zLc{_RBG0%L@02TWcg5sNZg+FdPP|>=nQ7k zAMqGGcsq}GU**Oe^bpkaAsv&5{=Lvoc<|aT{7T?ocjJ{wV%y3aH4Wn#0I-q*g-GqO z!}i0iGHDr)-_9>e5nGHByrH={+UkiXXsbP0wtZ-P5e8rj$)Qf6UxUYb7~}VeX|In; z_Y|)k8@jP5r&3!zz37CIP^*fv+&0`zHXSOv-c4`QUN}6k%C=*zG4QEWUoVfoR5U5$ z;tk(LhNt?l%etF<(i#t-XsBh~a0+N6!#ClA)$ZFzAgs)EsTh^vj_jfwR5Q=2%ytwb z0@_J>erI*DCygEJt-8|lr855&s3<+ZOm)3~)RM-?{IUA@^uTu!U#_;=R(1%O2G(PS z1eb_wxFr1cNIh$a2h1Tn6wDl{dxyYVuiT$O1Vo0f@=R`p0~-!yNQA1u25eZn5wleU zYl9$0`?*-steU*BDwKt_NlaVeo|vDpLoN-InMD(IiH(JEdMAqJSiP= zWg6lfyYP*Ysj(gh^KlDMBK*W_Kk%Rxk~cJ1IWI`R$}ET|}-^5@g+%Y?uOJ$zFfMn1PR6 z#AhOid5)v4Mo;XIRGJqS3E;lkFcF%nQg`c-j`%^{WtNCzASy+5RCoDJ(`~b^y-wxEjUI3qQqm{fhc55K{(8( zahq7vmQ<{Y?O4EEReo;MuLb zjMkuYN@K#mutx4gR|K&PK)QV_M{Zyv1}F~Vaz%DZ)7vuv4TCIL;DJ0p&fr8Jvj5`j z4d^+8eC7y+8jAbf_IZZcSHGJf%!o+`NXz7e2dCD^bA-5gi+cq;`iPt7Axr|11!v%N zvveSxhiE(%JP>hQ6Xv)%il90dQiXHG2to?Z0;8@(%+(%=HQ-F$AEiYcX`eE~Au%>) zbN(z4=kymS2RwR-xju+v;7a@hA&23X2#(5h^C>j?ClSXU))#2a!6IcZc@$ia2I{f-nvo+h*Fb z;$ebGYnE62qsuGoygZ5D2N?!@eLFGS@58$KW?#9qxHs_|*3+j+GeHCYVZ8Dvu8-P< zY5GI%wIXJlM>AjwEk~F^c@6@3Kmc>Y0DeuuX8w>`nG$-6Iv1i&tqIzVOinfuDBsx- z!J=WA{dfB_Qn-4E^^>Wn4PmwDPf#0&V7<+#D|Uepn)@fBFEak3<)3|=^2=i7=lqEB zqx9N3SJCTSk1mM!SLeM5!mEu$gg@z;CeiZlJWhE(|Ka6v^7SB)RnNZsEeIL(Wt|rs zEwequ0IUj3nGm2}y{%!lKf8E0{0l4{^B61<_6}xTjS!4z@N*mHX2e5%9My7_@r+q) zG+?BB4VZwrRR_np8h}bo@nI6<&!(S-iP+1)U(Ohd%a;TQK6z`@z z;l!tiV<}6AngWjqCRAv~Xi+^1!8{BXO~jF|FuDogTL=zi4P|35VHHKTg-8~D0}7?C z{hVw%$ftf%L`lgG9eN>;%fS0Oy#%ko?JA=JNbXdX^caik}gj{RPk;yyeO zE1lLAGx_a*ryOBKpwqPm9xklpwJMD<)R14#Pc%uk1NDMDzL8GGDTs*hgtA|I$qrM% z)y!nZP%jyOX?_D!g|eIRE#er7Dq)!PM@vu;qPtKf&g2g{HeSqlknH;<)s0BStn{1! zc$Waj3D7=vGoQ=r2Sb3p&IT4Rdm3eVonN}C+Tb)Bb zGwQ*Hur?4ZzSa4Bs&PR!Nd{Ei+I?7K{T7vfmq+|jB(O;&gY-y)8o@4~`v_{?8y z@q_Te%ca5xzmO!gND{{fegTdWpnWP{EDnn21t;QMAVkRv^rz#LWpZQ`y+@H719oE! zh=H(J0h=v;0smm?x%br!xByz(UqQUF^+o+UuWTmc8Vz>|iIZ z@YNe+#FE^^DtY*A|42wql3Xhi5c1D8L6PYC+bt6P=B5M^akPCRqpgdP_W9e$X^ymu zF^D3L5rD*v51H;?N1PwPAf!3oxco{XiSdR|Mh>zz(u*65aAb)kBoQAU6_SILkbG}{ zQt672EdX1kcOoRCxTt3HfU9c(@+ zk(h$0ZrzHWbOay#rodv`q$shs4B(PvcE+LG&;{GVnG0uBSWo3Ef z!Gt9eY)()s9tKk}BtEh)R#PX*%>|M*k{ohrmn84p1-VHT9b(!>Yz$ed9FLm&bsR)b zjw@o5h?iG$Z!`u2V`~fuH82HjejmNTai&&2NH)a8Tlzq3zW|gAXao8UQF7J*0u{PS zRA_hUnM3{fq#vd*%>H0^I;GaLm7QtpGjvjIc z&%6~Ntzs{NhF(Nk`f$3@cex`x5EJZF9%K#86oIvz7$S~8KthNKPz*qyp6aY zKY^_$GN2F&hD>{KE}MEcBa*-waCC{@Jsac#o1YD2zD72MM)7WJU3(5#xfh)|0Y63& zQPEq&{V?Ez_K~b6XfIYj`TW5=P8!fZ)9?>r={me7Y$@;tvoCwvp3;7!DT(p!;`OPp*|kbPZ2YpEbV%e_bciuW;PEVb6Cq^Tjpzem**o7< zd5_Ps7w#nqz_MO5Io;Y_vuuVW2g?qSf z(YIsC6s+*8so;TgaZ7{HYw{bmlo2UF@UB8|P2)34M@T^iBa>-D*|z}(r6uBMMp92` z!1d}KW_u!=BPIy`xsYRF5g1T(%5+fBNa#BH&)qD%3j{!ljnfbJ5 z(cYl_{+0F=QjDJQuy$(Mx_O6bewrTJneT!n>FD8Aq^Sq^fDFU#jmLeT6dQf;1pSZw$@~S>F4&8 zQlt$J2pmoGmjdz^6XLJL%VX+gn12`u0tXb-3nF6Sx#b-b&%jZezc14Jt<2r=atmI< zYvE?ts3u*RU+IsmE8Y)Rm7e`Kq6>|r9%wdhp5GS&c_l%^N_{6|3rV15YS}(T7qtfk zB&oX&yY;gFv5D>xw9_&{-jqeGh@<-+#$eVmb~gKEBqA~9dM5Apgf1M5lGScOEVVKA zcP5XN6!n3}g@T7=MFLZ)?61HS#pCjD1oxbM} ztfkLT8T!?5vTNuTa|h?Ou1VLf*BuX|I<8#Tc|#)}B<{QC27{FcXWY4Q0#h0`hAkKc;Ik7-Tj z7Fk+x%&TWVu`Y>Q;d0uw!(`O4kdEZ8yOD_8#XJ_9zQOQhDMSsg{X1Yq-Sj*YNk-Jb95TnrSpN+YyP+Ji8Vi>%)|xqeE~qmb zU7OPLQ%47VWtk&`5al?AbmK^n4@Y4|B822yc#lOI(Ptst&PTae7j#(POx$t-M*Ix! zO%TyOgYJ0nxawUmgnc42Bw}WgM~VvnEwUx(I0#HxTyj2z&7x7DEpXXqr#zkd*(n2_XOW(mlGOge+QH5+2<)B*`Ie7 zD>X$qS@TfGU-21*u}08D!31l>Jl0N^)YSECiGK+jCP zLr%g%Kt@Cs^eh3O)PodlYy(noT=aAjasUv%OytX6^94Fi_PkeOG!arn9PJ<(Mo|I2 zUYqc!6l=yn!x%GJIItng+|l-$eIWIr#D}aB!z&_NhO`77 zcLNZ9IW~XGj(n(8@J)~>)fOcDEJAH=-Cl#_m>K2|L0J>Ib86+>Vy{R3+(h)OKN z#*W!H>fcc{E_E+jAw<#N<&xqghIt^O^4T^FP4tcv&C?pQ(YK`oe*YqZ0j`7z8FBm$ zpIs0=OkouuDc=Wqu|akgl4=bzAQ|D&_GR*jjTy+I*#04Q0oNL@b3v&Q%bKeD*~n9^ z^X#qS-LEXi%?0oXu`@rFGn0Jkp!9)Z%{-OarRmyl|&0R%>WURi%Ai^PF9RK?vd2K-I!$hitSzx zT)8fIJ3h3Zj(OChe;wB3pb$6@15&>Mk3GjQd5r>$E;INWT(araqq)EJ>K{ToG(Oyw zhP_-(1FirLS`+$V_4=`ft{pZL_dX z#(T>qbjWHL0XvPK8%P?f-#gi;vVF_yr;eaOmkD-h^$A}XjV+-}Uqes`kR zgzpH(0>?0J?3b6L(R^qK0z+5**Qx$fwWjBUXIvM5;p^^fIHEN&Ueu$1-o8q;LTg-3 z09sP&Dg4@F`<#!x5(ruVjJ=SnE0IuFQL11q;~*N^{s#P79lqi4#?Os){Ja{UEfi2Y z*Lq+@M;zHGQv6X%kszV67dN8!<^x(k;>~6l`C7v?w8|<2g#8nsh+6dOSO_8Cp&N1j z$g{$CY+%D>()Ci!lPIhMcH51!iCTZu!Syy6{Sz@Foe5F*flr-DW6_xx9f~uWIgsi} zjf9a{fZE8M2wK8O` z4B?Jr@iTmA&r2SQUjhm#fw4##kFgj6tz;~!ZI~T~re;}jdB>$fSCicwByLv#mhET1QH5H=h3z9Q_(N8e)Zm z?~i=nfOifYRuCP0r8t+9ndl6D6bTXr-zE6ct^-;>;wR73!xpmggJCWJq{F~l{Fm6k z!*)H?k8r?_VyqUn|4; zkDw)VG?-tHAXrbET&7a^7Dvbysx(737R)My! z|Bc+JR4qV{WkS5gyc9#%^6FQZi}MOIVI>ykbFLj7oL-p2H?bMV25&6%@R$?|3KcsV z7ac!MqT{VST5;qTeMHXx6*q@af4~7CL+WpdAeun!Dl&V3!_^zQuoVfg5qiF-ip%uT z4){uWD9{0WtPa?p*a1US2MozExI*UE2l!Ev8>(cq1B#>r7%$_}-(m->cLxWILn^BS zo{jGSj{LX|C}s!TF-STf@NCBp`0Fci9l*Az4uGPRJpsurrL$uPH2obiL2KH8PJnS< zj2K2W8=^;wGb@ABi}TSN#q5n@>5b7yB)vfdRc}PC2>3ruWlG{bs1Hg|8dbbJ@vMR| zCjlLdHHo#^$DJ-S$nh0$Oa2^Rs)l(!@b`1+@WI%8aQdeEasx;0h?_r};XA< zI0(6B*@Zr!SsqeTgu)oY>A5&I2(vMiH@_X`)A_Ig>p^ael~C6C>?7k~fhf^XnJv!5 zadp$M4l@h82ytwkuqE|lEB@;(#zI2L#o5%^&sC}Q#9dr)`3*|KqQ`Q;An#i3>+zt1 z(;h^X&^=Gb*Ly~DeK7?C9a^E$r!@^7A#q@sMiFmJ1veH38yyny_3z`!IoTJ-*E~Sg ze3sO_wbfn~t@#wx9EgCwb$h*hjTRn=q!D^gGSo(BZ89{S(6Px-JE3*S&72_-Dyrhk)-+ z2KN_^f2`*#gc^1{VnU-xW!PoFm}< z$>2c(-jN7qs7{oHImlz<8;+H3ZVDBBUuZP!=+j@|CJ>3tIcod|OOlK*fPo5qYH!5R zuto$6w`r70U@q3g=K|)TNg7u}tbA_8Rq_k|gzSGyRc2uAn`empIsll+FB_0n^6Pa~ z%|*zu4nRwO?J*{-!zx|K@r=q6acoctv%gQK2|k=!)cMsowpyZ{5uZuqaUOd-UY9Do zJW|PyR{JzOD7;2Uby@?&pGY}}ZvQP)74G$<4p@Sxb~#@kk`7-Uihj9|Up7Jn2O>6p z`C0VKjr{Uw`I62r#6y*KIluf$zS#NYr_nEU{4z(rWbljNDHvSBFO%d;H-0%Qnx{X% zl*^Y)eo2ph`KlaW&XF(O`DJwUi<5aY`O?GRGdN%#Q%0b$1R}lsSy=i00|EaOKyLv& zNx(Y-I8gwN1Z)#P9|1@iFABgRfCrd@cX0(GeFbm_0S^nHp8&2WV37cF1>hlIjsQ*) zz;6hcB7l>L=$?^yzf#_NN`g%UR0tqT0520zB7kfGJV(G80ysece~px6W=rwCvd0q+T*zW`bZ*dc%c0(gahmj!UD0G=m+f%bvOKmn{E;CBMZ z6TssH{6YYy`MZPYzXc#XFAzCh-j?$1XMxBW@^&BJ>L7pQEst-P2O?+syH5!Yc)^7? zcOY_>y#0x97X>0`%iC}HRuG63$lEXYc5)zcj=bH$x2!;9kpCi-G8=Cge}nnMSW$Nq z$NmoJ8mA!c;(2N|N)8}$0o$CYVMw|U@G15|7DMnUs%|KG6dRuqN;5BI6>sUsig&Mx zL!^@T-Cy$xZ7MgdGH3MVIOz&Q>P$H&h_g_GKD0tEL1#+6Nk1H?0j2+uu@KLbh~67B#&o_@$spQPgJKhQgt>^Jv<*?t>P%$=m+pNOf7O~i+N2P&OP}X zkmnhle`U(aYSn`GG(aHcP@&sHKjk8%lA}oJ{DdA_DjKL9da+U5eu$G~emVswAT2x^ z*LiTjZ>fJG%98jBSTL{2_odIGM)YQ(&Pevc4LF6V&O5m+RxI|wTWK>@S-9C(1t;Rr zsffb{VECG9{X^`S#@X1LMruu2MI%eI@^Dq}#hQ;hmM_JIY1Q1wCQzv;{8~Z@Yk>l6 zg_A6x=_>mZz{pHbv$?(;b;e?=g(=^y_$Jy9aOJc^JHO|Ta6B;B@hAfJ;V;gt*4q#e z9@Zj`zpf(TcDiZ3fundxfO4xAK>N-!j>29i&pNq~2s6fqXpz8%B4JzB2kwBW!qZQ4 zVw-L)4r#BzCQD9zhl?W>#d1ujldLcbtbhJ|WeH!@$odAp&tpyCi@|ON&A1D{cH6M20cFK=24mHw zG~$KQqW)+cWry`90NX>T6X)lJZC;&+N4eog-31U$yON5sop+Tp=J6678&7X^*_OLb z^Gtpf!8_@LDlSgX_hnU0UW@w>D@)UJ{ppdl;eANr?@2?>_BDx#z4U9tf3p}zYMn*I z5xkhpPS*gA$XaYe;IVM^z~Q*Z!gbAGr$62$e~tU=arvwHc>JYrfZPEW&v03Mw8@#t zFgcua1!O%qZyZ9$6PlV?rB$@!Ao6B&DJxi)8*yy^3++|j#{+qQ$Ra1Q$QeQG9|jEJ zl=Y8AOhg<9fh9H1w6BweCdlvca-9>_=BxFCa&A4HH&G(qil#w4=X!%v^FY1j7WHOe z9{HtIQJXIZ*mIf0BA_h0Kw!WLN3dJ}!lcO~LhltKXK~WG*6<8I>+2uZ4;BBb@L%;x zi#@+l5*@f5^;#EAr#uioq!y?HnVL&cLCCFaI}aqLm*7hi#O6svi|{Rz-V+7K^35bPTcGB0u7={{zx^(E~Gh zF0qm->KsHU16&uzT}Wn^o6n~G5sOD9r$fwAUhn=xm*Xk&=eY62<*2#9dJ&k9&ol6# zmy*ta+Y|zE2&*Z(VFd zA=`5W<;x10y?MBroHK=~lx-`(!6}>~j2(!`aAS&ZV`oMXyv>zCb!>%Oe?p0SGrqw( zZ<|7%eacR8!Z#0^%aN`q81AKrLkBG&kKqsdz&8fxPWv)`Zp>bQ){waT#j`ZnCW{YrPAB{(UYGcf9_t z<&fX*D%_9r?2rR{WNN5Z`qOZl|77gG;4*G;AMiKE{UVf&B?1v#kh#|F6zL>!s5W{K zS`qmA!4{rD!}}XzBubt?xA{G~aIz zU7H%d4r>#s{tQ>>>eTRfJg3QXT6h$mZN5w3?EMBV`wwVm!Z&PpYnAWgOS(T@|00}+ zCp**M_HDQio-^e6yKp9+yCJaZOWb9E0FuDbZrVZv1q8mz&>G&u!z*Dv;X= z`Gr7igyb4G6EasI>HbNCTtSGkY|V1Y0YUxYOQPjmU_#ENb3w`(XhLAa!KuJ4 zXw)|_nbsk&1Y$)vp<2f!B35@^_+OMNS_4mNA^wJ}o{YD7wz7!d+E`ZN{>dkUY?^OWQdHS+TiK7Uu{cE14Ao49r@kudhO!N8x(x z^ujsPvj$<3tqS!yMY6aHaW~6$#kmoO@yFQqJ1n+*2{+DvW^+$4Sl76-7x@+lV6EUi zK;5ZQenw_S7!va>rM#dw0U zVPv#&B~+_F*6v3vxLuj7^~b_~L?fs9?yf)fzIyW4AG>Yl_4UW@o>R-9aHuU;rQ)h5 zSliWk#;e#biWS{Sd04u=d-mDQJhctcz^*~-(ORvkrLfI2d2O(|6x7ef!MD{d?Wd!9 z9RMirQ5X+Hu0M8Q=FRoT{xRnU)-s8;um&|>8MplCdS1ZLK{sF>GqL{10Ixr$`LWgD zs?_?g7R&OPHj?9lC^YRmR9tEtc_s}COE%&f>U*vyfh zlw(6&j&#X!p;Tu0&j*41gRtK0Khta&PAJBzO^UH3E{|RE(5+N|ETT0Y#dob~Tx$KX zGuaavKJ=BtKbV*nuqZ*7sG3Dpm_>PQxX^D>OM5f&*B`r4ISlHL)oJ%oB-J0gSzGuB z9Op8a^41 z=)aWkz~MLHu^S)z44;BW`c%T*hu`dXtg++KSlUi;bwvvgg+=jXRg8farAJ|YF~!Hr zk8z1ixe>sq5ywjacyx3?2Bu$nuakLR-(r+*AUF4naq~hUW0<^+{Ui+jiE=b}`?i_W z$k9{CYuDrAq8LX<;DC*B^f_@HZLu>%9(Xw!35%yY`$pdW8F~8_)(1Omd^~T5{+l(L z+}$}kWbwIL(|BR=pOayW$T--iH9p4TC!*#Uizl~;tbU=HGd(HiKJ0F_a^hUOqzZcWF&yl34#jwxEbbN;BeEe>95pOs**P*kF}) zKn6qLG3kE{0miAx5TL#%Ltr5u5~%X+(`l%@Jk=To|C>YLS05z}f$A1>^e#lLWbzL9 ztNT13g4JMYP+jUz*um!A@MmKD(9(IPFFPNiO8uB zuEM+AcL4vvPGjgRq{LpaeGWpDIFD>hm54(qYyV!wXy_wg@Q7A%2w&1MA`iONvlG}o zi8GqvD8-k0Ko4jyeArWKf&s8q8)-xwPyAlYp|MD~013sHxkSM(2F!24<|)`&fZb%l zrV7k|61YrjtRh|w;72DO5I|psA0!@bB`#Bmb0jftf@d1sSIjj1tu+1O(lh|bG+*Ec zX}^YUa93ArLIdNUt zkSSdm0!+GcB_32)-UFnj1V;P|fE2Cq236H0Rn=^(*h#8bsCe0<`Mr~`lrvbJccuOkPxH&&=(VYQNkP$8Lo z-w~69E0+lg(G{?jxl)ESi&dI6R+`0N9<*R}X4-FQ@qv#l zxJT6k{s3EWrObWthgxHvs_+z5;Y2I(DXQSNQGmySbyKjD0V}m&U;Ivx@5`R|b!UkU zJ1~8r37heQl)bH#n75twT{9zOR69s?Ef-f-P4h7$0!EZ6) zgA}~Uf?sBp!*I5c<1q_9%!GRs{C*35nhAebk$S!b?{30hR`8!$@Wa2gy6-csk>{46 z?b}5#JH}dRwwq}xI5cTxAFc?hBS>T&HqQ;yT?aaT#x^o%aU+e zmfK1Yf>DElsH6fF4ACqkvVldgqN1XrSj1{8LRPS#E+)~e53AHmwf)d~uUPd{+bZBa z5lm1N@InRg0*d;?6~!BZ3j2GXGtaZT34z+aKHoonX!d!YGc#w-oS8W@bLPyMu5O$< z69>!R?bW|xbAhesz_;HxjGXBNl1cRh0>=~hjvF{$1FJs-_KFKTUSa;)8HNKZT=*d= zL{QSe*10jRX|0DUN~t+AmdE?-U!>N@>TIy=*+m#6S;subBPH$8l>2KrmdfVSc4!gd z9{1fgAftcH&839#Kopqvulsm0!XN^r$o2D%klj4r`I(7En?&Q?M88QTDkqV3%$0nn zMfyc6(jxss#9%9tjxb+$V4?onR|gX6>+X~mQY}LL5hAKkf7-xAsNe0v9yBl!>Wf|2 ztqMD^P`}uXJi|n8PpFS|Bi}A;v7Jzd)%mB-=Sp_p}ylwr)=*lEFwbv zmBTaY@o(8$k1K#_J#Oa3)Z?RMh)^#qZbzu!!RKKdsiy#Bh9!>j?EnT=*Q5&jE#cjT`x7gII+692a(+fr(I`?!x*Tr27}@ zWp2!GZkJ-Fg!&*C{*D88gnAzrzRH0+Lfz}aA93K0Q2+J|hefwJa7URzKJVtcA z>cTH_;Eqs#)`f>1xFggba^b@qxFgj6;KKVUJVH;}N2p)r#@Th7sp58o`dMzAH&b!; z5$Yq|IFFe)t%Q1!8+fY|m?_lr+`ua}P=)$;pF148P+=*d{-FyWmqPTP2zAjBn;O z(OEzKVLrO($D`)MXIur>?Cz@22MyG(ANQJ%Zu;>j^U+;D?ld1g^y60Z(NjNeG9SJ4 zBW6AV`cZ2>dh5rv=A%GAerrDZ=tsnS927YjHWl!}qmOwUY#x2hqn~*cnn!>0IMO^y z%;U9w`5wn>ue*9O`%T95i!FnbkU(MzP%b7MvKgvwYX^j^@kRESzlb4!XSMW?o;SDZXeWLx%1A4hj*HEl9 zHlH>yAESZ!-4f&_h&hYJzveN>Sw`>XF$K<3HThtzSy_~L$mCc=X1<%q%)UpjEGWE@ zcgc3TldXDd9E}ITr1)+eUm#TU;Xd@=ajcK;ZuTXR!rh#dPB#WR+f!Nr7Oup1iYM`R zlU)fbeBY6h-Em|WE&Cr{JrQv^^0QiWJk|Y&;+DvFEbsUwzeVkvEnjc_93-C&I5o-V zlSfDM=)|Mmd!|qwE2|XmKG5Nq2s!m5N`Ad>r%3F7`pO8%MzC5XE}|HWUr$iCLZFyG zvy!xL|A9(~2mTD0*+H|nkry*E-bw?H|67tKZp#xKo_b<7px#S+)6=+nSL{--|4 z=Q3{pQ^|aC-gU5K;uszEl#InXgni-OhKQ03BJ7@qf_^RqC#5Lpt|`|rfx#I_;0KBm zD;r5DesWC+`!teyioAjCkk?OQD5GM-yB#W}#H^^v`&1FmYnr_u9L20pnvNP;rCWPy zf7RJfX9nthyEiO%T)R-no?1v01>Z|b4KI{p zrwVZK&HM8A9ALDR9~T;ndd_T1FOXBOQ%uVz0 zbGiH=9{8@0!^eXOH+=kz1XkH$e5cu11dLYGs+sl@#I2j@spOq%rk6>$(@bZ{d)yZz zH@C0Yml+BoE(Le;Vkr2PrgWR>WZ4TDI_72~u`y+_N+*=&xMAG`pHDo|m)z%Ys=!&Zx>qt^>>mnC$|) zIlv--IWDjqpvZ?$^MK|GRKFyyzH|qip91%A!94+cQ{Y}MH~_d~3Ve_Y?hUv@3S8iV z`vC5g0w3&x`vT5Of&01OLcpC<;QoN~LJMDp4N)8@rdzcL={zY*D-q^+*X!E~;sKR>o=^d(_x@6=H&6y&b=rBfnd# zk58_yK8(L^$<>i!>${zedDTa>JV?v4zAdj^TYWIsqKY~5bJ7+C&=G)`GY{Q~X0~)h z;Hm{3@aq{ryK~~$Xqm+ax3xYk4L{MJao72l7N6)EEqhqMpM6@Iy0x;#?p)oQth?~n zo$Md5_9Qw!FBxIjhN*`4m|h|S2C?g{z%`~|S@yy#gazthm28kjY7ds9W1fm!AC)m=); z>o4naw21V9c0Wu}oRMU`{rnqTzhS+}@unwu3t_<_ntsls9p8-;XvcFhZNc%q1YH5H zs!xd(A0LJ$b=e}^kYQki3!3H~`I>jj!MXT?YSO#HRG=O@kFAQ8IQ_;em z^Yrl@4>e8Wnu(g-T_R((CE4~XVxGi|BR;N6sOH13?TcTN*7Sx6J)4iAo145XBoub*PjipyISGu8X0GDo|MMbHMH=K`_-?wwb7;6>Fc+Q}PfkIr z$%sLWD%oqQh|kEX9zpLtoIjC)1FX+?zK~aaWXnJ4C_(G9^4bk51jUWEc5VTP5WE$@ z(CutUm5nH@o{JF7ds?OeA_i;u%oKySIp3}rykEbcRxv0ui0oJ&BMl26!pC0^2w4)e zzDaacxr;d5NgKSfTSm_~>kDmz7Xs5ZSjUU$8E4i>i}J0I5JVaFd)Tpsrmv-wJbooD z$oev9HHR8M77^A|aS#$rgm7p6`cSNAC`0fW%H~OQ66tkNpDf&JBE^c3VwZIpSW$mb z7rZOdK$~l|XKe9jP_^=NrRo)6O4S#<7^)hHO%p#<1R(y}IZ+Nh_nUaku{uF*GVr*d z6x?%o!B$^Pa@W~=UzXNl4EJEe7ZK?O6{Y2W22tPflTU4_qiN?cUN4NG^!ykl6$+a+S-sO%PnLi2J7=VqPL^?;W-Nn{l;Uthq z|9n-C(f)Be)YWWfy8gw?`oeARjRgc{}am0i=EmX*aB zf+HR{AF!@(uH(fpd$J_3hCd-8srAhb*R_#;tSRRMBd=9m1hXrbzvkQta90ApFYj^R zE~UqjfSW(lthWKvdd^E_y@}YFa=B5W#0onRAsKj6(Ne#+Do$4hZeQ4jGGc5624zR3 zDN6<_HMtorsuY9o!c3|v4OOSOR9(S~VaOPhu`^a2qcjcwJrDfFn;_2rkfXyb@;|E` znkE>Ue&1QRRbTk$IUPJYcor_;jY3|{1HZd4!7s*s=2n<6FDe)5@)bO*2H|jjoQbaSlmZKAZ7X|81YEP-t^{X4KWnQ|OlGd)N%t^fC#{<7UnWrb-N zZ-%psRXTKl25`VD=E%+#>@zX&&8c(i1;zwk2;QiH*7MF(f_t1aHq z$>YKBc^p!)I4Ex+`57%gex4{e7}-^dDl|U))U&*v#ZeB|c>Hyj9f5ogTuK7st|l(`IbDNi)3QoHp6c#T z>0BZ1dsNWO0}X6_O=Ku?V;BW}QQoaUlRV#@8S zN-nEwcIEqTxMhG$C>GUu5?P+AoL7@uQAd7%4jKFFMo2liABM=Gm^08}x1yhgZxKga z!rvxL6Gh;23sf}71&ac6b%B2aj7qn_q7)@2yX9j5Y1P@d>zeK zMQr%b6zIEN1d!-mgDXUp%g~ZbfPGgTeb_2&AW5`rvLcKyzp&4gOEh}S&++6m=ovf5 zKwVasTv+oG!J+uAo+2UIH;2T?ZzVj^$^P*H41uU2-V-3!i~|$n&Z#l(yMh#kMG9F+tVC}reSB7=o3t&74D0M- zxhTRa^D35PmxztUF;Rcjw#|b zuCE+M@mdDh&GP<|H|~kU?}NS+5O}2t9LQ^pc}2nNon>A}Sl*vY%(3~vDioH-+u8ay z78&auYhDYa`+5>r!rfzp(wdR9VE4Yjn#OVgL^xRC{UTQg3<`mt=_}&g`>6p!;40o? z!F5h6RJ;3vs9J>zHe1&eq3!V#fnZ!xd(uWh%OIYRqm z7F)r*?b@@~pW=T?}` z?K!~h<@WvYn%ilTTOV?ROa4xR;ibqSTI=G^&a|;)z*%f!- zMIoI0h_p(423_O@ryypD5EBzV-m7mxsh6A0Yr(z};n#+krpa^(%lln+x+JHO#^KvL zfZHociAfwIam&O*r6k^GGca^dW4L!e7(V~G@?xyXeknziYQxCU_a-UY6JgJo6ai8o z_O6r^mTw)BSs8QCV#|9ADMtqLt2-%^q^Tt=@6`tAuY0fvI-9dt>Ln{;S8%cD6^vO| zbZfa;;MVZCV8X?W^x_h^;V5+`nDzKvsf!)d#l^(Zju%dKJlWS-YoEt04Ki#&&554s zZc<+hn`HY(z9V15pdYiyAl8Am@Ad8Ee3^OsKH?)8$Rh_C+XjlH;uI%0)y0FD$NHKy zc$N|%M(gaRW@D93REdV4#9;hX2*3^DWQ}7?0Y?)j6vM}V?Bs%E;NUB@DIvooDJM^4 z=wcO)KSl(L;Orss<7P}t240U4fBHs*(~O#Drb^_g)d%T)0^O2paODp)tk6gTS9*wc zPxZLCSbB1(d69-7LN`njQT!mNn4;mo%9ksp&hb3~98vsd9*mFn&iiE}q3{zAH;Tmy zm&!O%Q}&qPj0|mqGah(yeGWKJ6Y?zIA|ll_g!~o0zmk~S=;i}(liX&=h~G4jlHo5% zk~rnFKYT(;kC(_(iu3}*=>)1kjtZQy>=p;0cdd|W3*(`E^%iV(VfzUANnhCvHzin& zuEncZIDWlkY3@#mDdP)ok+GTC64(Cil{w2KJ$Nivtk)#V{c$)N&!+gr=I@n?0uI|`PVkP z?qt_8K;l^57Yzn(+QT0(?@)XQN&mW^r2jf@Z!&1@G;Fd8&y?X`$fClZCW(CzcNv)D z8~)l|WGxlfs-8A*IYKyogH*y#s4i1aTdQdv;w%7TiI{-*NW#&mwtF3+e7V* z9D`$CHP5ao#Q^APiR^4g5n@v{Es9d zucLYGXI{&B?JlondyuW3>IqC)IzSTs)A;3Fd)+`VQTRcOf%U#kL}KLZx1aHK>JVk* z6Je_2a~UAwzDw5Ra97cF9ObaQ!{L;p`uW8b(hiu8a(7>IZE-mT=*EB2F1qoqqtOiF zSnI)2CO9sup;MwQo1(#iEN~HYf&`taL4}`xpXUjeF3}kN+Q~3N{BO=9{!)}+6?{wR zG`{_{!|B^gxrgHz>El3WDzv}E&GpxbpAUh~;#r-)G~ZwQFH)1;cQ2FOg$u>@V)=y> z&|fPXQ1I;aPVlU@c(R~*YD@m?&i?CaX)0TTwZ%5ASDrhZr-(24rp0oSt-Oe}O}=1e#F41>)AO=DMqPc+ z6C#W^I+|*!g|2qtQv!1|>D~Bf@@~C=Qc=S%@Z_9YT<$KzFi*pj!_=W826v@VB53|9xTTxli|UiP;>|n z(EJ;9Q$JLLDF*oYX!16YR7!piPagO35C({fyG8bxV8ExVVZgc93Ik?KY=5onXv2V4 z^M4`(?*EN4U;wFw0n#MfWk8psl>xu3`cE0K^85@2EW6TWz>Ul+wrtQ|-}NiB8Sl9#AcESr)%< zU(2*3Xxj5$G*2QpDc{FZaQb&tpE#S88xKpp3wGvtsxP$b?qCASusRErL74In5%&Jt z?#@kuzmN{ux%=Cc>^$f)k)0bI zv6#}8~P7+6{yF-1IBajmgGxQ239kwS(CXuqC<3WK!N zM%u8d5V!U}5+d#fMD$pb@x}p6WzEDb;+c1ujE4T&y%Oqs$7{;IjW5dn5n=Vd+xeyJ z8+o)>_5u!tFq~g;GG+fO=^&^agpcwHLFK4XN_dqe2cD*;QYsrzFF_Nli)411$gA zivJ!4?WLe?xv)DGX}!l3c9Ip?3eh-Q#p=rUF|RCxz5|7$AE~k$LW5b!bLH1a&M)Cp zqK2El-d^yDqzz5~K@`BFqt6W4F$_JUziu)U1lMzIi1*g49cSG(WET-(?VINar@GEG z4a=~0Dhy3=)xCS6c8F(qKKB`_M%cU^1X*KbF@`Eq!)3SBbp1a7CFEofMPD0 zFG~j2qg=UAJ0u^V_&c~0R%tb!Vl8T$)ez0zvlgx*B+JjF?u!Lu1>3%9piEEhv88ZrW;!Yr3BUEx@#(! z5```zGo8_-DCX1tJKGo(^Azj;A?1o;kwy~>Xy3Tf+94$XTjW%>ya#6N;Y)Hqic~#)zm_YnDq~X`GK=!n}rSJ|J@ayHkbBp*&!mmRlAmj=q zcD9gPx})Vj4atx6PKDTFd04t5a&e0s9j@8kG14m)_KFFcJ3cY1W_PEIfPb2RImac= z#5yD+;EyI?b{||dU}G>cg=(RL>d0X7O{4Zs9M-l|UR}&Gi=LFouij+hAgERc>G?+` zU*q*zc|D|UsxXIj!K9CtU8&K#b3RJdWgVc~zGu8Bjl91Y z=H;XoW}ULpLcd=ME%pP{L$qx786C(ZEPgL)%C?@wB8l~+^`1E7a@WToXe2<>cD8>* zvT$r@DA~;3B8f^pk@pxm?jlB$_hG>X!QC_XP{_NpG~KzqeLi$D<(LkRmb00)R35h( zcNzHL-UL4Jx_v4*eS(w5QV;R006rzi_!|mY*%BM$ZXM{tj`o*8VU+#>A?c#ARq5TtMP)4tIg@u=Ox?KbuW z_pwbYQ!*os_q*gm`u?1(GW!sH&*@`ysA)2(K;v!h*GayW=+m|--cUqS677l}V@3S= z>mGxPY2pUZJ{EpP{rT&}r^Y^{F1z<9lWJY~?@6sG>t!-~f_`xz!q*<+5*|~z?QM_n z)rmZr3S2^reF)!k&rc@&^$UIq;pdplWD0p8!UHM7*Ao+GK>oV!(3j@;a5(Mp`TG=P*iSD=$DdS?TgWFray%LTjyE!%Eg2tqphA`RcWUD&w%X{l zf6q}i4F=6oK{vY8>seS9`rh=^NR_N>PH?`Ua(qi#`Yz|)kvb*3%D=Wv{CM2JrCLEjBo>&cJzS8s~-k!MV4e zQgx=_JOvEyoY?p3smzIAx~3TOg4cOv7XBe9WdCGjH!}-1_q?`03(m=y1%HPu+wUxR z?Ial|^UwXyXTi5=%C6_NngyRvUi-{~$2mZEwx_e;;Q)W?EO?M+^-qYDS#S~q8Kms6 zUAZEnpZFvtqF*P%0cODog8!RYaC&Wt+Srf4DtoMEsu9fus6= zH~0NMEUm8kY?;G$a#A8MH-DIxb~kKG$;$@7?Mb_f3be4#4o5OQuA{Q|p$rU_X$&{* z2g6|o!+gOo8w_P}5tOw@$?Hw}x`m9(u!{ludwFHgO#~|M2-K5Irc*OAUC+BC=7amm z^wHi*b_dB+)_oMbM+OF=)xq%H2kjU9QiEX?vuM355e%z|8e&E*<`dyGhDY~~usBZ#iZ zKvb7TbjE%VU1$(JJyaBx-r|hJp>*Po`$;^&B)*2kiLv-V|H{w-qOZ56nfV3pPH|TA zD*xJ!+wTOF8^b{qExT5R(dy&uvD|!B+YlLq&CfOl06Cpn7_#(WYC!i{-aC`Apk`%} z0Y(yx6giM!1?tGg^39ig10AR6h*B5Z#M)>9rgjm`sbn6^g5z{zP}_TX*j3Z8W-G=A zSd;g!TGD(E-utAdj>QC=6;8RaoK3OA_&<@8S4GEd zmf}?Z0>X}0!ZxwL24S6C!W!ip!un8@^-q3JT{n4u{7BXoatFX>$gYLhKLGLgZ*LH_ zE$6!raMh6#;T%0)_*pkr-*ksZ-k}oYv@APb3MuOWLcCIo)0HDs2Ik4d;T&uv`ujr9 zLCUtTg*t0Ykv4NoB0de(U|6enWoEADE3C0t)TnLx-?e;La z)veFz3=`Go5v2Zv|R29)p8W}V?dF9%z<_7$AzwaoHP-?#>prvs|1WG=x>HG>a3r>ryQj3 zUCeFNayMIvFm2%~VYO?*TYj2z1uW*cdWwa8;LWKjm`0Nhi=$+n&5JL8|FTbI>v59k zl2?cpRJ_%GY1chV4#3M5VnQm1ZnuA}aLzSIUy$hbIRX)TgeDOdV#9L9snX62PO4&{ z8fu`|FT!zW7WYmV>x;p^kou()jdr3-R_#Q`2dTJ+{!wCy_xqk29SYis+hpRdCkkqY z^-{<>=CN#6gF75o7wd+u3I2)~vHQZQ&IVpz6*K06VuWQMt)*atPZGoGAJ3+E3s(s% zoeOJQiIZ30w^%+mXfp3}n^LS6K}+?~2A~@SGtZiJ$@1ekr-LDkjG6M!U-3TWD3MnT z0{yj}h{o0D;aK2lV$=to;Fpg-o5x+|vD7>sGLOIVkY-!nLcZ|eMfFnYuWYQ_jF;C9*n!>JZSSeU{Mis&eDo#Ab;_K?n*rWGVjhUd1;5xwJ%k7 z9QslyIiM5*v{<|k;oV7~=g&nxPNOulq%@&;;lwc=JkN^;ZN_56&CHtl{c<9wN9XU# zicAbyJ=smUel+_w@PZovq^^>ICr%NOqE|1v_t?!oJZz1@Bvay_L44tz+;F#>;RePf z1C0}D!Z`b1qNZDj(rI+s6g@?Z;mw;;tG#U!Iqvgq7KnRvW0$?1jeBJH&bNg*ocHTP zxH-C!kOWrYn*h>BNBRS#7Sbo+>2EzWqSqoXD19W@LA_ALygg*5VRXqFD|K$t)N9lgG4`c64uW`+B66Me7l69jDxIO9S8Ucq>7=L!aioEO5S z4gQ)dfTO1BMs`_|E=?8vi_kI#-e$a#q!986uT`Zl`>zvA%c^*8_Yjkk8^kcBqICEl z39R;ND&v*4Qf_$JAi`_N1lc>^1$Q4MQfPo@2i#;tl$i#{di!^)$hoY4ukc_yoO8^j z#CTFl6)tTF`^UC~RBVa(oFLa7a9_iEDEamzSp=;MOZEC|A4Y0$J4)U5YYMBZbwO(b zr}jBopWoP==YOtY=&le7}-0BtJMK?Mh9% z(M>DOxkOuXP+cS|DS=mIShIXHl$>%Ur}{YDmF10E8Sw@m&q@@I8X7q?7`-;DA#$*| z66ZC0r5In}D7IpY+ccz!duSt2&%6~hr9V)^<#cR+Z8LGB3#bc!-7}J`ba)Aw8qd7A z*7nzl5Tn{I0qUuq`sCq!+P_4xPZK^?$qNkOVc_rnKAF^W-E#9qJaEv1+RJ)BfOW*^ z>lwh;*_W7#3vqRKR~*K*IpZuZcsLsL(`_|B}Up$DXj3;_cNN~5#r$A zzs$6IIsYk2{DhCBUD8RZt2Yw4*5v-ZwMy zl0ay3>5&6KV`La6?KwRg%Y3Y;u!&HPYV>#Dy_N`0Eks`%#Ovl01wFcLIaT zkx(hZv^@BvZo67k6i;%da4Y&~3+rWBP-LGF(`}{?8GksJ#Z0bzSr+?4thP#bFKCb}Dg-NTORMqX8rXKfwxA97 za-pj>Yy0~eVMX9W6CnPVoq(+bBnDE0$B)t)gcU#MZRqRCz(IyHhd7@@^ply2kk8mR z_ZMcZCDp}Ri)&8juxQaMPIdgyNw+p4{HSwbQ`j0XS%**W=?oOnvNQO=>q({eL>V_? z-aNjCCP$XN|4yFgni=%8PkAx>PgYMcf=?evs18Y;?T~r-kP54_b=r@ioIo=jQ{+Lp z$^*Ho)$&a*m8MumbfV^lVspN6m{xWb$QL|_rZ+05e`PET>cET{JAArTtJ-%P76$f^ zYlU@%Q}A{m8b9_{&1p$-D7q#xmX6T zkZui$iQW{tNl9>OYBIqXrf4&7q1vI1+`DaEs*7yV#x=Qk%Fx#*Si8a$Xd3>nIAl0W zn(QpQ>K_~<d6$V4;~4yU_GB3uwurYWe{C5s>Bp=H zwgV?+Hdyrf2thTlf?H5HL1$(Yr;U}A=Khn-w2SzexgtT}DLqo;Nir~kC=wgXbGp_t zB7qXan#n+LUjh1TXOchHnJi-7^QAem zD5~TJA}E)#uVHhqD9he3K;3;E9GX66lz(}+pkPMntJU5arE4R3{^b<~2PHV##861a z^k(0jTz738D3%708@F~zbXd4mrxwB&!rRaAxBq#D zqfCam(xaP@U@sPxmfgqX&A;eXnRlUw2!-iR)8t}`DPd_)oR|+<|H3bQI9B!={hvng z0uOt_IeXcsZ{ihBo2DcZRhkx;*Cc30nThTGL{AJ7IWbvow4iq)bdrIw6{*1`#A=*? zWS|t7xQSg&vB6$n|$SLUN6B<`Q@c7c9VQf9)-jvn+vsGun(_?JZK>_3s!bii*#-Y|aTwJ3w9I z9mqJPIhZ~{Kk4c9*e}e)UB%U?=|pl5cnismpVq=+UU0MLPN0&3HDv8d-sHcKyju-d zlzzA}I1I51S4jco0x_dMqhNNnA>daK@Zjzw^2_u`6=GE1X1w^=CkhR_R~j1b0sA$_ zLc`s>xb_vTXgMi^mN_X}5Q?Hla&EF}t)5f)i|e{n4P5qe+Zx!1{hJ<` zm+%*q9to#)qwmiMm;Pz|sia(gFZ^t=3;~w+kfv1giVB1qN3lev#}2Psix`zV1BWpO z!^=!~)u| zXQr#%f4YB2Iync^BG$)G$`ngWD}IEev{_@UB`3x>r_8E<5C2zbVR~iqdHX{+l;Y zF6$6QFap(V1e<%738SqABZlGUbzg*TtzHc})$oLiXW}Q7h-`gC#>8`rIcFR6FVF4T zxFtJuXV9u(*D~ki{Fdv<2)m6FTJuhC^d!SmtcnqafyJ#5OMDO?x_`t8l2Lc;Z?Kl* zC74{*(i_bPSG^v@Ul0E9p`~Y?Th^h|kafqRV(nFoDoxywE}MhW?+$n!tjMoc{h8u; z>>G}N3nE?i?e8jmF5Z8*%8Rl44_E1Pq=XyklOexU-gqVdyw>Tl(KjN8nh}|!aXw@< zuwVI=mQRRkkG(t{SLY9G(X5!nT~+oe$cE71Er_Pt#*}C(Cj?)pvR_f80|UCTB9UJ$ zs<{#hKuWDIrt`7bzCs3$5;huS*pq36-FzQt*{T}hvEG*%CD+BJ=V$0aYc)DrN+O5E z0pTeI6BqFrOt_Uz2L3QY8_DrpbSV?c1@DwF>Q=l{5_#HGw$e#uZ{qNc%(J6HH`68_ z;_WXqodsIOs*=PTnG(Kjean2tzM~jkA}ZNsG_{^i(KdcZiGQ)gZ@+yoZ(_Z-|8ULk z$o+@2yG{KQ&bbW9p>6(h49WgPOr6`$zl(%7XN0Hbi?WL5oa^(cdX_ymbqDvh3>fJh zwT}0~Pb#9-Oy-+=0CKxRaevxM~`Y^psKBHya+}FF9lUje>@GG2XZc)-5Wb0CJ zgq9k|4Xj30_0dNtC9djNhc?7dGrkiFBp#?%3o22Od%jVbF3wjwH&)uX7O`nKzrD9~kQ!*7n{{d`9 z=?m3kMX3?#YCS%3v2Z4*dSprBL|vJ)R<&+Z*28E!I$p*;oT9K709e>aIqXXSx5%Ui z1W{n5AEx(93p1a2lCHH&?>*u6Q-Qqw)ZQdh^!hBJNK^^T!>WJbP`=h#hOV_&_EbH| z$k6nYMf*~MlEu(16pI3;DN?A4m-ys-R5PlH=@QRU>dEyLBD`%ymIq zsqTG}NhUMx)7*q|oNt!XTqJ0oJ%S+oJ>E}ZVbm1aFllfwwP{;Eq9#T#{!oJ<>827- zJI~PLbTI6PD=L9ySNBkGF<_kan*?qfHmWJRAq27^CagS-3}w>CKT~Al*UBI>I;OV( zAJ@?Oa??3!YbU(iiasT!yLgOi9v#~kk>#?|XeH>2mWWK>jQ<;1WS&qWBAS7~mCqar zlx;sOCba%!BXK8jTB~!Wo&XM`tI!3Z`0UR7=h%Zl)HEf*+c!;=QCK`u{1_qDCN4yF zRTr6-AoKr6h(rowy+{!lOMW-R5Zay^!x>0UfzHaI7!#nnkSWZF3Dzst8aYBYLdec1k@h#vPn*bw-xcp6y#X*{?|JMEDURx(tD` za|Ziy!PyNel7U{pb+e9Yk(~u=gT3kGy=VvjUFF`_=K#!G)^8u?tvp`Jl~K8C?Z*@Z z#mT^*j-|~}&&nd^AitC#G$GK~x}IC+AK6NOk>>Ye<*v8yvJ}6gK*SnK?5E_$M>go0 ziY?OpJ(uO|Wq)bUy;Eol7f(wu{Fed|mG6t%HtD|ekCt9x61zQE`)@0&r{Tv)Ip{=T zjSk9o;yRtEBXPwY1}+NNOS!0c5{)t>05JoTI++HbJY;dOTZ)D-oF!dcny>(O0Avq( ztpHfe;fVr(r598W6f9f#)Mh@2BB0=J5dI2FM0f7}x$;+d)|$UM9dS&|9IuZKV_$f@ z4P&1%gwmj8#Wb{`f*YNMiNeweqK5cXr8wkK!EX*WLS@=h$3l+%t<1S-4bxnf`j;25 zuROG2Ml28iQW`n1^oBIcXT%P{pS8kG9iZ<_2CjFp>eoEJWZ(8@mDZ|M10PC7gekf3 zFl@a@8?Qn&{OuSSl_LxsEi>su5<#m0u9pj4+y(!N4CVOi!1D-;ut8;VeRHJKiY)N7 zppWyE$(gC@yfQJ<2JRI&&0bF6Q)xPDS_>ieU+F0Jw@4GzxeO4d7TG^xVP>yIzf~p& z^Ffd&2sZN`eMalns zp~J3i)e19(n1rHQj9J#$#|QT&S9mC2W)r+lQ!UYEOIO#Xs7A%w zAXkz-l$6V?j*KTI1IIxFxr?n+xoe_%1h5qyK%98M85CL1%^cbw!c0=p{zLqg%O>s! zfvAPcK#bs~*5#Pq@if~ai0+xru$tNa8B}K}(cY%Nr`rBBAXW>ul2Z0^wu{2n2Xb!! z1K(xECGc|~1_ANY**78B_LZ4-PNOoCn07v+A~sNMC>n^0uoi#SZm>4<#}sbjYs0=v z0V3L^(f^LG^q>~D*5c^7UMw5B_0pz#xM`|++Ef$gwrZz&+Dylgc}g$hSRru_Y9(hQaquaIv? zcAsl1Gd*Kz=}aF6kIV&6Gx}{kDuNwSP=sWJieLK|n zgEz#?y3sxfP1AiNT)sS>K94@P5D-xZdEw@!DBcIh*8E@`5TEB;PPJ*q@hV zdlDCt^jS&T#qMvCKFF6up6DM45kY@-39Lk5h|TWh5MgyL z)#U5=4`YY0o_1q@wpeO8@a^BFfLv5nK%g;z{FD^9X?jCqH%zcT!Jf^3)1x4)vW68` z)vU@7m%cZ9W+;A*H(dJu-1AK~x06UOSmzv@<|uj3OXnRY9~tyD?^!1AtK7Vo@M7}* zjmi5=&6|AYEJ-#5OJ7`2n;4=i_G42Rb;p6}LhXQ*w3_Kkt9igeR%MZFunQOK*0IwD zi?=)>Ee$~{Yx-%rMA8{09E_j}H>Pu{$6H$rhGy@>B#?i4H^V@)>3!}>77jJ5QeSC# zI8df3B}^4wke*PYTa5NLvB4pF>(vDMSS!%-tdPTO(DxQ^p~0`E`;H6>-+dZt{GN{U zg6TNxS^3s9R)j}Zt-=BQRnKrmOB7EhJ%TK6Y8qz+(X*AlFnbH@7OpK){4vEJ_^lw% z=#{U7T(aE8``i^&|lgxYn)ZlEu=+({y_%+!T*Q&t8&~cf!y&S z6u+$aNkrEcssYjUz{8H{sysdvJN-dc-?7TOxc?v&o3Pwi4ozsbyWJ$>%D3r*Tpr%H zd02tT&*jpbWo{aa+|gWVF~jr3D(?%$D*wh^}VtM|ZbG%4&9bBTS4V%R?h0cSQP&`_>^ea%5W%8A;aK7qHGmu+>H3@!{UYItnRP)7+!wJH_CSoZ?@0MppFu=vP7R=IkduhzhZFVj4d#^rrFElyskHkyTpaj-O0#k|FToEqPqjt-stWD zkzqpAkiqX$h96Pq4c^E)2F!LR!4#jEoq_y2F82mqheTf-$|iC{)6cy*WSxEonhes| zna55=3&qf-fX{+@OU_j(bRGs z2#IwUETcGU?T6Gbhs}}1r8RqVA{Uv|ok7g0M+mt@38@YnBG|)GBD^jUzcNI0c8NH< z6%m~k#StzMWf0-o(oHyCW^F$lDU4lGEOsPJA+|uAdzX_8A+7BFQ{ryfU*P*tJ@vJo z1XZHV*cG1HfP${_IJjSihUFeYC4_t}B+w${w-|Pyfv*woogEr?=i~Z=zJ`t?9Rj z6|`!H%d|df-I@$+>!+=m}2{NiA~iF?!=^Fb@szS<1sj!=sQQ3>d55lZOw>dCe*6qxbH^{|fj| zUG>zsU5bMi@ud=8;zq%o*Usn6kJP?hB} zw^Y(O%)O!Szh~}dt$^zGn7gHTU*^8j8m7!$0jyo-UJGu++}l4<=IY+OFqan$n_G@; z#oR5*+(ZX%gUdErW9f|2sgEEBr!%KaB8@?j;Gw2c=VN6Pk2Uiow8Pv{#e$3V<-sy{ zFqX$YxGsxn>DA!&=sq5{^k^W~0BfUx7~4luIvR-AiSB41lEA^@x<6kd=mrWpR|zpg zvlJyn_2on~_aC`dUBF9)Gql#AT$_Bd}!Rl-Y zG;@!twT8JsNBgfh0Y(Ilu8^0D)}3z2bwwf}(HWD>da?F(f1P-CV^%nawFNV- zi+EHaK?bkicOra&^~2(EBdhcBBPFAwqgZebdP)X2>G_BixdsQ<&!w;l(~nW0EHWs& z^GL3&k{SJrRfAX4XJ^R*xYZ<{k(*iiz4Xy5Acv9l9o9Y;)UK7aFA^gs7mnu~VgGoj zY2za_SIwVD$-pXj!|Ln-T{{i`3y*Q}seNaKO5YQ=1M?TB?Gx6em(PC#8I60El2rO$ zXGU?<=Q#lX(wYfl3J#_Po9idyJoN?hguCKcwaNI4j&cKg}k? zqu!=|%bBEp^B4#(-6=)%OA))`!Yu61w|fa`mTv>WA}`@D&~%xTfj0`It^1xK0(3pf z1K*C;Yw+0mTF6r_w^=HMO26`7_bd8vxb(Fuf91;@T^ zqBbh3lD@z;b02LfMhc7le-utvP5-R2ZkxXrb&nZ{r4@%lmu{y%(7Vl8Oj#TMCQUSa zRDMdBOJ1!uCP= z_MZ+>wx34~VLM$6sIYyW;!Fmnf{J!lMg$tmi9Ay6Y>>1wCZOr|HBqp&Xx!ru-Bvf1ApIOALv=vv$FN6xy58+3tL=7yA`46mU4fUMmNJt- z63{6v$r0sKYULXq?7JM8C}pU`nNo>W-?i*hiBQP?AQl72F>Da*Tff@FzVEIHqM8Y5 zZCzG8$*sP_6d;-zr{<=m`=2k1+`=O-8#E%)AsF48RUN1pxnNMazpjy-qoW2f9bV3x zaz0g&GfhRlM>~@7RNS4=_?JJr-->**P%H9wVn{{KOjYDery_3!6%|=c1S&GZBUO=1 zenenI$%L?s`n*<YeBVSVsP|hRQTblWV}J7f!jydf+34tkyo#)L1^n5x0Y|`}WN?=7_-O+E9t6DX zQ6S)dc({E5-?v};0{+9ET3@S3#tpH3D?BZ-FrpDW1q7+^FpsLiFYhz5_-h~1cp{eZ z|JANMz5(2fw-dm25op?z$F+U6JyjCizC0dd=qn}y^c_+mq#eQsq;=x~e;`hTbGzf8 zO6F-anFGmUX$3NMN)PSj2<4~#3dO13EIOaTfje(R7CC+r>C}b*P4Hs z2+0>s-E+y_tmHa>-EZI+60*198bj1&#nYs}Vb~>`;Y>_FNyD`J0Zn%%<)=Fzl{=+n zwnSgKn5^2$$nn6~Sri$mOhrcS%TzXA-|#yka*I7{`<|p_Pmu9U&j%P*YIB5@u0KxS zmrF$+Uepmxx!O@nKGp(03aVR30&h@ZHP@9XQJ4|D8NK3hZs=QCDF9 zP9DA7xgB}*tyb=V<Eg(^w4kMgJ9{n+(oIQsK?RS{7zyfDaAc7;0 zvi={-qqpwgR~|hL?5D`1F|bvqY+LLt_D_;W7l8S|@+i{2JSy*!l1GK$XrH~My_CH_ z-nT#Yeh@p_r*x(qx49lc zhcgi#!DQgXj>5DZvfQ63TL`E$QH(4q?#A53<`!$FP_Nosj~1jH&|XkH&DAz8D!!YM z(*6rk#Hg)Kj5fp}iD);CJ-k@Q4+9;pJ9ObXl-86EDIuO4aws9P>N$Wt^H@~wi}b)W z`iXprUaK^kT~K^|xf+l?8ps)MN>rq(5IOxFvP_YZfnQ32NsK*+*qa zf=?C*!(dUAr^|>PvhgvvLeOGS8h^PvH?eQIV;MefyWGi8L~a zX20RjMlZ2BjPJK5iN|v-PmEud6pLywl~B&pEz&slU6RH+ZsvCYuphybY4+8bw#7kmohW3vkW~!WEH)!=zyif~nQIiQz%P(mo zy6tY&2-BqwCz;lkZfSUcDyd+nzEx{`C@xJ$Txg&-aT;3dB$*9uzQ%6V(1NAc(8xZ7 z;-A{cmgSm8wnR#~ZzGeP(e@hI<>$3&WET;!O(Q!MkTx<=D*WFzGPi*V7h5&5ix>Tu zjqEqR|Gbf%KpM5G4_i}8{)?8@$@`OA+N3rujbjJ2G<Bgn!eP zVI-D?W7vA9Dt1mm8w*vBQ0OhXF*UuA9*pIrTsKrAnzae>G4+*kKF~YLvJv=*O6$i; z>$3^5>CvF|S+IG`3Y$d1`g5L129|l?zx3x*a|N?3Xl2)O3|}ie<)8+YbEhvZp+o+$ zJJ=(UGj#)CpX|6%^J^vDh!8OuQ4pVEga!~%R-O!eO9q1fJ*m>coWBg^EMWd4CR67C z8i@_P|N2uU&{`)Rnj(jZ$EX)8tc{|wiwuvRWJgMZH9vSGM~R4w3gy-t=vQ3NU~Rm6 zwS0(R61QD5BS&enV*j$SIsRpr=Qe(npM!7IvDxlRR^vxqa_p8HNq~iHCt_#&Ya98( z<(GVMJ>g^W^@4uo_-i@N<{6cU^pKd5E}+UnztJ*Jpu5}@zml)r?icPYJ);)8U#G~| zrbsuOh^BFy z;iFOnNbFH592@0pyT9&Uo?6tpJ9%qq6tF*Xm?_%NTmtmkuif{$pZ_DVZqO=AWi6%~ zqZ%UzgDfY~OPax`Ewjgt`eN=FT*7%GWr<5h#UsaSBl($xG8}gq)sb0I-|E~^Jt8@{ z;TrXGUQaTwzm9Z}bk#$#=#Ct#t^Tmey3N<%D0v-@)%MfQD|3F}By*CE?!UdUD(8n< zu6cWs=CBTk``b&Aa-_>gA4cA^tY=oWWtR_teOm2@1kugqDgt|H(U0| z5mxq`t(A%L;NUNG5>JOFt{cgE*M8JQi);#7s}g;PiXl|1{JM~zSTmWKib(U{c98LC zN%0o4K>&(vf~%s=G{kVUW@b6i@+~f86jFY=IAlB{6n~_6(sfu_KXwgs<2z#%u z&Jl@qi?7Z?BJK>DQxFJ#5rI%%PJYY{5kVF8)d)+<*rU=~9egay7Jq6YuR@6uldXM? z1DRANyz-5Mc=buL$Ko2uF1Fhfjw4i+52bQAn1D;NuISZ*orjJ##`m}#NLx$G6=z=U~QE1A=IT;W; z@sokeg+M7Gr(BTYb>bIDN+!o~?4v+YW%X`@g_XfedsC^BfujWl3%Jupcn|&D>#06G zh5TR>Qaz>0@?!v&4^Fr3i!Y~c*4i81H_dTqMkJP08n2&&s>;Ii@>n#@4d0U& zm`qJ$YQ|>17{Yx8AZ&3!E*!5Yp2j&ArpIe#(MJtVlb@OLgQtrxw3BR$6ooB9@KecH z#|pfn{-WX{yVKjo1m`ZWRZXuPrH4&No-DXE=4(McZ~rK+YmpFMygZ4+WUM3==BR@;il zUt0rlA-Cn6yEMu@Lae1QIH;MQpA|Wq$xJeE?QYDzCyKeM)BZSQq>Yq$jI_g$6_@TN zy?Y5G61`fwW$-+lx^Qk@5#eq$!>QBGUBptlRu+YDHyx>GX`Q$mCk&4}{oZ|`A)g}E z#nMv@GQ^T%7EhXfHaL(hHLIp%Du^BZFz2HMldQuTMqK zGSS^(harsmf_`SwLT*bx3fz**PdWzTE*W@lr_^c79?ZRK_Hs9}jJx~e$GyZwcu$4s zY)Xh(rNfIV$Uu1`8KoHs@3V#X0@a$EZju+KDS*cF0J=2JgNT-C{G?+jjVBly&r%w> zCQJ+f_DAF1ZQfG*jM z9U%K5e%g>-LmXIpFCjI1xj<~=0h-!a&4eSe#Ch@}%E#Clik^hYurrbIm7mZwC*QxU zArzlFBAbhkdPhr>)!p!{A^mSs@+C=-_yn7^5d>gGj7Nd!h@!|*(fQenF|aVYs!7b> z50I847-UU)a}`^3epZQdeL+p4gXYtkhtbj%k%CbCv@Cn<-YidazPCKmBWY?p(GhsI zJp}kZEu$SKkNw7UwcE)*%|_bCi3GTeo`RU9fYnmK%OS2PatWGaLzv{&nmGHPdwyEp zYrfVd)4GD20J`~ZL1eYyS1f}vZI|~FhYD^aq-HM{t%*&<{@UdX&4laPDPXFCb-qA- z6h=!YMLJNTmHX7_RWIMR@#n& zN+s5PK;@2L`3TmmED$}JzKase6@Ts2&BI?Qe+Du#m;B7sZmTN#AHrQ$J;8LXxbyP-5w1|2-T~5vQ3X|(%LTdJQ^w(AM!m6l2Sbn{%UiViy z1CqXy9rSxK#qD zmfbmS*OwaDQ3D?~fp1FSNo9+VyY6?@#btLt_3?8W=i8Hox*JR!@xPtuTXx)W)2@mP zA!{7U6Zk6=cprhZo~gCKbKlh^h|?ke(xwyTv7-d zGcV%7L3E~}nKMDu`JUbngRN=2%(phz^Q5lTmUHGmxZ-Xc%Fg)uVG6Nw0~hIBbC$5r zd*(;Ep7{8y{fCsZ(kKYUreGmFrCX?`p*)o2AnlZm{B7aS=8t9BlwFaHV7P$Gv|XI` zFvaBCjwjO;tOywE=(z99SLKY-=z(@uiDmhc*O*gxA}*4F-P^Odaw6wi^pUZ`Z3OYy zE)SWQiE&n@$w(;XdyTNv6j#feVb84gww!Y$4&2(!6cY0ygYEfFruJ0IcU3Y{)x`cYLSCyod7A@M&DlF%^5pz^?>(vwi zRi)M9uRWZuq(=tuSOKMMn5lWaebdYACiXFzUE*>o~u zHK<247>UazZsGX=>o!Na#L8~RZLPS4O7yV2G2Y|hf@JCL$ar-X6%YJlEJ8uhvLC2o zf>%`FT%rn-4YrWANL5R+NSynPFy!&#kkGhrm5_S=$}3MVT{rjC!Ml^qnfD>JCic10 zS&)c#s(9d}be2nz85)l)ACbjva$R-4Rd~;Q8s_ty#<&VyI);G16_vW>y%BJlVV3u| ze8;<#Tiy$JY22DU*f&Wa6K!K!X$z9xfdQ?;`J>)a1-1$u!a zRQI~S7LzpEs8_znl1-2tDhB(u|CXi`4|g9Jn*LgA2la2X$chrl!~7;3pT{;J+5yY= zCJAD`gYeE9^L62O=uWGN;ajw4;rQ_DnH0*@OeU-}?lb*fgu%|rp~=OSmdwH@A{s|4 z@IAfI1*MZkK6MROp#ovIf>|rK1$4FiL95ae%M0RcTl9x=$OVUq-2X!E6{TBezkoEC zERzjR-uTbXuc~=5musAFS3Snio#KH+R=Co{OQiPi!LM3z4n~YLbu}kx-Vsmy>#pc_z59CRAA`DGxYluzXB5L-*-fyp@ z8)FtjtfjaW@eG_0yL6-d)(MCYz=tkfe*_4xBmHC2@D;Bnh8VUacn#vq<`T{)YA&icjxtzo#$|i}D(s{j1B=>rS za+zpL2e7w)Za5`59ijh~lox}cDQPa@Xz;1inb=K<47m+JUR>h$nx{C7;! zmgv3vvVGbnV_@3xWw(hi6eckfqG2AzmZXeQ2WXg|xKZo@P}8RX*AL-ug0V zaOGrVxpz@d9AJ(<4u=RUdQPQ4(n1qIXM513Zn=W2{DoG*H_YhL+`!9!o*CR#xk zx`Rch{|PSj8jh9-l?7KT&ah=~4QAWrN!l&-XHU#Rq*Moz`_`au^@AV#Icl1Kg5-}b zbwGXoNvA-)*(9JE-jM44(DO{bRgHabqBxrR)$V5^KUL%38?Xt5D|=ohgAt~T+5_U= zdBuj5d;su-#QgJ0+AP@t)^;g3@OkHz*jv~uW8`iAYQ9x?!+JxG-o^pzwBEvXF24-J zQo6aaeo5D4dU3q0<*N7F2IQ1fyL)+wqmRokxYJwHR_OJ*(=}CRP3;e%`cE?uxD?kf zWAEdl-qD*Xc$JKp4T`mCQyz#9&5VEF`js7Xa5N(=1;>4z6{=r4&aEgf`oWTHVPb4N zuVO!^7(!tA&R<6J#cDA5kgbE=2nbtZit-|SLBo0W%^4x1ZwMJaBgaYZPyrm>>H5y= z6GK_h@($My@BR7ZRHGP!Ws)u@)RpDc6s22|)0T+prZ?U2p`FV^(sO?|7zoneEmRw0&G<0Op(6@v0D;k<^ z$w9*lYYu4Nz&o}XSZ;X#9{?3uIK0E~e#5X3={H*^0;ErOFBzmyb?+IZ*XlhL`2{%H zJ<=~WYAYI{{NDuW$0@&wqEuv?x{5k1MS~^#iYwIfrW*X?da{J9>6NVCZhcM`*6f*# zi2B;z9?{lq9Qw)KGi zY%t7$%h7imkYJc_CJGxeH%O`pY}KHoYi|`p!z?HfsBaseVa_^B`B)pR+6MxV&n{P& z2rs!Axu95b)KYFPW~(JmJOmkTzDxAXrE6}wwXKRzLDILCtMxyd|Pw? ztLuLoillrd15#`~9KO+1W+*@)r0{aJivvIj#>{@)bXO`vrsBle_~pjet^QF4h2@4q zlW$plvMB)su!PemU*728$@UUt7q?sJ-1$qBMe3i!n~g3JVX$p)Rpq0@yjbDaSsx03*Y7aY=N?hV!7wR zL`AgWUDG^5QNt-K_xd%gcYjLh6FJ8qMRN+_54Y~UM?s5Cf^s4h36(pfo;pADVD;LWe*!X^KS$>H#QbWvvb z%K1V749?VB-;0G8=1PCekN_KCQ@ttYi$5$(6mpeVO5(93YC)05e|9SS+YFtJvkh=q znEB{sAt&0uEQ`lN7k>kQW<)& zw4aieUe?+r5Dvn<#&Oc?TJUhIh~8P)@e}ByS&v{le`}(>QXytPrvn#hj7ueh2g;b+ zX9dAJGy1!W4uW9=Qua?(1NCzM!H}1JPVpw>b!M`@@u)`1EsNaIf>mGsY*!$WP0*v1 zW?$OhANSDMECD$Q)!F@Vy^%1IQ>Pd^9s9gw0_bX|ezcQQAB9-qKEQfu!4xY_d(WuDtafmyfduOGxBH^{89=o=EAP%_=v9W|io4BJXm%q4yf<)4EsQ zM2gTsGg^@4kL+FQpL~JVnAN?_HvKLc!_WR<_GM$$pn=hb+xX!0t&pCi;QJrFB6^Zh z_~}Bf^Bq)HySeRh8f*$0)Q+V$vbPr6getO{{gvmlZcO%I#c*vF7XNWlF(J?xDoKAo zXZ@M#(Ld9se|^xPYwRrxZZpDLik}vP5pO)fUxhQ9h}R)eK~bwKy~_zr=# zq@vMX_>d{=-$qH6cT2%@uxO)7jZ}F$HgBDYbD4$iqD!G*z{MKngIr>n}{eCkq z=*S^K5c=#i{`tv{J)FIAzqMb>9&5rZyRugvu}QRZw*}J(EJWcRqGUy})UI%?Vn z=V#!v;}yCs?0sWT%>!Zw|9l5uw4si^2NSo2&t2)?f@?AM;>%cJ7bih>DKq2wxeKdb#YFNgGlOmgxlD1zC?RdLj(4@xSfmzY!vg+O=` znL4r z0(TEVDfh)-GfINzZ-@eAS5`y|0h`^`EAObWjCi_%TvQW^rD43E}tB8v-w<0 z{*8QVox>M_*TgR(>*XQd$l~LWWs+zi0H2S{!dE|~M;-xX8YlJ$>+?@C_}VVZBphjt zww)g)bP8F4%XA##h;dU#C6*lI=%jt0%Sa@pnM5Laf0E6Hy9!;q}hx ze;|XOSx?;jEN{D?r-!WyvUE=WFLpxzl0Sux1@PLpnfWubO-mc7qboZz!D%o-t$=CA z1cg~9n9au=Ccr|S!vv=}CMXc79hl%YV*-@wkO|IpOt4vvWtiYfV}jE74%8cS8T|;)$|v$c`bpDat3a zwIdCl^oQTD^& z_YyDu-Q+Z#cNhFsCtcX4iGAs>v{##AaOyG^s16k0!F+W0lFbJyQ+soGY?!;3Y_`?l z_7qvPIvz5;H)OEj6#orEE#=+e^nZ{wRDwq*Q!`6MPyTJ|+|;fYn`PY2qAj9V`gh#t z80;jm@c7{t_w>LV{z{M@@>k%AH|WU&#beQiZhTu7d2k^bMcljH5*uSP&&QyiKk~qk z@zkt;=$WRK8a}znAysq}x%|)93bJ#gGS^H9_`$MoIU`VF%WASZtMr`ZDxq~3Yk+a4 zFe3#grkAl~D{ouVc>G>eE1pp;nVZG^E}U^;Vp|NjkimPSJInLxYsSZaB##b@i)5Db z=eWPgepzcU=V{n9=T-anyCRpnYG-v??M>uq9Y&7$pvMkWH8syKi~M2%n?{6>wS>mV z1(YNh>47;?K{@^RM;I33^Lz6qqe`miM6&ve*T^H{2R%5%R&xc1HFGgH*OkHln?*zi z{hj8SO&;|3i@z!6Cb|59fKq2QCkwN-s{hrpjDS)a zbFwAhNV3hzlQPSX;BI5B7|g!Su1irqVft}dgfPm@)9p*D@FM?vF0L(1Bp>R{0xxjq zTI?daGq6wF{D^T;an0q4)Nozu@gBL;u}Xs@+Mwkv6~9lSHfRP8>T?f|H8d7G#PAVW zexU>oOB`FB71dFpY7%R*RPEyWb5&!XpHdEmr+#TE8)K=+L|$E_4E!^nwoaerMJ^CX4C9YY!I2}wEsnf@SK z2ew{2&w~z8I>LLyZZ~2>>Lo*-6uLlYNWC4f&cFDtPGI~~NI_sQA0HU{wk)nWKTt>) zN2g2GYILGvdBcIv^VUyA8c!i~c5$*%dH~Y3@wA@&Vn;u%H*249T*8;&jC1OYtQPe~2y*?3w(YFIBm73`Km5aO2i<=jN<9zg5+7mNQF{x%p)lopJATf7;P*x{I6m|NY{xo$f|239=-x zeCPt77u(&R8QPKm{;ZSSGc*MR-ZI>m>IN|wzbkS#4eXvJ+!gRt9k7m@lW>*oQh_NM z7^j|~ySVs&1wy#m_7ztrWOQMx+h!L3fdkOKNy# z!R&Ss>C|6NGfHu0ozSZDj1^LNi<)b&=w#hwto?NC5q*bas+Hrsa3ZUg>X7tTtrRYJ z!kuLR63>5@JNYbuQ-rvxvfWRd=wiPwZi=#Ia8!Po88hV1lJ^ocD}R=@{<2D7&IC3! zl}yJI(ANT*SzSwm`~hmujpO=oqz{qF)a8C9~B zZ@l5hQN@qRYA!4Np5JryQ;dPul$rJE*zK+#Y#FnBIiN}7vobk;OET5##B^+!y~}jT zy+S-o5+iz5rb~HWT*CK_jm2dARM+A;Ei2G>b!SR`}Q{2 zyKC=SYp>>~YU>DV>xh#FT|e9UQzyYn`BTXwyBx+$*>4|Sp~2?7pUkSv^9ljjuKxxP z*t5cysWG}~FJrCcC2f!9=HF~L4~#4+X?rds0e2q1?=&I^q-PCo$pjK0g^gEVHepsSJkBSB;FP_FbA{A(o{QE)KxBb>&*TEZD@LMG@e?o` z)Rw8YW`P;9B@wH`gI_QDk1XQ=94X1vxdo^vy`6n|(06OQDoV=Y-gaoPy7oh6)q)U$ zbnMwDHRN>1Bh%7iwoS*%nJ;|g{J^<^d95Fpv3(5k-nW>+?^hiAZ>Vh?e-qQOhg3@{ zb|P`G&CTsMyoZ*1+m=EIf%qP5l!rQ*AVjj|_VtHf5!p4e4 zoPQ7iso2BBw6o~fus+uPW46!IXuD@HtxQ{=`7qL0PhTG3Jk09)F_H znjX85iwn4Tc9{h%ORrCOBNpm=Rch=)QWww`281zyv)(Yra4Dk0r-ygVn-H%*C9mfE z5#DKq*rf4hQuX*Np_vR=H(-TSI-AH5XIh_t*1DK%egj&h}uj@Z<0pFX#LdHq4{(JNnyE4MfJZ><=XK~6)AO7A!CjJY@;W& z1VnkR?Z71A3QEGFM$3njkvgEDIw2|@+gFu0fr$e&&oneM&kz@ZD#B%R`>nk1n!hT8uO0a7SXC16*U2G&4cI+@ z?U?(2%3se?vZMHXIH>KL@z+UB8U8x^zu>P29{&dX^&+_FgumWrl>fixuiJ`4{wk~V z&Mky$#W&oSLBGUBj)VU2zq{a|k!0)0L9%p;~*?G3SXqFJ%nlFtE3#gWR4a!}k}z4GJf7u}puiG2%wsyIYYQa-X@Ji0SM zzfPLf)Q+Mv6`>E%%#?7-c)`E)DM(r|Ia6Z`7?6__gZkI@kC%Np`8!M$+#-fAO1Ov4 zVF#qBe|%V?ep#UfrR$w;;lq^LrA$USD#BPGk@v?$X>j9A=PJ$kq{twYc?r;N>yzB* zbb*f0WGoPwT9%bzNOz{3R8i$#8VzQQEsdidNH$KL*Esdw#;J4Cu|hSTiv0?4Wuvj> z5xo~3NPeVzI_BGZ_WK&%gT?EaTD;25d^58aT32ePPl&8^>?)G&a2>a)NiFySv1R)7 zCp_#l*yw-CpBiy*?g&dUUmqw1RbCsHtcBxi=D&j|(otZg|LLm98D46^k;tm4d6GGw zXtg8exDl2$X!=44tvQvf?NOFpJZi7vfeEt)<<}0@AXkg^;^mObP(CUQL9I6QQfH}2~wN0id*=tvStrBqWPD%h&9NQwxce07ZEEbj704$n zJ3Fwwm|{X#P+GW~&VBCiDXayh%0J~GgzBJEq78deeHChp@ z>35~~ReWxj)|YVP15!eBJj+uC(na#`ldog|>C4};Aq^qT2b`~V4QcMDuogjjJGB_3 zFsy%QZQlb3 zNJ)0D>X4R-Nz)dfEH7qs$(aH|dBifM8lFyik?ki0BB;SmH3Ji;D7HoCwl|PgdaeFA zJioLb=vw{-`&3`EA9y0YQVf$>YKdNPAZL{h?vzL8zR1;+*!hkEP2pYi<;sOBc+EVA z$tim8%wF2FgFJnM&a9y#I&)Om8C!FKUbpP}ERxSgQfp#H#jF{lZsjUg&ix?>@8yrh z*KLgzccx?aTYq8$_6(%!ukF2PAw^9#-rV8)&w01FpY2QwnjIS}=A~o(`E0`1@&wWs zrxUI7qN)nJp0^GA!GlCQsCd+zyp9&rl3VLH%{Af(nsFRa3npbn8%-HF@m^)I)!Ob>Y`3*vt&N(; zourFYI>HYWdCLyI6${iQ#cwXRAz_To&5bJcm=ZQz0`?=&R`wqQvwk*ck(s>+a z;nl2IJSx|Av?43VE;%OD3y)A(K`uq$M%h%+(OtB>t$1+8s0Wxaov1;KaXBG;QpxKw#Q#ks0{|8t5p$){v%p+R3j> zHD*7`sERN67yMHK>}dqpmG4!0uMVo6!?oE^lnhA|W+lqXbWHFw6JHo>A>Nm$-m$@w zkPV(ADOY@bXzw_v!o`GWo=SBY@g*ZwIyUovIu~E_+=Tv|6JK+|h{V^)qHxnSFL4H^ zoefP`5#irMF*r%r{HUD>1A{7^5nuN@i__DA_V#?P_J%)2R(w$~SA5;DkFANP$}2>k z0+rq_hY|_94y}Z5rsw@8C&A#DPJ*Isv$vRIwnD$UqGQerMm=l7YJ=%ptMQyl$4)ZfVoMNCre7as??uBY zq9tVPTOGc4<$Wii;ufp#rDIQmjrQ`2)9UHi--M(<(|Y4Cl2xyptXhqPG7I>!&PCOg zltaWUPwhffRfXrlv7ol2tdl9&QC<}XmF-4etqzyAFZlOA=;W2js@2h(m;{L}gOU|W zskcl@4WLrT32%i`svk+YQYvZh141b^Hdjhjo0NL@&z(!DVA&B!sh(h7Qc9=LAbjTk zOWtFYJDS2n3DsC}1X2q7cE#3Cq|}Ctlv?hj)bboDg~grfQ)8EpATk53Im37dDfLnh zlTxSV)m&ETo#zD9bUIQub!8x+-g{#g0_u-sGXeE%D4?F5EdljpiKz1Y)Z=Db}d`du_WPLQ$j;o-!R0``_=xmbiEKVvEf( z+#_}h?=*?=PZj-X8&Xr2Di%|6_~4(>{FU=(EPkHAPsKLF(#GPa+I!JNikbFsVu$aC z^4@;G-joh=@YwXHcHda@*lyNRk|hLmKK7?lKxDR>z(ZiScXk7}W%*!96a7ucW~mIC zUO69&MbhD}rJvs53|D95?pKy)hlDZufx*#!L+jMA!W<6g#_XWBnuXFC6It_Q%YEpz zXe6?ej^kKo!i7`BUs01DMoXr`D@u~lL-7|GG<17(`U$W?yliW<{wN-%UAw0<;kc_o z4*#QAc)z4KvqYmgAe~t-(P%Yhgsh<}33|oHo0TuHsIW-%XY8TzP;Sg=<(T;jaqG!! zSiPWt+vVBs?Y?EJS>?y6WDK%rXVfD3^pR++4#PR8N(tw2li$)0W4n zKV&)1G=uAM5|T0rT~2}m<}`scuD2puPIe7K+#I2?PE3U2Se{eXD*L_?nmU%rvBt>X zG1ph^Cw)680-slU8+C}0Wr><9gs}aWx&sl*mchpUpZ;EG-0iaE;k!leSU`2r^J@P{ zdeYJ668RrUGPJeiIvJLq!xBZtB9`sU^Q%fS0P37Q&?P)hO}35@T}^;G4W_GsX>cB} zMpN2S3Rqg_pk`1=%n0x5I25iri1-IfoKavK#W;LQIg4Sm3gQ)Od)xf0xVhac+JfAO z_Kd8spQ3gAAegH0)Y-%%;Zu&Ji_s$?Rypj96jIKO&wm-uZEuVJ*KSbPXV+h9s4`ET z3utY?CeqHy_3zO4;&5|dgWrdPL5i1B9RDZI(P-JL{L9{gkdXfS$_Q6#a_!#V*?e#o z;hphnE_>~|C$e+_3H4J;P1+$V|>j_?WS|u%IoDjB@??OApTsPB}=F8YaTX5YFs~BOG_0Yr${7mT<0Ci>e~<=T|3Y zIx8W-uDvHiGg*qkA0nB0uw)7c;h-Az6RNrMumG^>I+5nAp3#Pz_=uecFalbsC1C*P zCLSxfPvxMGhxyfw4~mXVTn&a*f93pD^Oq3m)G2GKs24jFRXS*AC7vvq#4q+T>tpPq z&xAP^#Q(DQqW3=5q=61Px5M{8^4@XB1TFHSPLh2SOzGHAzU{O#Vg|z_`QjCo(KbZe z%YKUb@Y6V=4w^lJCr7j6M6;77G>&M%@^+J>STtb&<9ss_1f>{Xf>MH@ig&Sd(o326K=hnT#4x5Si5Hwiyn|XV4Y#v^ z$)?`N=u6n3fpt$#f`RpGB{a2OrIJl;e+gz~tK5`BsIZ*rU6=?+l7&vf z8(ti*Z%HrUmYh7Vg&f7ok=D$eet|uvaPG#bPU=kHTZ`A)MD6uBC-@udixmT>zPWrrI=$`*Rq2!%ZR=Njj(;H%foqKfHAk2&CW7-W#Duw1eL{+>(5u9u zAiZX%3RM}GpY6835Z?ii@t#TVXH@)SApP7R-2^m93hr%b0T(<)*Z~gI*gDY$*bzRM z+c-qDtLRCb4^S{=ui2{{n6Abn5}a8W+YH7!_Ak|E`;`TGi;C6OXV@nd9v1IH9Gr@d z?5krRd9==v3jC*_r)1***oCv(t7{ps5P39`iCL}sd&^!;Jfe)f`s#x^Oxz!93r;tl zx0}B=e+AW}_?>D>*7jdXj_g+PoA+yFK}(UnnnCc7rW@gzaZ?fCr9JO%XRa>BT+RMU zV6L|DZnxh?KqD&Au%!BYBrpBc;JXx4I92qk_gM`_=la|sQ`!G@;>1|%F&77&$v4is znGF%)W0}doeyV6@o3Iux9`!U%|4h_Bll0FN9sL8xBU}mHdbv35LRlp`yw#e02QfPKNsAJ~&8Vp)r#xK7-;vQ~R}MI02I5qW zDl-Sk*!9-0h7z9=c8*D9*i{CC)i~`&8$3P$VLyWqDNe(WSi>8&McES^Pz<7BUf;*8 z=9qY=k)i$>7Kc2)!*hnGUDNp8KyNvTimj23eQJYqd&wFDo}y|8x%2~qVkj-I_N=yF z4A=zR{WP5b$dLjh6}$h(Fng-#p3C@Q6;wYkuVybo>ld+u}fW5Q^KmwUBRVc!OM41@KIOrL07Ol_o2IjWg)1??xNr?R1nu{Cw4-SRMmLN z0a>y1E@j>KPQ}u4KEv-!Hqq%nMcA-ueYII=Ub|VUConZ;`=xSX)4%93k}*pDDUwX92~;cM}{L3Mk##fLz$e zT17zpdnW+}hag!tQ(-8e60YYV!<$-YbO(4e=%j;5fwPUKMqO%E#3+Vvy0CugrFpfZ zTQ3DEPBsNFqzvZR-j|qc>OR3_limN(xqLe6;Ea5FhAlhf)5?P+pIW0P+dJaT9n+() zPcZ-ih83{PVK{OxUbZ77#9s_B{2OHpQRu|GN&1S0bd71vlJ5cN>#WM%pzqIQ2+!a1mArnML=y4VoVO?dDYOW&jaM2cdOkd@JGty?MHUJ$=c#hDb5iUjd$ z62C?eyZeiK5*@u*p1Fu&hL*k$o(xX7!lQ~G=~G{ZR+FDYm?o0WeiK@59C{yr5A!#l zzb5`#_*=u@M*cRZW6vW)nRNP!@g?1!fx0|LP6$!3^cdL0592 z7+585+(pS}YOLgvpky)~8|O;?_U)i#au+3Mxsr`R$!hjVT*>poHuv5|$#Y%FGlP=o zXCM5M#!|7P!jjMP-dR5nb|qs$$#KYkSMr{>0%(7?i;{0nmRv$L%?h5C=tHRTQ-noP zWI8qifZcaOkVrPI)VFdCsdS{H`CJ7vuo;?aFnj$7Z>gynD+9{EThMqb;nhpRESfRP zJ8DTaYBf@ZqS$-mU1ijt=+aPE|r8$IM{lM zvZP{fz<~DtuzPQ{cjWbK-c1DXd^^v~6|0#?mbly6?CJ>{u;O&=D?Y3FMXZM`00b>O z=WhTT4W#~E_CC!3`vaxvBqZK$M!=Y7t-+V?Q-y~8Ia^zi;Ud*#`aJ4$mNXxs4wr1X zb5(hE#nZ80^Bs<1+k5~Tyu0vNrMVDMQ-AwoPpCZp+DTufNA!P(FB*WrilZGtn?Sk**)6T}V0zMBjJxwOa;63Bh@P-jSgJ4^$1ZU^F(Imr& z)psXVz}=_%0`)MLnE`8%A!^hHdpRxuwlBcePu-9gZE)AE5r!9L$;+#=pi;z2BDjs# zcNzN>#Dd)V!!&Ey1-sEMq-X@>kD^aG_Z>WI_Z{Hh>hz^We1-dDj=6|-GD|D7Y!y=r zHQz%Xu>6rSoy7VOw-C<8nLnbx$P-hIT24}M;Lm@MBnD==H)?#( zklW=-r^5~s_eF6uE&tsqhu8$e8J}x4NbKtXbWhPVk3-$&@^jc z&k77C#r{{fyRaVhRH%?_n6R-vm0q;OKl~E-j8Yg?NVhYAKdkavf;pqbMbbQD+*ibw zXd;B+;X4P?+%t?)SKH02>RsKIU+J}|>2UZox->L$~_wf? z1oMM;=^X4?VeDD^i?3zRW9f-wOXEmyH~e@*19f-cN9eTB&I?s~NQ`Y-{gyK5W<;oS zzs4k@Z1$kIH$@;dcGpD#T#dlC<0PBOJ(3&qu^{F|P--u_vhrCBYWqbdq_xrYaXPl{ z8dMK1mpC1XK1mzQ>eCMKK-(ckCYGy*^-GK8b%4Ktmd)M=2rfzxt|v|e zL2t9Scv(d`;af)djUzrtHjda5um8L-`pce@k=jG<&V#NWOvA+k)`?{&ZvB+V)shvA zFc?(G8m~5KdQ-gq%P!IBGwETx?3G%UE+fh-v~b(te|ck3VwUv#xR zzHOIp@HdiY!ZEe>ni}P|PP9A)wTDp82SJ|4$a74sy`@Hd&{|c0Rg-RYhK)z)c1btF(VkPcM&S*Q*ct^%mmkgYr~16A92AxarSM9m?? zgf1D7+J*=o?)l4L=@v3{$-vWg7{Ju_%>m>m0;Egr7N=j*^(_b!f3#Bbzlf(-MW-K& z1-(rHQaeFKldkZqp?R{H6^ES>x z66|L?6znFTHg!+t??|s~Yt7mGL)4awTH|AMBZ-A$lXljj4V$Db4017{zGx_+N%keX zqK*B=lOW%&wR==}&s6n)t}_26sS1k$U>p7vhp7FPoR+2ieMJ+*VCer^TYfVCwe;#X zF0{<-Lkbjk9f#lBhfHYY*X)tMYDT%YPo@p}JS9 z$D+zqLC@wl^1Yfa{eav1lyicCV!FyT@c1aF{Cy=DcB*zyRU4hYnU6u$(Hqyhmv+^U z>GHkSg{ncl5DmBQMKz85KiZ3rMyeNha_`gwhnT}c#2nZWF=M)vv=t24q>vr#*2xWJ zQj$pU6+}mKHdFsowmJfN+R-Z@IFv5(einP>el!U4xI>hre8vHf`Hm?tC~xnZ??W&M|t=#A(W1T?EEA(&vr z4F2jAacn^I8-;td=;_$Z(=qmBR-Lkz=n(r_id)#lC%+M`SI5|8YMMXjmbV5j%tMWg zZ}r!1_ZBz%hvu(|&V43TurATRY5t`+Luth^dTVRuD?ZQTQU$*ru&#d#)s2bgx2%6l zGdP#noX{Ox>BOdJg=Xs#v}Y87trcP7PLjo zh2{D4WtWL2*qIwKo3(2l*V7tAfKknz#6urudHYv0?n-l&!;}1JO6~XVl7aln|Hh8i zc_ZxHZI|m1lhc+8bF4+jD(F$$LjGPi#US`+C;e&R_JDNU`bMgxEkrzASA9j4$W@>a zZT`1jr5VKLC{v)0``OnjP#=>eI=8`=P1+cC>zfJ>T2{&zW9JG2Xa7{LAAot zmq2~!r+-*cyoG^YJhLa+q#X@>(Dc-r3$W6fOmhP5?P?PR1C!%V%UlCm%8KEc8lrGg zRM&tW1hbbiQ9VaUwSH{}^KxAH60KC<-3J8b3)JjSvupQ&3sultLkjoJ0=3029>t)x zx0lubymq3MlFlr5?KK~ARszuA=wwxCPMg6@1$yTocMM?g5KtK~+{e;_GPSIa|n^;e|1FqGWA@q=QF z=h$*4n*lv@%~giQjK2`fqm6tbW4CtTF7840J2-^1Fz}y#$uX6K;`J-PmZ|Rk3F|Ad zX2N^gc&JnU`S5Dv9|7ac1EK#{#$PMsAC^XOoHRdyebTX8)xNmqCLX>K*ZjlqhH=~I z(9tjy?BU{Y0d*J+pT#$``&XoJCR}01Kc2Rh91S01WmoyFgB|UDn|C8z-5UWB8~rl6 z&}_!~>1g)|t0kb_mv*Av*+#q4Z5`t~eKv>A7G2@!x4a$w2HCRo+d{V8(Juws)931z@&eSzY z9(M4~Vkzy%u|0b>qig?Gs1UrWH7 z$YKPXnFah}fa*8{e6O}W1$U7Dc745VR-x{WgNRvT8wo#qSwO-|c<4aF)tw6d_YHN? z2F};#$#(@{AiM$@DzrpXj}!hXbY~3}M{PJGB|%Nh&?z)w6t2S(9Vz@R1H@7Iu>pm5 zFLM-r*f*x|3acfc@RtF{q;t~5v#p2!L|Q1HccSmtf1IW7@sgt#3iCVBw@|%?=+($Y`Ut9YW&9X&DgA zicp^5sXC5xuN2OaaM2o&&KvCzM^{L-S7gp_@z78GVteuFrv)Sw2e|qj7+AVuI#h3a?c7^Q zVXGiQ8R=0nGyZoy!az4MYB5RGw?kNaXbltg@2jOj|K5gy+xCkSIbI_h^zQ~@4YVFi zlK~XJyd($5H}it_ei7D#?}DkxoWa4L1;@P>{tAd<+Y-gyy42?NL z{3F*rrig0DDd|Oi@nMH4!r~8wD~E87(9XzamPA@PIDfDXQB8Kz#5zSE~4Wc_OA*6-oLB*sgfN(@|R z?is%uiNW`J`yOr3m0_JojHFu4krCt2i% zT>Jx%ttoKOu&L&ClSwjhg3i(HWYTC&vl9cEM6nC4;@UnzE$8u?sr>>~d6LiygcAda zG*J@iia;V=!G}pEktV^lHO93ytTx0b2f(-?)0Q@iVU9&;w(XN;n2G+HD*|x@B(MB1 zr|H*uF$7HjLF|SsvU%P*`dDthd6tiz-*oI`aw0+R2!#|TPV0UJ|topm=j!PS4-r zMT0?)E(8DcXo-j=b^Ovk5?8DjcSldd=n$ZV3^P%p! zK+oGh?xysJo(o-icRhdg1^KyiU>m>Dxr^iV+X|zJmKjC9(lcvIJ%snG^ttDphzZlH zy&PBU` z>D(+#Lz1bY1D?=;K0$6q_x^<2{==paJRF&-nzN2cU-UDAg04`}FjtaI~Xy*C(R5 ze!XB<@qvYZ34=$4pZ&>p^{P7o6rv?ND38P2gmayiUZhgzvT?D5v0y+?R>TE5IL?qF zQ@x`jz4qf0=B|c0g=%B|q!NyLpDLvSo8Rq5aMtacRDCb1Z&LMpnFvY8s!7$liyB4r zFwP$@78T!JlGHm4#E+W?GA>`HAKR(ZQ94Io?at9ZZ0s00^R0l5rq33_Q>i*eRTN(U zqW$Kl#Rh2OnUp!CB)rJDce;@)bvka+Q#H7$qW^hUDe?I>BN1QWCMz1dm1Ib8dE^lu z4rTey{me!UeXe|uFQ5r)G!#1Tf(#v$hR3!aAPteU*Pfu&i=;m7mS<;^8=Ab9XyO?r zf*VPy?7xOdX^#SI(aGlR5$x=@{1uGhZIm3;yC#}$#>u|8?3wF6Hr)<1a-zS9zAFYm zi+;zyK{qO!-;NCR#uTu0i8Q?34JiMI#^sy~uWs?Lxm)vu!OD?>ZJgig2rgv%<@ut< z$UC2O%Zt}tS8#A%%{hSm8n2b9s)FLmvKIC)Q)g{XdOFry%mp09$;KhP#(jQ$ez)+u zg0NSpm0ORivt@z=e1b=SFuYw zFzK<3j(bb`FVAlttTCNRB&A-1thk4FqO0J!c>hi5*x?kKb{(=Dg|{}cP`TR={v+I* zAR9obicd;-gd5HAT9wH`hCE?cI$=!Zy~qp9)?oGMw~Ri(aZe+g)4*1M-);VZzt7+o z4_BG)+1UXQoV;{S3i}~h6)B?}a zUvla9yYzI+0_{Lnjc-EU@kP66BE6)SGNyxzH;xOUCz0$d`q%2jtn(kx`ZmkI7F~GS z2eauu*uC}jkbi}jj{MtYaYz3BsM+{;_8S@geaaA0^zNJO`F9x^LB(p4jekGk!SU}> z74Z7}g8|L*@78m79L&hO#m|5huxrSs>m8fU>d2=H)ib#CVf~K(7?y2* zHv-LA)DF^ycw@SWPhZ(AKHWhhMn^a~`)ltC=m=HY_;g%*uxv>&(!h!g2A;a>y1}O7 zf$l`!Aogy?ro+UhnRreACBOdrLu1m{_zBo{6OVO+59QxHcgX@mDnTIJZMwVj`q}GEDcvanc z`ooP|WurlRJ$k=%x^D2TobaS`Tj)>7M5~B_-rArJmJQyA-nJI8U}M<&zD_k`y7dgE zk5fivcr9oo~m@d%5&iTzW1ye{8imQngqUB3aKw zl;-BHV;xtES37dG({1&y=4brzxGx@{!Sj=w0+wzlsa6W=Lpc>>WZw65D+7~qHVV(T zNCC4eU(GPJe-2$q73~AAb0_7GpE9Q2{#wA)efaK}`Xd$a`fMaYOkHe~@?j(fQn)yr zl=mmCZt&S{5OdNSJdn8(7XO^rWVB-Nw|Rw`-sBbYUzXMPfP!%ChNTh|8+0J^a+Bu3 zvc=5HA25u`@f%H+JYkbg^IMT2_1ES1?o#^$&ZC}9G#@2L>lc#~yDa0cCApBo2w(Dm zRH$+W8}Kr8MrxC%5=)#LQ%8S4iI*Glk+R zG=@U{0jC=lWyv?!7W2PA%7W5TGSR>#)aIAp^Hn;LI=Oq@;C+BKuV!f7;P;q2@@h^( zzLf!VqJQLIe&W-b)^t+UJO8k%zNM=E_b*iCZIKPmcFV4CHu5@(g)39q*GhG>d7z|< z-ZE~!as+jRi`5Fr7-mDF6PZEhE2F!D(Iys# zRwjPe3TfK4y#_{lLMJv%A3X@h-^VysH+VJHyu6xt-Qd5mSj(#!SULVhoc*mL)&4iC zqLM0%n&nvS{X5EbFm}rrNmtWTs%f^>^h>Mh`|LCl3_9OVvHHCt~nlI{n+eJP$w6-AUh zn?N&lgV$oHah>k1sve*!|2tO+9rNr;2^O2%LAP$i=1K?^l7Lg$bX&@%*P|QBKka{DjmJuHJ zBTlOAEt#DM;d1_k$^d2%T}a1P@=`armw{MB>Z1<;;)k3hnN>G7C!k4%0OEJw|GuvxG-&LZb zvi=o%G;2wDrSQTu-EQfJvBjOp)57m7Wtsl(TB21oSP(GT0$3=v;if_;#2rc1;2P?r z5)QAblKE6(2crabpacc;n}%?q?D|IJNfCZ(>HD%lYw_zVBQ{D`1b51(;F6nJQwJ}E;5|@#8dn5iMk5%J0PC$noQ+jmG!KbIH z#+2sh3-zsCIWTN`zhLjgheTG;RB|2`gn1oG|m|^4s5gMSjC5;m3xUbo`Tyn z%Ci6~F{AI#aignh?E6d3;_-H=-dNTP=JFXwoyY5pNHzbK&p5sY<5YRWXC|KSqYZy} z4sH{QLNH95} z+2Oi+F@yZW+qpU19S5sn4#d@q(_uO&8g1AHTSVvHUeYA?81EttS3yNu*zu#;ymG#>=_dtPrIG)|Mir0L5y zm`Fi(lZ~P6=WqSgX3I$keweC$X}{JNpdwo(n0z(WFJ}>X^{R}>a3c0|Ct_a?Wn4xm zyvi1UftyKLsTBBaiaaAG+e&cr(A`Q$;!;RD{w_f-xz7C4vO5%HEphF{@lTZ3Osav< zmB92%L09N+XK;g}Cpi|WP!XCuvNKH>P0r41S#XGR# zCu(HM{njc_0Lhfcr(F}A72P6ijE}psqNk@$E*uh_mnhT$(VG3j!=cgXPms%)h?^*C znCOa*KwFUFk)u<*GK4(^6ya*^FUj_+Xv)YtlC4cd_{WmEjSvAUq1i%Y5#smsS`|J^%}$TR8-JAnBw z`hCbORLI1h$p!YNc&Kcy!xB8Ki{ zFk*;5HHI8!59&Y|Vuvm4rqlYc~wWo)sM|Prz5odi3Jv{id(L>U+x<^$iYL@=13+}(JoW8VXZ*MQ7 z0sm0OzwJ|%cr6Mj{y&kUFEK$q|3J96?#M=AF2Bp+aKE_4Z#(`aNO zVqx9WnMu0bQi^6Mw1W=H$q&135Yn&cN|K@tIzkYPkC0lNnXC`FPZT!O&Jbl1_prp< zEitfdJv2D9ZCyZoN{Ck;b;a~;>K`>ut^y(k5SNskU~z!8!#NdRq0e`v;(_jB?k^Bo zdPUEZLcU0lZ?MbvFH+O7ma;6dKS)a5b%knWq$FVM_asE8A8-C!MZe)iaOc%&zO6o4 z+Wsa^nl<*hjxYRN$xqUo=>pp`e*dVj@e>L;PL})Swwy2FVDhU;w$P5=20>5k&^w+Y z!t(>*)edLB{ucD;VbhKoS zd!Mfm09uy($-VbOp|fSnt$O#0IFl+G!d-+-$D(hEdZcvF26f)X=$NuWmpR=;h4^0PNw{THuD%B4sQDX^?wt6rle2V zFaw%@8EFGn_~&V|WEQ#_9oWB_fBN14(NFE3ZmDmnOE;yabn$CQ^)^m>EBLUoeq~*H zNqR|i&g=g9D!>@jP2D5iQj~{RL%J!EO7zB@99#Q)jfypzjunVpQ?cVUL;{a{IR`1_ z4#5 zRnDUfXeyD{)i_5G(SY=X-a{Q$tUdh1sEh2=8*KdRc^f>B$C|5yBH9kE1MLgR&&Xb8 zO>aq-y*713>e>h(j42*di*rG$9kBTZtTuDphpO?*{XY%K=@j=!sHXIi`sH1z?7F#j z4oAc5@YGdbIqF$$BYtz_u&xOE*G6kUFzP)yqhVW%4P zC4+pvQX&@#;pu%*jiehK(t)FAvCd{0z_=nZv~6XqmVH==gNJdA%x+lbZlSi@5W^P7byC&4C~V* zdYc{pzX*LU(fIkIpcagPE)~8b=`)zQXU)-!Oi9(zHDdr``z;O#RfiqVin$Vxbn*9q zc-v0MR`D^PnM+H;6sBF)q5IvU7;ZHj$_<-Z5wu=xtFG}@DmwjSldLSmE+9dchYDN6 z9e08tC_1W30W6h{_2so}$zQ z4TnbZTjgLyo*#Ojwp8Pmvx{Z&SE9F=)>p%Y8EpRO&%$P(2fEs#7VkOd)G=JiUQvNO z{8F($P{QqFrDI(HV?dfo=SO^KFqum?HyuyMwCp@v593>=H(ft?LjB3Z$JFdSq4DJ5 z#+0z<4Q+e?rA7Vo0^$4@wHabG~P>3vnSetZ7ad&Zks#&B^?YZ80+Gy|#xh$4M&u@u?P$p%S2&==iGW}x3E?DIDRY*_&8sj7xD=_ab6yquU6YuymOrmAf5Ri`GsXOi=S zQR$jo+p10Jvc;2Q*oMm1R7Qtj9(C}SiKOz^W>ftml@fNL++s7CJ}5Lwe2&(fI8G#y z!A`QQ#h^S|P~L%WFDQ*%^Nhxz=tuf-TjI&GCDD2X3>!d2*I{$SIxrexnQVR|;=gEe z8*f9b#ad?~>x;faS*9Yi(P~N|9tr-SIlZ4>b&Bk8eg1GUYX@M`R@w?K4|X3vIv#q(dsgZXKFs(%-jA|B}RbM)3Y zc(xT&#}!it)DV;}R7!V`pUeOR_}RM={L~VhLL_$$)j|_L;zz^yuaGQ~SgkvbX|im6 zv|hB;5p$QXnB?Dmsu&{&bJW^{T06(wzW6+Yx$)z(n7cJE#N6YfGniY~A|hMiOZ5PG zvBkUt^`rXfzt(_!U#HlbcR+i~9PM$8S2+DWO^CG}PJg8mmw(2aaC)uY8V6rtwe5^k zTkmT1A!<{6Y9dA)B>{a1o^O?nKoBpiY%E8N#e4FL7>oDjw|8ZIQ?ZWjkt$MTzXi$%oVl96z5?!i+Epo6@8bFzYvJDox=!iNyi~YC$1E8z&eumxP$2}9?HPFx6#)1+rUY+!Q(L3RtU0&t=yfo=u zR-Euo@0aj~d=J_$^x`AE%0ixc*fbtDizyHnh-FIS>)-NDFGw`rZo&H2Z)Wc(&Dl~` z^^_>_y7DjbX2?LXQEzWZf}ftmoFr2Gp>+%-8|E*^58ssVUW+%sRlprZ`5T8u=T(ix zhe6Xum&yA^=T_vQEEL9xK7#_0Og|m>nw$N-qH~%PWlhogm*Ay@*D^m3#kn%|)D?T@ z<@M)#WI}#3`eo0&2}2tbWAWInVCor`^f0?K1+ye%+m*1dl~_=s36AoNEKEN^4ZySb zZ~*`A%JuJiE7xz%Uy~|0JL$RDcR-O$ojj~9Vx{YMbf0{~0$Mi}D7>GRFjCl>dz|+T z;h%h92zv;0{<;Z68Vk;AJ0Q`&g@8HgYa}&t-!2pSxA39IdDFJ%(dN(ZY}Ml2D<~PT zVxbbM%C;ayS8BegRXA(rHtY1Z0BiDqtqCfGGAl1dzzG_i*V>k2g z_4L0O`k#Dhh*x?zV1-qiTc=e8l|UY72vx*ZGo2zta%KK=U>{26gz}&#SZgvQiBr<^ z_fq$UG+SWLg4P#7Re%x$xBnWzbx^hz0IIh*(SJq4(T4kG2(eLm`0Fr}<>kqTg`*Ub znPEjWU}!3Ay%nI^j||^uj?#B)iUUaBm>>@Av?7yw2I($(kz38#;&OXJn>=j)W{(P zL}}UBdh^b>XxuY8@AR(!H(D7IHWT;oc({FthPJIF2NPAPUl+g~3wzQyd=WRnGokVH zt|o4{m{jv)zRACRzbPEw>e$BRJ)$?>7=fp-SScD}0oY&Kyt!LtYG%ba(xUUu`X*>GcFGF7g<5B2SgA4IwXJsm zka!@zP>oH1+8fX6I>K8&B7YqrV!2=k-u(N z_3!)t`}*Vci<{#0+Y6#MHbWm3C@&tTf8Xp9U)vV1e@31&_1pH2*2}*-?yWRcDZc(q zZ+)EAP5+k4)RQAFgi>?;bMx1sE}ZlY##HLga8t6C^8VgQpJ1~b;9G4{aTF<4t zC#CZ@0aESnY|?Gr8<6AmZM&63Yg;Rr92KbI(5)L!OO34V58|hmP6vH)0jTv z&2R3u5-&%nXC&MM!yNQ&U-%Y6Hub&nTPlt5G zllW^$V}n)Fc6biH0v?lS(Fl@h=68pxCFvOdO_Q09X5@ApokBHW-8!hPIHygN zP!}33prb)MG+3eRY&L(xUS>Hwi&ocU+d=J{qou-ZOZD3^;eJPx9oj#WmrZVH=7mgt zJu6ZdbkW?FXgs(CtLL7HGN-t;OIu!wQqgOz^LC#D8Rkeq{EyOLpX49^XhV_TY_=UX~;S4+ydFy5sBQKGgGq0Tu)hZ79@K1shriDS5uXQtezu?Mwkl}?+sX_%TA$u8z0 z<<4lbB|Q%HMDaR~F}ZBKT(=t6W1dY$*L76JVM&dT#!eVf4k1yB`JMgT(MJ#^*CrcRB+D@QtQ=YojGF=Nu|t{X z99Olm8>21PE<0yc!7!o5^DkI$EX1>;KdgdmmAj_<)cpqL%M)nTPi8>wmTJeHjzZd( zXl#jLvq@rnDhC0o%*%U&7vbC%Q1loQPHKrQD9g3r#lxn{4c_CjwNARcsbh>YsiUr= zV$wxtF8Fu1<;>`s$h0-NmNQwQW_T$&Ji(Nt%A;F#L;MK?eKD04@@GI^b>}JTN)zjjrLQ-WXIMF8; z;OjiFfhizz_b6$!a8k6|{^ZaqCKAQoXbx4|{zx_>qyriWcT-z_sWe-uu`ehd4^Zh@ zmnr9_S%ypu(;>e0}^e&z)ZW*cNyFP=Ea3)fnGtO};#a4%?PLW~!9eZ^Yfl zIZfk!sgDJFu~W8gYGi5oQDLL^OGW=0$?idmS@$UWSd(dOJaSiWBHG_Enr1Tfk4-dg zg7-*eh3=w{FZgBLT{EzXH79p^%5hI=!j{=l=@5`{aMZ+i)Oc$EJ8~Fcf+IR*E9px; zAsgS8KNR9%9EQjVk_Z0@i(=VYr;KTtb^h*775!!%yy$l|M_0&orrv zR5aPJ%pb6GJ~b~>B%d z5*$yGzO=Ja9*{Kh2{;vi&q}EbGCzPzCl;QYq*S3&jcgJjYd@th^;e=3#++9vq~w0- z{!aePDdmG-m(sMe<{kK-mk5X2p~PEEX>#9|^=6Zk|AEw{2c#~6V*#3P%(AC*V4_*a!=-z$gC6Ok!6GjEKq zc%gE7{+9El76tna%hsv>eMZ)Q(0{f59qB#0J+|OZWMmVO*Q?{m$B%GweSdcQZXE~k zAWB}7?H>he>W82u6o2<53B`jm<5>@}(r1=F8vlS2c7h|1yo?PnF6Hb%aW~8l{nU^_ z<-W-zwq?*~(7(2_SHZ$mEilI5USYmtQepquaQw@_BFp4=7!l0c6bTdG+vk~9+HyyE zwfO0#FgeU`&3&os@-uC2@2&uw9%LQ1Br&ODPWnRjYozPkmW%PS?if$hhr27CA$C>l zGk>V%;^a^(%SRhCTe6p5OpNbqMT5;9^CLZ9<1TV{%Yw+=)4v%+_HOA2Z_<4&4O(E5 zsWsOzhu_6x`g7BdNKHDoDUv-;g-q%=FP&g!xd#({N!ggkp6^Y?1$qPjAom`=Uy4yCly4P z-r%JHfP6&ce`juP?5o<~>atgbf{0FVq(v4#D`WhIgw()bGgeeR?0n{{3!%&pbs0oZB_$2 zr17yMq*u#)UZ!#_b>8vzAyZGSjRcK|6S;zA9o+SjrEN6eb*FJaFdI05Mwlo!c%hS@ zKHu+^7q2TV$z61Dvh<%z;(en5AHvjNQgX2Wq+ammOThTd%A~S|h!ew69am)DY zw$`0~1hfBW-Uy=c$oJO9-L*o)b_q0dB!JD6KvR$+hY^zVItp&g_%pp-yMsRy%W%HC z8IH9>pZ&{@pV_50;exv=aiqehdrTr%+w^lDFaYLiU%rF&ndpW{_b3`wkS9`ZPIF$8 z#S)yaFIf^F>g`>sQx%c7u2T#eV-@S)#)phUMLGfAXn?a~kag70%y!!F>d=KhFEZ_rIJ*xE|r_ZYW|!W@8rYanVbpsXN>9Z zd>to^-0ZFRbL}N}joQ{rxX2CvxN&-J+k{WvQ+KlTc=6{&HRB!EsWRvL)@7`qr)wrf z)29(`zaC`cIkVMqXR~(pOd7~;@MbkA&jxQM(}LqtmMyAHk5pTw;lC9u*JOZr_syKH_ctlJz!sY=R3rgxdI&0x`~IDazY~BO9xthv^gB z3ZiS%Uv~1#>KH1=jrf&5@)?}tdY!I5+?wg})xGkA$X(sl}7Zcq}rgXb##g()bN#dG(cY`uM_+l)DHiS`N{R4c_r^wPB<kU_c{KoVqqhz59sNWjrnW z5SR=sBSV2+#t)xnnti3cbs{t2b8YVH@%%}3#5_;9FWc#j`qQ94O?)X&h+d$&mH6hL9 z3*^CRvwmq#?#Mq_L4GBv+~fyt*T_#kdlV!8G81h`CkiW>nl$+)J`)hFm`qZ10oX0# zi;>BneKL7AElircmkPS!5_O>BLM8FZ0N7#&P_y_CfL<7xe*$wyk^ z&FMOJ@q_*NOM2h>rs4Q*oSBLfvEJPL9RXv5SAS$F)b&oJ8;1{GjP13|lbq;#zO_sG zq~l(#`A9<>-5lwbfSG8%*I`0Zlv4N0+{A~T5Mk}+`$Wv&jRQr9LoU< zJX!loXWe7^7$f-OZ`jx#2MNtG=Nj*WyyR83oe={*)mZUaN`52dr8k{k(z#5dO}H!O zeBEfghouz8yI4xG@h*Dt-;+;zGdB*FwI01L6itwahD8(PoFYLaQzQ=+z4q&yA-RV> z1mk;xjqiHLHF-$yHNNZBcau+0eO3(1gQlPO{-2DHN!bi>3bdu%C&chLv6pKOw&EFJinipFTa zWiPx>zsz$gY7L3>EP_5d@AW(URS_e(t@oexX)k>Ive|z}yz}AJ63T5pJrvPnkTsyk zrz1Uz+zURLsn86BPTp;xGT~;k*NJBDWbei87TB9_cQg3tts^F|_ougpbXaF`&gpgD zKOQptK6q~S^19_{7Cy>C&nm1_uJ za3l?A&g_?p_swR{Ex3i^DPD(ijr-e`HwK>KJvEZ@>~upM{hWMWE~Qq#x34PZ^gD>n zf3XWM}NohN^uI^E&-IC}}doArRTnQ4)qqnmd9nZ>ux-0a1<*|+Pl zL4WXnYQ2qN9P%cAPEBF6@&j#O~Pxc(0CVJrEOsdN%|?$n#y zhuyw=4fwf5eL(ABeos2Nwp$&Jo#q}NxkZTBi+-M4bQhNg`Ms1|^ct6|bBiKeu9r95 zB(Uac?<5;dvI3)n=T6#(6Bk_y;rl+pFz#;YE(ONOjJMiX_IF+&*nKT~e z)Vgm~b{v;-Tl-S(?3)l!uU~?3=#jZ`0%2bCX!8^|HL7}wn;2C!C6^d=3`f$ttZ}S5 zfro~5~+BS!G9^iuCPik)`YB;$m~ry5ZYKR8~#e z9e2QXuX)J{rGAVi@jA$|)%y}}bT=6j5ph7kQIwnIw=w|}`b$sl*q`wvw3z3(zJPR@ z-eaPgqYzrsOa1=X=~?d8;&D#?^tvEsmb-z{KjVG-2!u5ERbKjNy2oc{#f?!qNIly8jK#^6_&7 z%B35YIQj3`1nqA0D!?ll3U3!0`qFh~3uWCwSqKm&ahw(i5ca^VBg>E7PY(B!7G9;_ zlJUue2TQS^FJDAQ$`AU)c+<$9a{z0n3GgMDIYF#YGCA0<2P!DZ96NkZ1xG+6M^MBd zxHqjJrtIZJi-h)qkn)LZm<49R4gFpILzFr84!CS%TN&xTTHtV(_)^`jNq0qxqwnU# zkwUFo|46#Yn(*O3oSZ|5JRZnXA&6-1O43$^Y5x$wBVLpF4^T=u-t_+*=cSQJEc8Xdm}AeJ)CUHN*AkOZsI} z20&2%VW36*zv}->|C4S`U0!1ScPfOVh3?NN?mk**q5I9!C;#{T|Ne;nW0m^udq`t=@B@Ui@jcep*Z+6@--*9HvgyT=O*tbw>As%Cd}7WANEXWl zoAd@_+uF(l8NR{&ya#sph`&LmqtK4VgD05nrCL^MU4=T2S%Ts{%ct+oE#W zvQ&5dZG23M0dLm|l|(M7;11e*Q#`v4bLqr&X!b!k8&m`K5r1gx*TUY~k!L+ZynMGs zD^nge#Ox$nN04nfsTIZSH_DZreDME~^wRTFo;c020F1{;4KOPC3NU>A)JDx6MkA!}+0K7v`Gr`~DzagA2M>zjA9khcT0W;n`>9OAS zbA5&6pMbX_e{CX#S+no-Pn_s${gUQyX4<9k`!#K2B7T=268_gl^E;H^=lMO%?@3I| zf93iTzt{Nf&GUg=ALQ33xL`$WTk8G1&P0KSB?{EdZJpF;Qou_BNwE~L)cX}Px#jpn zz2C^6&^RRfhou2D5kKaz%;AoEDmfoTX*za<(ln)@G)?i9rZGqwuLU|&&pU*jp^Qk- z;3v_nVk%qB+a@JYHxD=YH`2OSp&B7(*Atp)PZk>v4?zT8C zLLAV!;u8oYw_OCHz-^!r@#0y1B+}%dna;2EL-V5EJyWLbQK)xRg{XvX&{2ne5HbJ*x8&G;caC_?vF{#SZ#TSwzE(jETF;ruv@sJ!YO{T=9^9a zlmoLaLB2hleBruUW`gW9thd!_85^F1>1%k=?eF%I!G|C*0t8}#bd0(*TL~u(9>5}C zP!n-6-1i2dr*G9b(Z?e__fZ+5lIlb&tHQAhHDj<-{9oFS~DO` zQo>qMDf<=sYpA?}p)0-B$(>L$c)63CL33GzX3KAMcUtK_J$O)|LthO$l#2oaHo2nY zacLjX!}hAdJt%^vHK><0>Sa5v;0?QEBX{@A0y>equhC`kmG(EUzn%B%FNXx)B7Q88 zMHf~fFKj< zjG-k~tVr1_?IF_rQ~OwWk*PzDVdY|Nr+xP;pty&;V}oKNcUwKwx!7v=t0hmIUOyD% z^X{x*b?6?-4%@o_PTTr-k~!{}P!^@~;g-OG3T-~1&=3ISzVEna`0(oa6Z+U7M`RaL zS`j<#z&?ImpV)r7P-uP|Y1dwDAaGDg_Q0yj7|}tfLQ;XFSve-gI@%fPcXIlKQ$nZ@oTHeVYJk3UVWla9L&PM&mSfDjew<3(*vj{A`leJ6cbAg}v-2(_~7 zJ;-t`>p-^38!q;Kl=-uHhckarj2((`F)c!5uzJm5MfSw(DV;B4t~>^a;H=k@=ZWqZm-Ggm4qw7 za%Q!;vBJkR3%VHD9Cxp<8IT=ZW>|g}OV~a*Ht8;`N#Tjyv(`}btg28c3%E?h&DSyA zPnuuEXeN$eG!>Uxf~HI~$m#PM)Hu%L7#;R;TmbL>B9Z-dCWm8{IR|WOo2-}xa2^>W zN0ilIWeux{<3sou|1y4K0P^|Gw^O!pzLNc?sc2~i?z(yKprku%ho0r4z=F-F;1nT) zv`4k#m-(=(dLfP@9@~_uNaacf%XvrIskWh&WrD@Cs55f+Rl39%cj~hEI{oc@K!4#m zw;Io>I9;U{*bXem|N1TaDwdNuIbb(@D9L;VB2)?}UeDq>`LSat!#e6BH+T{Z!P3<2thD>DrL-n1O-#WO;+R}0Akx!mHH+M>z_ecqwHs3yI7A}V zaC)MRxTWwUr7fgXyrY?_sE^lbwpaqU@H77Uy)%9mWb`|Fka7@5qht^RSD}7u+|DX^ z(H(Tv)dg}GTHR?!ZZXxc$Sf_$0XKzO@^^RVVJ z&~Hk(RT`$-UX`g94kmLo!e-PHVnIY}GGoBR@SX56y!XW~{EtRyp-B_%@H8xWVJGE} z^~-NBt^jVL*AyGPw(5d==|gOiUOq?Q?yKm&hN+5w#DMS>05r#ni+Jhe071n$c4uUD zntu!NR7~f#Fy0lD?Me8@KvW#6WO(C!prDie34P@*`Y0 zjWx&240(J(X)iAZv0tUPAm@wRx8<0--HK;+o59?{x^Cut!L~5<9FcSjmZp7**DqHP$Twgq>DSf#=0ObKClnIz z=R{|ih|H>%TsM3>n827uMAl2>eMfr9ZMM+PN}>~;Ss#n^%r`X-?PZnUPQfSk33D%M zILi1NLGv@ShUbgZ0Ki6Xwec^aCfyoRKQRT1seg{B|2kUbQ~yGi#hHV=`F8!N^8w?T z>0j?i=fQeDy1qq3aPr@;qH8Ack1U@aZtz$S^2-;eIAdT>3RkC!{s}w-@4sJoZ~9dV zFx44m1S`{V#!rTaRJ0^>Pzw9e1n)75P9eS}6-@@2AJ0t*FAVV6tJ>IRZQEkzF41^O z#w7|vW-hu+!Qt=-$K5p)7mLQ%MoiV}@}135SkQ1AGHJ)2SMu!iOzU#r+N9`JhlkEC{j)urV!3 zi2;0s{~y{aS^pt{w!yatB6B?+Up5}B^Im(4mUpeuJz}k0qW_RQt4z7e=`}V5D^SH_ zPN?vf5LN=ic@Crz1c*IEr$c8E8YcXMA6?9$^K#Y1A~RoB8~heK3OfEAd-D{<Gd z&+_Rs&pMf^u;!6r?i+X6${X~1(6Org-A4!s<>aolohjl>hj_K+5&(b>W(IjT-lb2w$x;J-rzk)eUdDk3x;fH%Ay(q=KL)S4)*1<_@i$oBilpkt<)dWiua4j(e?zy;hL5KfIyI z(?2T6cSXIZS#GGfm)jcGCksO|@tLH%rVVFQ48;}$ zhZJF4qx3&vI&|MRb*3<0Z5Q-fXWhrA=ToC9PjtKYuAu{71LK00cS6eD%W+Sv8d}9> zJc_1-5Oa4dp0G&^e&aiz!~#_@Z6a5lZ8AV$s&t>R!Ndp7x!@U9o647$d8cCTNx28u zrxV=n{Zv0m@U&_z@tSD|Ca^m~8Z^sMY(zYoc3TDx7Kfh}oi7Uz6d`|;#Z`I&xnP|Q^+oRr2exTBm~XwAqy0OO z0qbpw=t}>9(2$Zwt@R%R<8UCY z!g!1bq~)#)qh?_@7&u6zLLjZeTdziM_*7^-NU)Rjk(kEc84-`@5RDj}^lb??W*vBc z;Sj6)0D}i{CHg^D!h0q$ax(AFH&CorH;0uX%_p2!0-5FStgm^80l)!gR|CZB7YBgo*+S$M&3O6z zdCacCY;p|1NaX%aTeZB?PLghhBdK-?Y8WP!rAK>PU&Us%>pch2Lhl%A)uDl-hHBq? zL5a8e5&2&cT=L($jXgS;68d^{(@a{W|L>2m$ZstUq|?t6nKsMK@wgZ3TV7^J@j`Zw83io>|*n%)2ba7bSQ9%)$EFk})?+Fst2i-JVEr-wt zH{Z!~%Kgz|E(m1_3YXH;QvHD-+}*&i(T-HKV*M(a>oDll=`3W{{jp?#{a2! znE!t}fM$XJPZIz4cFzBcz&OnR3*+&>=KqRkhu|3;vS}-p;>Pb44VL)DXuX3tr683rTQrsNhwbUUl^aMPz;>WHj-agL;7S*}*QUP#XE4%||NT z`y23M%CMUJ3O`{!A{K*84Mo;$SE76_&b$|Q_#ywq=kr_04^<#umy0)WL8FK_^P7{4 z&&zc!mhhZIIm@wJ(bv_YKxHE`^~&VLNMYQGC`U08FC^GeNMzA>}KJ zo)43p?>}XDLeGft#!226Mw?8E*{&usfC-W1!%QSSRU&Eg#Gw=1)aVAkh@*>(a95L; zEwDsLZ2nkoC;G+$wn$O{)y1fms2pk+l1dW}Dd~2W7~0qY!0a)K*s~ZCR%o#MF-vaZ zx{2#%uA8}T;kt#Z$JOJymFrfn+qiNt`KAnh$kQEF<2Q1Gm~dZ93>4AT39jvS&5qDM z1N^Up0GB($>J@(%#7?TZM^CaT`ZCU8ONSSi#{+`XhZl?f8x>*jfsM8ZPOykA4W)0Q8@@LJjY(MGgbs~w4gQ)Er znQs^7T%&l`^2+g}J-$q!HB-S*?U7I0Jl(yQRWO~tU<s)SSDB!MLangcuK?V|SN+ zd`#d6;h40H9Fvw{Oj<^c32~AoRsDiagyRx8u)D@vB6c`K=ndU%NCFtHsGsAVh&|NZ z=8w?@t_6!>cq^iP5wO>tzR-IPO-y6(H;s+;)jy62sTeqNj{H+5ek=?=8X&Z5S_YG$ z+C%wDd5q>Mj3z?z2JZ@6ET!%she3RI;H-lBvKk5TO=N25c6HNPvx{so8fcXaYO`Ew zl1g1j8L^{Z^?vreT6ua+FcNM*=)2H+nzt$U?1kndb3W|n{N_aNe0B<+J)V1Z5VnXg zVm@I^a&E@MTZEB3x8*qhwmF`?9LgA{ls;)B^KdDV#;zSz@xGShVg^&AjYv1u6^+B6 z{7<5hNOvC(;W*rDAADMg{h`#eh$ud}M6UWiAKk0{IR%QaFTA4GSB;E<4i+=_3yd5o zrcA=wW>>`IjsLq+uWm2(U|JI+gFEOea}&`yl^rLKw4c!97{2;z*s#@hQ77neAswyeEII?w zaHESjh}uu93C$3inrZY?VWZIty$fsA>J8pcn9;>Uer^K^rO|1d+?q%9=cFC`Gu`?F z8TtK5l-8(IULt`ub@0l{skR7oQal+&(aiOWq&O@=_{= z?n~m!8w5{DmUz+;p30kx-A`pYf&GyX-Pb5DMaFyy6vgav|8AsWhOiJ?A={!XPiA(t zW_eY#G6_$2oQsB+B5o|>Xq+b)-)IhuiT9CCp}Lfl%6NRX@=A$NtC?h&+0Yqh5DRbJ!gc5C)r?zI-^!J`;u&( zJ4Gz;*m$&e(HA5cthDdvPC+uzZFBZp@V`AsCH6-H^HZ$Fs}KyP81owz+le(c9>Zx< z+&%d?#y?(}ukPfane|8CBaxvE+45|*5$usUv<>(i6d$>9DsDTcR&=jRSH<(4+i3qP zVBQ%$AxZ$)? zDDob@cJkby-iMTym`q@mwp^_J$4>>3NiCguVzX5hRG&bKa$2 zjOW^#S^>=j@4jbH+uc)}lJYO^RbKCF6LE|B4N2JrorD>l$}~H`$sn|yBf_Xw1lG@W z*?~QSGqhCro_t4pdGqdbD_*Wxb{=;ZJ$hc_%aMdfsIqha?lf*omVK0reiXS<1EHf} zd=FnJp0HdKA9bJg9zG817e}T{(5~H>+@c@$o;eyD5RT4bjZ4Wm$ST{?PHuqdF;keE#%3~#&U0BH&>c8xb!SbOMneo;|dgXdV8&|)wO$Zu;d$Bd4 zj8%$vJF4T2AH{QvnzRYGR|KT~#$Any4=K@_VCX=5f+^Kc>I8dA2)ono9m0~!4x{og z``QGH!F?GPjt$qy+zVdm9b=DUu*lXw&Q+8<^c016trp_=Q31|c6+7JmwX;|oM?-mZ z_$Z51BjPz|w6rw&uEzljMVb+dgiVp9PNj7DU5(Svil2S8@vl8alZb_Cs6%`MQUN{a5Ryu-|SZo;mLIdZ(!;()|!=Q?3*a?N{0%GQk5e z(lKYaYo+(K>u__&I~{Cw&u#z&ui5PO50v6VDWXnH0f#LsT#G4Bct?zL}gF&y#u7y9(s$B3# zArK%!u!$`FhZPmcqV<^nC9h-D@TzmstIY}byoPZE@QZZ!@--2C@sg>D#ux9Qp&-&9 zy|=Lerm)*ea{N8-f|jS;{#JK2pxK@3VF8i5H+$O$X$j8pn!@5`Z>bXZ%!VewdI8%3 z8XDZ04daG8?mY=!(r|ROX|b|5Nzmk8+)xwU*b!|Uu`%NM~3;6p|wom=Y2QiJ%nR z+-aKlDtjZ`r}-B1_IV;?Z}@OBqg%^##9cM*O}JCZb6WUX{fenby7Tr1HGRYu5r*HU z7k{4!`mLg&NXMOzxOV@{VsQ;Qm8}=OtiiS_gyzd{{3?-;HK41#`$#H(4r{07 zl>k3ww*}Om*X+(e&T4F9t&1ibwmv60|HoE;T^_ie)1tzo^d z0h*ao>GrWvc3a0$D2_2E72YwyuEe8~1%h2!Bg0CRa8sq@Py}ksGJ}OCNl>=u;$>`% z$tRkI-hC%>7v=+cLZQbL7s`TjaiP_dj=iK>1-e(1R-0lWOHWYV-^$pM0*y_{CmM!e zi-|cUC0o?!nY38f_Mq8Ec!#3tB_yh8!KhygmX3GV7Z}Yvb{`o*y>o1t=M<(BKs$G6 zN@bDERzYr%ZN43`S*-Jh_Om!r)g$h#5g`%WC-Uta!dG-q_1om;QQ>Rg_&>1+;Ui z8WNK|RWm>HlJ4%=LXN&zS{d~`H`hL{&HZWpG5XbEhz-kML$)GTU1n zpHy{8HHl-|Y^}Z42K#I;hZXEzPcn|{)q5$JtsKs9e;PLLO{lIGKgS39N2}{78n+?0GP8*lzc*n zGMQKs2|=&E6j1W#N1{pkKqb(ueY0ed+!FoOtK5=5b2m7F`)2zr6w58qU%kpLVbUnk znaWd?dTzA6vZJ}poe={@E2ZvEn{?)=>PyGBFwWI2Wej#ay6Tc$TDnrB>dDw^nTTyq zz6JfhPT`(BZqkf#ksHGeobJihlV(&8KZ_q%4ci++r5&~EssB0mfWC4HTXwUVUXg;ipsr(o3}lKT|tKhmA^N8lS! zdICmmK-MxoZrjY`hKw4$BiJ!kk~u`J6lqKdw8dIpCkwm9f)E>ccC|Ez5jNaY#y8^b zg`j%|X-6q8lV8L>K@qzb6;YA9tYL7X5`WGTGcWt|+<^gg?Cl>B@5__SbE8#NZXxM5 zcvsl=tPS4G?UIT&ct==QkYaF+zz#BOwjMY-jMHN8LIX_f6rn75_7si|c77hx>SzeL z`Rp?=Q*H2~#IzQSkh26M)OPII6JOON-9#K$ccW}v3T$b1rC24?;W)RHBi1U3PW=J< zB$&=LH4X-bqj>(9-BrdMlYNG5-E)R&OV&#GNY&5j8MbvdK9rk2&pTnGDlfACx=&#L zCClVh5@%ZGf$(!e%M?<^tU#POgwN_OaG=#ay;_QuI6q|m6INa*f(4#_@d9^}XaF>dbU8?iq+I+jRU? zf5P3&^t7_$^ICy&H$jAtGCPf1(hC2^B?92Osa?mxz;{L9K-jPeYJFx)OTKzc6kib3 zz{pJqDO$eq$JRGo2kQ~BiSHc!jQcW!HlN?To<}pjViuEu8`0N>Q+il$Yd&5UDq>QZ z7D^lQZ4o6a<;t?fcjWjHiOFcv26^y!Ps_xFWt|%&$;Q{?KibrN zSwa8hx?+EX(9&4&M<`a9b$Z<|0BDgv+H{dHnx6L;+V`o>2?INHi3ZtI!qRYT6W2{# zH*?+0bqm)mTs^KH*R5Q)a^1#t8=l}=j-62zS}b9{?3l-uP5ycX9Ql~P24gequW^H& zC3+*LMfm=DoA(CWj_=#KzeW+74f|^p@by#tHAZP>8R4(D6|XhmHNszSC-M&p1}ezY z+Nh7WW8v&mcI&GX?t4jp4j*1gce2~-BG*03u+CkAA6?`+R?$Nf{6;^LfOia>J4O6s zfW?9V2P!6)htLwCd>{8!r*Wn8$To42?+3SKzN^G(PNmJ{Cbzu|`-;-Em=` zC37M?FWMvN8x;37dlN?4!5Umk5PH2Tdt=SmFx)?CQ2%x;%{q7eXO)FBb^m2I+n;Zi z%729vg@Z9oPL8IjcA$%ztt|h7n72XYH9owvB1aT-Gpne>#r^>KZ}8{gq^0qx8{X7n z?i;v27Q+789+#)vn5PQ^l@j)C1aB8q{JKTH@)M2lJr3$f9EfH}P85V`#6RP>_`-02en2thT2v~07)HXEef zC5ama=@vZO=Dw72Uk&2nq@piIviE^6!E=%`T!Ji-o*Ru*C`zZ*7wNf<7fDxpSszw$ zM(pt_)(enEwQlegFzYJ~98ZFnLx9GFM0?KDn_MeE)+$mf*gK8Jw~psZ z+gs`CG@9N@cQIdL{C9E@CwDr*S*O*c@ZU(~P6u($Cdt`|PlVV@s=VxL&B^Gqkt9P%)K+ooff!Lsht+MQ%Oz>+^N*A7VPHaP6IGg0nCX2<}?6v z7D>*cG8qsBoq+}LOMyth=y^xuW)H6_V6J-H#_v?NJGR!e0g*N!(gsA5K!g<(panE+ zuv*y*sKILG+*S=%E2yKvYNfjxtX8F`O+YvYgh`vq0pT1F&H>>Z<+;=P4bq=93jPRe zN-~)Lk4C`lA>X|{+ z@kIR=Zs>WU-s6U@C+fFyL*Eni+mduXN$1<>d>fr_qw{TaK1t{Omi%3zCaHIh9v3>f z1_fZ&TwjQG9C)3Y@*@!!{W3gHw^b1Ykt{y#JYDP>v@XWDK>N8E<08_JLEI7!Rx}UZ zE#^({iewA%WS{X;D@ggq4s7?4Hg|x%9Xs+{RH*F@k?U>~O68{zs6kT(8k7ScM%HeZ z&^;^r{AewfuGofy5S(GF$xS*`IDbSWl`ltyc-)J@p)n?&m@oel(@LAWF^Mg`(O&); z9_cjxm3M9KYHi$Ye8}6KFT7v^CLK&wO2#aIn(`+swL>61OB+B2o-bGFPZYh`#G91+ z=U}qI(cI@|6$;ntOk6D+nAWn2oYQ#r3%3huxd z_c88a>$u!%6&%#lO*=PGl(`~^8*y%y0aR#=+0{JbZ0ee)t%L_O?P-qTrwoh z3!5JZzTQQEYIc<=q7Y1e8EwT~FZ z(zWkDMb}5V=A_*9r~$)1mnj|mzB(yv2(~#DNwFqIwTTLV%2Up}&zOTtD4&}gq!nH7 zXe>ZBUD2O>b#$jv)VDW@KTysH2OUG7-7Xr-wQ|ukM0CW~Uvmp! zT9Ei zy`fE0nHNo-n%V??CNWSU*ZDHzuc(m*GS#brOz76YsX+so$gP1)8nNZZ9Me z0C^%XJdKI}#3E_rN%*+c`z`S7(`R6tr*n)BP1CGO`=;3xOe3e+6bvkm$&;yGP-rqLVv%n&vwf;`27A)KELNBc8Y){yXE`9jSqx-@53-9 z4g|7^eHg67fq*u#59pIP5ZEU6feI4`0^Gzt;C$jhpqtnS$R-X1pFW})UxeSkEq?#D z`29wo->aU)KK)Km!zQJ-8lc0VhAq0Y8a&-u4O?|*HEh!z{GKq%`DsJL)2fFP%A$WU zZdz>bcw6e5W|^`#>0o?FJ)Wh}RFAC@LPl!?RLBjTlss)MkU(t>fDpN%ekhR}s&7S9 z{BUILSKI*AmiQt@p>z}&GSI`;uymwi-q1grrPV!~rByn!w8HNmbr_UXhe1ho7?f0pK}mHOlvIZgrCC5R+9W8+?jSMlOq_J6GW*Ix$E|ptAnye! z&7IQUmTS4aEkAu(GS{+<-36Pt_Hy0KwVx|fV9O@12x2Xpxo+jUg)72(i|4osGe$B^ zNK;6r326$+G$BnPnI@zuB-4a6Wh+;(WXiS?!l9FWnQaud;5BSI!lpCvQSVS0rcf|U z06CT*++y6m;BEHa7~R=(xI6UuhJFTBo(gPoOcCNaAKOKdr5R_%k^a)76v5iZYlsjD zH~VXw+E88e?)|^0F7{Itq*kYqbt=q0NP9(YQ2E3toE);fsn2 z-r5+`5=+G$oDrwYZjIyK=#bQV$>fb6DlcmYu{Lb5o%d=D6u+FAW!34*vhQFN);HS@ zkt{5%9A9W;NfjG)NImE1nybTing_U>%PvqAuAXMYE;& zE^mF00qeqJzYDui#9fQlN4(!6II=9`IE}bF3wE&uZn2;sZM=2aRin7GrCwlNi^> z+g-dYQB%d^CA-ACQZ-f^agiPNM{%rcvN0J;N=Mz%PML~6z2LWE1|yHijfKa~!W97O z4ZYL}dE&?SLJEdSlzNT@9MzC${#W5=y2`ylqcT{gvy^e!?Bs!MmxxF>I`^5=pOfn{ zsC5-ku;S-&Q9yJ4m}{KqHXQnZU?|Tk$a|~%NBsAg0KLB$VJsDqpc7{QQRS|MG0&%H z5iVToYHi^T57QycDd&OQZ-kSsjw48xy&KQ2wlHJgX=Y7JMV=uwK`T$3)8oe^^grcK zB>dC*^nvE^wb6rn441X*a9N0{^A+)SVaolTisaZnggZ5s2Gw~R(V@*mR7&&8wgyp1 z)aJ}t;A7!{lEVt;f@rBNGo>)UjCdc$lMlmK?HEr!cpsb>5}e<&9a%S-?Gen!srO;D zIqDyd??(OGhU3JIsK4la7+;=x0Q1Ms?+M{ zwSPb*XAnGVd_?mz`vJ^mpgsBwAuRH=&joW)cYTw+8Hh7v;@p1xkyZ)bPkZ0~qf&pb zm$n6-XnDjtA?X`Z8{pE9u%7@att>SPFLESIAscvfD>QrNYTNx9!0VI)Qzc5yTYklZ5fj$09LHd^Z#Tt#S z)fy&$B#ZZQYd|?~Q6Oz~H{(B+%*V$C8?VkysqS3v)9IxgFXML~#npD) z;6fr_B;1tXhxmxh!n0rtRv~_3PR6I`T;O4fnr;_fKYC|G7KG5)Dr-L*v>U;_Bzj^{Or zPX*^SRm7s=M;F46q!nO&Flb^N>g3kOIX`Z3vg}3yHkrFo2(ZKMKYzYPW<~$^_x~{u zvRH;3nP~n=6_sTgBTKK5zl0-i3jOQUfv;oMCv#PSLK3K@>{p8{z0zVrDn62|2y^3X z)d7JB$##zlV??`F>c&RW$zK2lB}Z|Xp(Vh`g_NBjKZJ@F?N(rkOOv?$pe=F$PRJ>QCTh}KGk zu}*{>k8<3ZdjxD{a7Dn+hfO7MeA0SRsjY2TOlaAPj!CS%#fJGOZQmpY3frWlXy2s~ zHLzL@gbw;H-5b}mUS(YHxXLQ1_~h$VV2+nf)^I(4mp7}E@y06-uTEyKIJ}`Gkw3pC zJ&%$PZ$b<_J04vf$zH_>;p}eaMDK4<7mm^R+K`0Pb`NimE3LcP+v^T}I5CC*e^`T; z!o-lQh0>=j>xVas5}Z=MBJ(Ni5xfJ3#N^of;(o|^>#ckB!$ zrQ7oeyu%xFJiyJ2)cD0)QXT9eZJGAXlK5grX6_qgYf5n{Gs7m=G|TfD@}R6xtvmMZ zFH};Mm0nbCEb_g+q1x}0F4jGi8HZyU*>|Xbje|{oh5EvV62D?2F8*lX2>q`8W$z%D zi0O3d9WI_zOSu+pC5sc0TVkHbBq_MHE8#4S>VCG{+?=g0|FKeWP8!XPB>pl8t^Y;l zyxR4a9i=R2;G7TwYt_8qiS~@xnvm4i1P@wgi7iIkO3dBvEbX)Tith-fhB!mD=^y$# zE{@^KjtkY|*dDB-ZF_=kzmi$MXb0A1B=t8Zz>NxnBL9iPvw6aeIN(BEwxccnb9n7e z`2oB#V|`{5j5;k>d_5R5+o$?fBxVc1!VS1`6yqt&ympg)Pi5eb{KcW#ul^u(f#ZPn zb;b!d#Pc)EagJP=dNKcSLb&k}C9-0WX&^Dhgz!+t;(0zesr{ zb8|i2+`5nCovNYQ3D%g+!l}%7NsD}v{h`8J3ZG+B#{*OvK*fvQz~3lQlE@&7k<3Xa;rt!s>eY`!r)j7vB20Z}G?rN;2F0 z^(S1BdJT+Ss|DU2<=rCx!kjj-`M~%ON)ni}_A2Kq8#(_##q5ZP8$N%>Am3qF3R+KI zLEwAN*8MG)iO)=go1Za)o5Rs%bKC06i`q*#%(_J|_|TMriErK{OyoccIJE;fOEdUG zum(EFx~>uR9Fg%nkg452o2B?UolY}N?2qKXpaPFBOpop)bK zMq<4TxwrUV#Zh4u5HTq?d&mD)qg8S3b`c9NH+V;4xHGcAJBkgNKe<_7Hn`ioKg*&A z9e_K`Jv~GIek6ZNw0Lo`A|$sH9xXWDd(N_N?%${X#EI&+$acTlT3X`O-e#V1W4{7G zQ|{O)T#}9JoChXd_qS&LvsAv;w~i35eK=y&lacI8^o+wNjdOCW$5)UXhnyA9ReDi| zSBg4(zg;lig<=PrDoX~xsD`zZ&5*8L8f%01o1dxY6GpMsD)iU<+`Q0Vb7rskYce9W zzoCSryUx2~w7nYpuRPwcd171*2*^IzTvF+h_>2Vxl@KIV_h1J=@F04(yX!P zklJhbH?^Uh_HLF~IP9M64oe7_A)9r#ilw zax32aJZ+1vy7X(w#?8*M0!-hat6Nbk=LE_Aw-p~Dp_A0Ae@f$8q ze%v!`{i#GhwZOLeAky2b@R90j=>m z?vdqukY_@4jpkNJ%vR4^ag^WT#Q0l(N?Ezjr*hxGcjp@)I|h4AhIO-xWoo7jO=MK_ z*`I$-g;Sf8J3!-{UEOdN=22oh6&}Lzk>3dS!*pCTgfGPPdLa>Q4%Pa9fRTN=Bw^ z;z(h^WnfUAKe(+H-g-~z4WA0~VvPwY1|-`I^0Jlzw9fwn5h@UC67J@IQzJCVpFV2& zmAnt^t&ydPJwL+xx12Dwb8}O+>-ht2KFItX*?*gpC){=ZdY{c-E!EAf%w4U5B6m+M zUwrjA|E^;3)r5{KVPzqblo4e3_~8jwx7KeRXb@2EMc+^yD}tlukZV%V~*niV!KtCj`r%c^lf z6Za5sd@fw5UG=B@`ipo1O=60cXA-Q*4`zm1YrY6I9I;d7G#*Qg-ZDqZZtxa%I@MW5 zPxbFWtiZ;uhh7Fr<}xZE$-~}J>IEo;bAlWb^5xsOQlRhH-XgYO4huG$K|2M1+K@JM z6})Oh;!v3A+s1t+(APO1DR&PQr@0Ig1`F0ZE8Z)EUNQ;CMcd&R>OUD2UPqE8z&M(Zrr)^^r{s{P&<=rQY@ z>l~LwEmg5w0UU+m2XA#WTM22c`!)>2_$t{}tLr1s;L-FKiqXK2?z_zc4bDbO0}a-D zhie2z;((T=LN?_u`xS{xBUAIygA|Qe3XM(S?C>N$|uj)q{ z&Iw=9&Y*nlHFNwqx=xdJo%ah2Mnv1?@PtBLx-nPlQ+7C?W;k{&S=$LD9-Ml~6YAG9 z>8}Z$6vt2$>fJ$4Q?5~KDrY3@8VAW4=|=80CbHOQmItF&qgmHjNzQ22$=@WRck-?- z-f1k5E(uvYway86&47jY_XFph&6E<*GeBz|7O9v~_H9F|LDQE(FSBNt7=e*;b&6H?EHc5FX> zpoG_fC;x=l1zNA|(#Vv0OMhh;<~vIB`3(EK!Minl|GJuq_!UnHx<_leIJcenIGg-a>>@pHk;T1cF@Loy?M1HHd#>d#iwZ>b z0FTRIZ$N&7H-J1jARgd7XzCyWBSrq67tXm0DRNua@pdrYjO>Fdt|aYbAGDG<&&ecp zO`lEPD2l=FlFaFY-0PK+^5M@o@A>HLby|vz-u`B*l*Q0}$cykW$Xe_M@0(i%Q>nW| zcqr~n<{qu{Ue9(!soLEPvq*ZV58mwGQ5+_|NP~#A>)~La_fH9lUT4wS1!nLH^ zOj4`ZbzGqQcGoZA&BP)0+HGOLQtr#5{~5&MIaiyT2TY99pIB`16-avL;MDEpudQE6 zSEc^1EmX-$fp>5AkJVc?>SgqV-PtmU^CC& zw}cst{{km}QmHq~0JnjN+K1Q(ix%2_T6i2*JdzfEVc-z^JDiH{DV+-wN&U)8ku)qMS9)g-JMk%+jo5B-HZ zl>8Sfx!!cwCuQS{$!3KJlwh9NkFIFXQcSDFj>4}_upzRI)*25RC4Wv)Tm?BJ3O0^= zt>LHa4(FqQu*xO`wpF&G01Y;usz8L=0uyp;GY5(Dj-AV;nDesaxQ0E3h&|?m!El8N zZu)BkNMt>6dVc?2f4Eot4eg69d>g!32$KRpxs#tY%6x-2cy+g%%f(c<{4Rc7+dl(4 z?UN?0V+8s>#@-R*7yPRxea+NJvBpY`i=MrT~PE*%= z<)rS|1OMS5uKNbB8R1~CY%S~}`h{x`Dno=fAA|eqJHa)WlU4B=^g>=8LqQ^M-sTkoZrce?EPOPgexkT>}f-4T;0q2DV5YvFLhVt29uem%u274Z+Zu4DFoTlNtIn4KH+WBcUU_TJR-)xHF7hwpATG?6~@)GlX$(>_JvyZKGWzGR6=g@E#evyWYTg*cq}*TRvXnH5{hW%>bc& z;xKrbrJ4-&M@n0P{-d_}=M}qMk_PVCWc=ePju)S@$zAWh;qAgUZ5Af}`2d^owx#Ko zYiz;oWe>#Cm$b)S=d_yr9psYc%ls}&*u&nLQk8wQOQo(G8|mOfjMY-09>PMclNyBw(aQ>IgPoti<@9-UxK+nhdxIh4&B2m5UrA6Vx; zMlvGIRX>qgaqzFADrUjrb_L{vJPPvG|q?P?6Y#;vK`;RD%;_RA~~!M4h!sjWbKuN0wsWLB~&FnMHJF2>b>U z5{uSFTgUsm)h4cUTgUlPl}Ol0!byCxu(fzuXd1bVckZd&D@D?gWEmSOH{!AQ zwRh>x-V-0S4lQO|t4-1q*Ll@N9bqkYImH6wzG&;X$dz-TGRD{my=G*44)}kF{}AO5 z_BYn=av8R1O7C>n!UAz_{TS$_4kZ?oyzakdBP)Lq8~MJJOGYth&N-W~|M94xSF~VLf==+t-{s{fYh> zprIbman2R&8tt!e9}>aM^JZBICaE6lTHItvtc~D> zGNE2u-$@3!HGol2*+VkxHNdqmX7c{BecI@KRca!0);zI;HhWMbAiDX|3Kr6%n7`ZQ z6Zlg&KLbk%~5{$SLo{cscG z;_PN-<$el;%LIx~`dtC{Cn9N?T#4(I80PZ);+y)?3PCR{956WxS2 z-B9mPZ-Qm`H>BoM#1uExLmBXO@+Hfz^$W86ogp*gYWQmQsz9iG%6soS05`ud6e{0G z8vZ}eOTK;By9ZDsR@U~JQma|U$19&T=WDME(%oq3(ua`sJHe}O`>$X)wKoT^E*?=D zu%(WI*?@Ghr~O(Jqtz>1TBB~^BQ3hVAV*cwT%PP5m1?}j~HuFZKvneNcT*ct(2W8bftuvL3HkCrLXo>m=Hb?8UuLXAHew1|IdBzu z#Is_pi;rXH$YUw@#rXX|2sC{{Ra}^IpG~W#v^t*spezGDtcer&mNV2k$v6mZ`*+D9^w8roKQ#|HzQnU1aq2CFWzP1Y z-J1Uf%4jeEf(u~~H%9#Z?H_}G*1%ty**W|HMrr174Zvp^0L@>>OlAYN1p*KO2V59e z0XJ0bT7NWOjYxP8vfC zzu*$dYy0Uah3MN0usHP%yoJyy`{YlP?uvnz%%iJs;IDRFG4Lc;lhS-@DdIkb`Ldu- zNS9FH#BH{W_8NAUr(%mQMtNhIvD;##H@-g7{|&bn2@9xXh;7?QWz-g}xNxtsl1tJ~ zwBjq{DoZ*p5>Y$SKGtjb0ojjnOwS=}8skT&`tL-&^ge`Qm8$4IqPV-V0(#yB!nH3- z*>I39a#Av|7Ni<0mhH)u?mo5{7UPwdlZf@7aRuy5C)f#sw1vrcMq7={=HTNVz#ZKxH|3+)ZBnyZ}5^xuj)sj4x$rdY^dFj z#s%{wd1&}`e#2#VrtKf>p|(FH*w%T|#Pnzv{oc_?@3^b+V7R?OQ+C%Y+CeNsWHTd* z?lcR}yM=XVCsRj-4h+3kl-ZHSI@--HrU``=2!Jbog$m_cWev#nmMvhfgPsSzrFK zi;bNR@qER*Ovpv!R}IZMxgUMP_$}z->&WqYaR2{w{Kj24V*FM?*@*J=%7VdQ+cYrUFK-=;fOe13=}iivEj@2>Cl z-+bYM@)Bfe+}@vdvI}d#jMpPqT?wY7I6*dvJzo-vJx4noxG|P)K87y2XE?4?6CPK7 zh^^*?M-69=_vO(MFMWStr*QPJ?N8uv+8Rrh4Bu;izzVB5535W0HFsPS?j9h#s)G&j zD|G`eh{p~edwc|QS;0g2q_F;eM5FL+daLET)AF@fg{KkMI?+*T1j}|OhcDBEL4D%Q zk;Hms9K0lK!>(Z)2ARpic4r{z;RZYu%;z7kfAI4x;39V;K~G6RTMR_r$EQ zA*)Qd)xRh^0myl@)u`e9WEF#BnLzp~N+M}a%uF(bgfl^cK|uxx8VPDJUJ?U3Lnd$rCW04~YE>+n+G^F38Nmw@oJ2An zr}Fmp_3cf2dEeT5>(_F#YAy%?R4!HpX*Fo8XB=(uwQmS$ng4I?b7nFDtiI3leb4{@ z=iy||+4sHn+H0@9*4k?~K=g!RFg(APTn&3;CZnh)2=x3&LK4WH49~Z$BEP|pDu-*A z;ETtZAFY<`p1UQQwTVi@i(cCdr)e%#j~p2Y5=)T+C|=REk^X$5{5KQ`X)aCuG6xwP-c@PMk1n*Q}hR%jx=ZwMEJ;(iY57^qIwur zh=uab#|(@4pV14d7dez&eQQT{uG;kCZhvZ>ng+S)`swHe`R-TwhNkSNqZedsB4f50 zs7G~Q`g3{YVro9Q2xsx5Zy3Ew&&a10W7mEPO4Sm-+kXk>b$+e=S%C-Z@`FgnxQ2f2 zQa6h{t25_pvjcOgUcb1amBs~pY5r1suEl>1E0mE9EU1sW{?Amjeo=56o`gR_`gWMr zR?+W%?)ail6aOloTzZw1UMi(8!}Wy}T&!3jdG`zN&LZAAgm2O-f!G4+w$djSa& z#!1ni7A~vqk%@}D{CA3oi2zgRpSb+rz;BkynSV)u)=AG(b`fIJYLT$d!yO3;Q@NOi zx{xrbVTgnU%xQO1BqS_=WL=T41cFM7p|b*nguTS9v`ClCAt7D8EBK{sMY~sTmdPf! zuCl+VLU`6R0;<7&#bZ7yB+l@RCqPtl<<%0CD4%ZqoFzY5QZ?w6C`GE?Q?KQJlOLct zRi?Gy@<%Yvj95i(lgJ#sB3|t}Fo~K@e3nbI+T-NJsW)P5i&S^z} zL^D|fO!K091uG^P+)9G1=MNV{1wjG7rFr}FH*FA|z@BsoGV7a*WGL>dT&%5gc6zSn zOVmjduID8=-)~-IH+R11cT`dt<2v;wYK{p_>UF{#>t`-MA80<$+vsjT(8^SKNg?j& z8lb7{0=A~Pb6RXgvK^^1@3}{{f5&4(W}}B@S)HgdCrJB6OtnM+Fr@y@leZ!IHDGIA zUH$&wpZ?`*nnA~n;|tryu#u|nzT4wrm{)j`B+xkOUB(4o6wJQ1u?cr*79B5UYN zvy?=3)725kz~s{Hk$S!EYef_3NaHpH#;<;4>uEw70%A%N5c(iKQf$QxYZ^KkVv+ou zAVS1>5i7Y$nJ;f-g_HgtIj;Z4r|rLo&MobWOxYHxFa0hb`TdW$`XWa8^^%1C^V96w zHs5e>$8T*j420G7`9@@Ww(FORH~^S4@(vbA{7^ylF^)Xl0Gf&y6#0Q=}C}Y+~%7)m=a*rKK(>CQI3@Uv(;PxGiEp zbaV^V?6ob<@(c|v3$t(bK<@teWi^LzO;PQ%EbDsY_T}y7hJ7NzIVhmfWmAmNTg0-l zgTk6emZ=##GGZ+CMyd~RtGieXLg|0MoZckeN5x8UUef)RHD7hLFZ9=3?08W`py{ zSISwjQKpv#8hZtxCi?6G)4F zfY@YKa|pwR0_}ZVq#6kHw*!U=1 z{ZG}$o#vTTVVP)3e;Zzj`XkkEXZ3Y>IHTC2aKepae=9zg1{mc`q+QXIDgP9iuc}IJ zpYssBI|kB#Lb6iWF50di=HE)uhZ<-D;-9@t8Lma}BA$e!WRZ2m&ThuNeYXBc!@>#- zoPyklAQD4GqTDuzE2*Qeg^hj0Xzf4bOBmBggEux!q@BWJS*!0E;QN-jUT6Xh#g&65 z?bB%=^2#9c2UQUM!#?9n-+<5}+YtC`nx{7Zs$q@F-(P-E^kAA%Qp~VQA^dfPNCG5L z_SiC#fG1TIhyidviBFaKMs&uXWe(vu*!)|ofFGeWO`?(XLCl}ClGK3gt?b!ZV@WB+ zRjQnM`!9ju5bWrqBX%yHP%HB3sThX=!V|(za-0}`lLUUEp%fr4F@Hkm6fqsOWscXG z>LH(iP35=1MvDY&stsokflYmj`#3fy?c|bTvhY*6hv27@9tS^_NZ=dYb@X2HcmV&0jNn7+id%h~@ zlT-Q|oBQ3D@}I=7GKH40ea8^aY>-ltrCwoT&$vx!2n8)fJsM8T=H&c*Mg?Qpm-fw^cl$6U}O%fIS{yzA}EGsRVpRD z7ne8*T{$k1Zy(C0gf~q}_$5w(B<86MIfmG3!j{#lZK^0*6hYd@WYH7qCp(9v3^G#_ zYp_+D?v0g3a$f^<8={!9Eo%0;dSJz>;K8_0pN`WUSh5NAO>@XQ4N>S;4{= zyG&45AR$hn&^s#;o0_iw3KZ}@3N$_i8XwCPy641Y6!GbRA>N!pHTCnafl(;HNOLkk zpx}*p=yw_%5J<3Q29x$+0{LgUyL#ph z@_!2ZafIF|y_R{eb$kRmWaS$c@+th^t1!dDf0eNPMK$IY{xjmBZ$AD@n%KV@bOzyH z<3A;^isbNL3e0{UhyU5yPJsW`kb`12;>$NEb^?r7g$Tw=&4Tgro2`NZ^w!V+;{wHF*l%Ta2v+60r0lHfqM*a-)tDT9xh!64T zC&2#zEQa}Y3X`=59-B?CULky*h^*Jz1RM=X+bWDuD$Fglw~_S#pZSIXT5*`rt6X`bEVNzqwY)DaM>VOipqB zgUsjre`-IMZ{$Y@YS&+dUMu-O*54~y^}QR`<9gV3kS$3$^WyhIxmMkY&|xo17TnbqN?5uQ znZh8omxU8o@(be&?p{S3Lq`Y&0TK~;dBOY}02VU1LU9(&iSd;|tO>oWh?@n!PT<05 zXndE@DD$#g|MmFFl=y`4ec~21zOF~q_?|a?*!V7j3(Fr~B!BhF1r=8I2zjv_-|3KHKb%C;XyFbtt_Yk;ELUypf zQz6?w(5~;+&IvBm9*om9%qp^bOU>G!bL_Vm@t|uzMmzVh6`kwHzipM0C?ps71=Ex` zfnikQ1RT_S3IW1^IvRo#e-R>xM_t4R$P!HP4=6)d$7mr;08$F|)m|AGRfUm_g8i3y z^$o&{^AD@!9x=U8`(N!T+5dh{mPF-99j+%MYS1vqA#{i7t$x+Q9ikR1pibcsG5S!7 zD@6h&RF$Uw*eIL_rYeOtd(GX)bE|1?QeQpbd{xmU< zs*t{jgu({1^_^f&F-ui2tD!vt3iK9!%3_I7r`{LU)r!Y2n|`RxNanCTdMGpyKq z!-R{;xAyg3^IYs?+R=k5z@@=x$v(8vvS)>Tl?jvL*h6;KVN-euxbWC+JGhG7%=Wj! zeD<)2aG)L#KCX1|YU>^phOKkW68=i)VjE<-)}(w1E|x-WK_jXgV`XxoZ$q4gJc9s^ z_!6>Ag~$Mje|TxAs4PErzA}&T4Zv+edXf{cOagE#DT9wfFMIOu*Gp)Or8wmPpHe=2 zr0jte2gqSS#R%F?4lVZ)X*C~m)BX7Mi_?4MCpf*Ae(RWndp3O4`Z`?J1Uh3qq|Pvc zsPAv|LkCQ~MJTCSZ*P$WZ;GC%!8nJpUFefF6RFEcg?u8fpUoWWwVWY9{G^XpvaeGj zo*yq&)bPLMNKID$1Npb*KdWS_f(Q!*?F7jAqHWdUp{s4OM($T}VKpw=SHIgPHEnHr z+}f3Yx3Y_Gd}p!VE_%%TF~V)#h%HurAI}r51k1yl*Gs1kVvQgAn@4z?Q;86B9^>VR zar0y1$mrqq)^&JJVnhXSotd0pWnOeM1&HMCDM6=1Q@@^|K>1<*Tfg8*Q~#EL9}*+K zlbp@Q-y+Fb50|^K4jr1m5ZHw0?e~z=Bs`||ld^u^v3}D0L=tEHk)Oo*FY|Y+XBU5E z;lWeDFC}=w2PSEfrSI|++|WmiT%?mMT}z~CVBrF(*4m#S+$irOja>KsWBJ1Lc0vse zLOz=1=eala%@(NY71}yiWzkG0cAM@PR$`4G&h#v+Z{K$J`MNRxMI4*%=RR@W)u$(# z1;9Mbd(E93F;Uh~i+-cNGgw0z<%_6N)sR7u(i^}T;{Oe*X-!-=AxYCTM8qc8m#WRGok)22x*eZIDPc$+iS ze=&Mdfzc1r=Y-)$Rf2Ige->#tg>6036ILIIi2jYKstQM%(_<{GsJ^Ts-XqXiDE8qm zm<#SyTt*J;OwA#%pS~7`*MfI1LRlN$zgY7BIe7nvO#gg%dub!4?&mP09}@xr*t^Uk z?1fPoF76QGbX^y+>5j=ln~3@a+PLS$vfiRA7_GE9kh*bMz;Gr~tp`^O=ilV4X)sR~ zrki(-Qb3(A%mQ|G_foG-kA;7;?Kd2X`SHx#M-wa~uY**HhY=aQ_p$U%oT(?i;1y~z zgpbUz`m>g&u$yV`CAB)rwMj^VEMd<)VG*;RN;zFnj7@)m@FdF*`7j7ccvg^&pU+r7 zpR<0huzqfmAEm%gme%oZ(V4BD0Pm{!gl7h?TRpY>72<>v)W>V$tgEQQ^pqyzP78^z+9|+w+57O{{sV1=F?s7GRR_| z?&=<G&#*V@Kc)>n+Mv^h!=7axq>?LgP1v(+ zd$tLe<~4!s810}9+w$9B`;!t5ZHXNJff~S~O}P1O55l`^Isf#(0c3Nsu|nye`^;bb z#zF~>d;(Wnhk=zur+l+w`$fGYALb9=5SA)L2s_CtQD4_-InVUIumDio5uf|)P!?BDO zmNwH?J;}*f=r_v6YoB5jY7#?{_z z$ze+VK#>;g5lJB>3l1GqvP5Od-1)GbjYUFt^!%K>$B_^3)6{_kK=FVJ(rtq}yF^~g zF~UCqanzMI#D`+CP`Bw<&L1AGP6q_yvfDVd~&n*7SKHn(4l0xir&Wgy`zE9cCu9}1=-?@C-KSXyW4he}fi7;`7rwe7VkG+xZoy9L=wYX4Ow znp8q{{-}patPOKr`agvpLJ*=#V+M(`AZY2!L=!2zp;&qDey7=RMz68QE2!Ahxytvl zu(cD^cE@6CaT*L&gZ8OU;b)bzWl46D^0N%%NGys}f}-!qM`nBMm#WAxtYb{i6?@81 zIids2D-+qBRY2@yfzOG{#UMp%U(KMc4I3gGM%CV<&yvM{`L(J#Fd;VYgteVFthUp0 zwTTEM#MEdAh+gZMe#kYw-$-+IP^b)y(#!1j?DUvdiY}ENM>vufgJ@zRFU%mrHe0gU4%G5Z1R;!9O5cJTzsen5=kqu;|IlrC-$SNGwSK=pB{Rb7vz zHB<$l`_9!?Ka9R)gFj_`v9-`T429Jgj-^lbe5coKv_CbHc^fg%C(E$cF%-pjN^##cWrHbXK=VLQ@b6QpCOYX8Z@ z+TWLJe^$6x|3#nH@k6`LC|uPJJ#mdMB^2M1AX>$gS@ehe$opi*ejviW^lfNOX}+C&ekq)$HS6G9+^5F|g^x+XZ= zdH&AX{?2B9+e$xr@i|OfRYJoGuhuSCJLl$0+bT&gNhQGQ?XcF-p}H}jN#=LNPTmp} z3CfFX6Sg$^9p?AgS|ET>Gf?aJno7##^mDpV$vb(A-j{ugog&&sW4B0QD2I$Mn18Sf zK%(K7vvol~<&p@^9959eyoeMEmZ||`k7>YtD*s3|Cr{2*gmA!W#i>?3A~*feQiagt zj+2>F=|DCOt&-Y?HS1Xm0LQk9hFOjBQ0>_B}EPV%!uFrbr2Ma>h*pvK->;Sk3&;ESr?v+^X54sMh;2HXU{)C$MN3GH7zC zSuT@qm_gIK(iPjFsb6)=sd^QgEQ>(U65Jo#08BbIs6P8dFbr+jrAWDL#PmsB{zQ9@ zkL~m@OOB84^rtdhQX_Xdcy^4{lB~0eF&v^b@}}@JPZw>xYMv<|VDVTONd_uxRny3D z!jfeU6NY8;2Oz;4tH@?LBji=;BV{N7(&XDq1pHDmsPwVM5;un#w&a9$cQ~04`HegpPhTc}R!a}kJ$(dJ4 z6l)NAmlu$Ceoe)n;Jm9U9061})y2O08)xsiUBf_vpr)=#Bt1R2Gl&&$06RtaP}dv8 zcv0RFTh1{q!zs~g2GF?wDpk(Cda!6S05fEKwGnozal>#{4k?0?dB+J!NDT8!+7|C zUHs^-?U@6_-hGJ^aWOJ6xb$tbrz*7`X)qCskBj)e6>*`8kWE20M~4+L_PB`Ktcd@< zSn9~nafKD}M-@?&SJXvT#Q)CEVNR7mQQZ4!cs{wGA&?ytL{=B_E~&gUjyb+f~@Lt8fnoj+MFR7K9M$@DhtUG`^f{ep`4fuhW| z=nS6I;)e^UD_UgUNGa)BF1VwS%#OQeIvweW7E<$hgM5}+^N3HKPif+3rDf}H-~^TD zG6{0+MRCiegw9M?WN8<^rIV2ww>c+(q*+_XwJ+D77joiLeuw!1WP+d@&JVV|IT&pF zkZsD3s90M+_q2^?K#GI_RBb%VemiYrt^GD;W4--Wyph=`>0)0ZS4Fp33_)sW8XvoU zVD5~z=wbpV#|OR9Kzz^_ogN?bR0j^lFvKkQ%KGe5ak!l z8|70@Yd$esJ};Ng)qIL?`#UB_l2hCM@nNQINH=h zyd}QUflde~M~Lku!8#=919L0<(JB=co5Y1|E5|=^mc;$cN0m>5KRXV+YJN#dN~)4p zIs$|V^Z1H+0i%|>i(upA)EBKEF*h5kU=bBOf#4f^Uy74)n!y-lqP6IIdgJ}8W`X#Q z=+vh6{hX!!*0JqhL!KutlH3z`Q(711n^eyQu~YPBKh0)#wtM-T$q7BZM3Z|$X!M8u8vuoY1#5Kfila1J0RLGz+ICC zcgH|%^b?`QyD-sWHQP<;?Y}h{#;8J|#?R$zwHT8_HX4-Q06$sy25W+vZ|P$cgwJ=3^@1@#tj| z-nOb1yqyizdSaTSjS?nJss)qkfa(fBUPjU+e{uYP}5`5S(NPeV;$rIo(yO8iO*yB^~6 zN{WsZb4GeG)i~0lu>GK#pcdLfip4n6tRP(U{Fbt<+1R{E5{3+1EB>OgPZb)1)h-89 z&|KDp43oCr9yZ>!_lt&>95b@vWi9?K(rUgYo@VaHR425TCjan!zE)a zx0{42eTj!vdHhKCu?e#+;{e!_kPUb9KhBjJ#pNV6VI)J%U&oUCx1ScUUGco~-iMjy zTQfxw*I;~Am0WR04}RCV_6vBbKieomr&QW{dVE!lBjyhdJnM~~qHQ`@x{0-lGIu75 z%+H@m|B{}yQq0n5<#_zh6~snro8CHk*%eI<1JOcWPhF-52DUi0_D9HOY&o=xQcr6w z31{d+FcYb)SW%_Ag9AyN!U%-OG``g{&{G#1#p{^XC998g5!||1G}lYSFb&C{h`mq= zCO9RRKw_F`tm1*YYOLGRcy4A(V~sO0*WGr}ceIYbGMU@vpYPo;{R|e)MB`~{ZUy0K*{^}A;A#~H04&A8U$fp#^j-WWWd zLfJyg{~)oWTD^0P-~Glx37@L5fPHR(oJ>UP298_fi4~hdZmcy!NDY}Ox3N$n@~=Z! zSrZXFg5!0l^^&#!Q%rxDD=m>)#nQ8vG=RKY9L)ZwdSBl@dsknf zBlQFM5;vq5Z*Vx7vm-bLOQWTu@h}H^iePcz(z}?=Kcwc~?qCnkguB{Y7^b8?Br^vi?bvB+K zb8l&!0i)C??Alm(oB8I4eD-PUAD&lp3&oF^Kc2J;;Ef=9iez=pzd%Afo%1i0-@?xM zb^Jyuebcsg&aX*(?46=*2pHddXTB9+V39BYK`}~B-d4E}PQavJI0uRU*5(A7w1{!H z4~dwp$CVLdgwg14Hu^)@d4|LT@}gC;Zdc*9UtJTtXpP8rxNR27W7)BZHCZOZwzo)j z&w=#F$DLuVX}i*xBrY{T$Xo`^ve5LoK&9F&0Shw>F8L z1||<;1>dwYl(-HR#LBHaT-wm|49_b(uk*ak^Y=v4AwU5IPt^{Xznx@}s~Hp-GMax5 z0R7loKNDss{$mP+E4H&bw)IRL5JRo%m`g`Bt>Z7WhYlaw^*DI)9ci4=w3B7F(%2cU z-We9-us-b(aTtjWb92LBYg7aSfu}74x`4yjDU)u5{)KIilNr?`26^n`=n@utnApqt zOb&VSuwVsQu!1aDK^ClFT}$H26^I5hnXOxbHO@|SX}uy9z&o#;3T@c6>__UX1JzZb z%v_V;LK=G1)UhXap~4H{F#4%f{EZ8E(GqLIUC5=ma2GPp3KQTkuIp8K50>diu95J=!(Ux{7PaLj6Zb6WR4ktE_WawhM z)t4)nF4_rPw<`az+gn#y7;l`QFZ4nNz55fm6kOopykK2WMjd9Q6CV#U)#S;Q{cw4h!g<5;7 z6*eLlR;0DxK$v(FhuDAR3f_%HKetFk>LfOIN)(a`5Uv>BEkU=#k~CXlX~WrhrPpmB zF4_|Ex*ZwkFlqI3&xM#%@oqO>np4iR5w9!xpK!^3QLXO_a>gbZ@k+dT0Fj@w!II;} zvm(5q^dX}_vS69{s>&jl>Pfbrku4;L1lb9NoEYq7v#R!L>-J!$yk)j95$?;4vPNya zo24yO>~7@ffVZGCR9qN$7UWuu5}EYhY$|ZXkN8^4$*w2eUp2~R8*Z=UiaTAs+B(d6 z$0Rs1NoeuxM9Arua|p%m*_|OLW9@L~ip%Pg@2m8w{)RZZodjTV_e*ltM4HtS+*(kx zqB%LQVB>g&A1}W6PW%nc=n0POlJRw4L?^?U?qFvy6HmEguLU7HOZy0n_k%cYcJvfZ z&1D5_>k6DM0fZM>`|K?tG#5iH8QQNv;fDE_H=H<)x0-YxL!sJ%%}mSIqM8+Yd@JI` zSA$62lV{x#1dPTjs9SUP7eOPxy=D5+9@X3)T2>Y8oGnd`AO0w|ml0}S%5;B)3>22v z$K&$^rJu;j=!ex=dP=EMqzDXro$h+oRV=Bw!iKJfI!hE7{BoX3>F=}fj&Q?W^0QfZ z|2m-H?Gkv;FW5K}c*~7?OS^Q{9(`obi6H(b3*13Qg~iK_T+9OaxZ?p{aU8(y_FzvS zn}P}&T-9VOWP7+zU%K5mYP{V2_rmUXT=BPx;%~d+Z@}1cjYd~+pr;@@GPqh-OijGU z8$aTXm2&pf@E0~GBgUk3vHB>YALoKg@uQyTnPhUp>sfh%ZErZ0v&dlA8?N|=1#Ho~ zLIt}*1uv(oL-i2f=x2{hZzn}e*Vf}nyZKw*)LBN=Q9mU_U2Q$SVCR*_BrabZY3vND zMJ@PZe^X~;tr{#D4j2=<*(>ekpqh+DE>N}Da|}Y-@EL}WxtkpjPGPehLfEmEq2hAX zka0y_^V0X5M1Kyeb69p;cZ%aHzfVG2-|K*JOvW z3lbTHf?}~9#!2r@0Rm@tM%GPA&hBoRow#z{cqR}md66=U}`>fn5qbefR^sjT1l>#>TRBnH|>tos+Up2lUb~5{c$4EG|hi188 zNu@0qUEKqhXLnNdF!f~uKBl-sF6oWdKF7|(N45#6i#|SEyxX5TmFW1rRorYqYXrP@ zolHLG>}1KVWbh*nqb=9s-7`~vht0QJ5bv&0r@ib?)xvo96{+Wjk{mZqZImAGzBVQ2 z{qj130E7U$+Em-{$fyg5#=CD#wVoiH8hp{mH_28=k}NzX$ya0?vz68!6Dj3dfG#7( zg0RM$9I5EE!4QB=L~}cGz~ze;Zk1|8Fw({kD|d&mk9-QunmYaxJ12gmFgA_Ju+Hz< zGUq&BJXmp5>m0)*Q6>l4Gb{o)p^DG-6{OyzC}zl)_kWmS-nLFqxr$iQ+6xx5$L^eS zu6kc0`)y4{7Um*Zc-Bo~20CLCsm7ZLS7@ETqCBgXr>$BtbA9QlBq~se?6!2~QsuRU z3nii_$B($8qiMg^5he}2(b@yNY?LmiP|rAQ+>n0Giw}BYO;qithaYL3vOiIEFU@t( zt$7ft8H2(lJ=p@za8&Dpco#$q+_FXw1JwdR6<0NJC|Jt_ z)ieQBv^W_5Yf-T6pPtw$s(W)QK3Z|Lvd_%xnzrsz85|03JDlM%yLH{^!nXTs3tC6V z2g|kgZJswuq34flXKohQyfX2wRkTR zV^G)D;0_M}{;qPDRHD`r&tr9JE$O(8->~cX>>e+}g*@*?wSht`?}JJN-jrA*_kJ)1 zR$mHe90kEmh5V%cU8<7srd+s0r&de2@q%o^YFU%~tVv%E8r?bS?25f?X9y)PbEg-{ zho3A;?3%E^M?0xFsMb$YA@52XWGgi~_;v zO_fTz5MJ67Va2ZF9JBkC50#8&t`1d!AAfQ(IrfqRIR(NB*rX7ZZy*3v#cEYdGX3TY zi1QJpJn3hXDTnWh+YT4X3B01%XbGMqQlABuSf+72ykqJr){`t6Fp^(+nOc)`xNi-{ z;2K8L9>wYP)+oMfjbezMx{Pt=fDJ}tj#~-3Mq1!aJx?S71+j5Kc3Ai+R!cRBHmR}u zm5M&|f@R44-({ra%H>Fa_6z22bq4QmJ& z@a0qLHmk~z*0d{q(XqpquF4DXGoY^YSPL7|qb&4G7X~*W5)kgBi=X3%D>>^L?n)E5 zs*!3kwy439b*Y~W>YU23k-M$3Diws<0A?o5)!LffY#kBOoJ4dEYFHuxq1_cGyc{XSigR3&DeDNk(<8I7m zT+cplq#kc#g-dgMS1h0!gGvJG3a&m(Nv>F}4fIYLupyAGpK=DZ&T)1*VyI`8<4ygD za_qWQwKA<@XAR{PQLmruEJUx$l@_#L7iz7V;ZEH|_TUD;)Pp?k$;npA-`FV)Z#Lab z(y8(VyGmQnwJ~CvUA56P9zI}{*d#cYPgFoipOjy2x_Ahfs!0l>dbUMstr?lxQw;t0 z(HN=9l?TCzc0w%=f{{Om41JfBYKVv z@?iW;HyqtHHb++iN7u;=P6fyZJEz{yi1A=MH5b!Wq?L;+@fv+0Mi_t723~ zq8Qk0_F1DF>b&X6Nfzp)PNFPTNL$YpRx<}j*uW;k6)MU~FPN743z69O)$X^tI@Dgp z7Pa+UYnAakk{#C;%DYx2Qw_>1^bsqyJ6bYSUV1bTaK=hx=_?X=Ty`a;nZmRO;34w+bUD7#_LE8@Bvk}$>kWkaVpyH!!(I#Xh&>V zgwO9tJxxUL&~CM;wW`I76-i}t1RSZyh_#CXWKy^zR%g+$cUhQa6h|oNC}1gCu-==P zk7@)mzFtQ$Wz)gW!ugQzh}QYLY`%Q*CFvoCxr`7Qm9a22g^VyuRk1U3q(y{zPfk_@ z?(-BTc`asoq@HQ=rEff@!O}=??DU~#(he4l>A9@38L?Ikwk*fdYIio>5LIVwoLjK* zL4YBat`D@qNp0M2f2~=@mr>Z>b@yn64kPBcg&zA-*AOm;Lbdop-lUD7g+zH%mk^Lo zzVCZ-vZA4$Sj`X(JQW%^0+w(>G8j0H_JbqVLKTvFyn6U66Ba!pO`KprpU4ok-6Yyk z>7>ZicSxUWtF^f0HA@lDDuFGtM+63kF_fwjsv@f9iSlAEc2`hN{C>n8*-e498ft5f zpr6SmI-5jo_KG-xGNmSV`ZE8dM>G%Xo_jLeqYE&5S+7+I7?4`poY_N5+X^_LL8w8@uRIrM2QqwwTv8Ab3k$KBTL zR}<}+vKLdflp!d@bVU2y?T!ZQQf(ZkG%Srg`1(p$iwV<7R-a02Mmrh2_&BtOMp|f( z#uhXmj{2KfF7r{pjG8B%4w~P~eS4`LYy~Wac*9sq5iCb%wJX$l<&%?0bG4-T32FXs zwi%KMb{sB zKgU^iqfQX^!Ufh_oJ;q$ssJ_l1#^Y!BM^DgKa-{WZ!~WvYOlBCw@B+a$Zu*Ne}r8? znAhXAYG*SQ9j%t>ww_z9+J8+dtA;FZ^gTjUdos$~pxT<`w`X8Zolk3TVaM6leXA-g zbt50Ss)m)HZqD}GN;=f<^vqnFwD!L+ztXSfir@u1>n^CMMX8X;TQtgo0oW>CSKHv( z*=?{TC~l_BH&nSD3wcKKJjgSF=kq+@=ZW!nc#fRmcI@N%3hztLWT27Z43pZpOFShd zg+)$p!3YF1pZecO&T4*n8f8=Fqdf2PoW%EA{JzffYn~T)?j~#+&uX4Jo@SmKc=quq zd6LFIhsWV5l$THZSLD?+Pmyh}_HbHjksg`gi=V^O%2j!eKwupUpTd z{QuO)|D<%`+=d{80u&Xp5m`MmjzG3l^}glB{+8f~z;wAZfwNP3^0JxMISg>nC_Xk_ zaJp!=!t$DoKXNf2 zxS3Y!iSgX=F=0wC?BhiAt3BaracYV+9X?c{yxO{gc-O151c$UW$_>}Iz#!M+OXT2J zypkW?wIg#t441VIF>(&BmX#gx<+_6A#6nK3X~C@lF`#h-6M?#*p`QTMO^L-bQ@xTT z?)8yGb$$3~kR*_L%u3=V|bhsw#p3uB+&BQIcddYin^ z)^wM=_;^__FMd^?g7IFG(5B%qQgXdjm(lG)D9$iYl60Dk0`tOvR=zLLpxAD&Du zdN#Ib2*RbSbb(qFt-(Fcu4N5UvcusI19yQKZN+m{0BaVn(S2wao05^rI@}YC>veA7 z!PJ|Ni{J}T!Q8is@;Ars9xA_N)onq;XY?rB;0dia;cNxl*K;1x(8|grwPe!nP&)uqGEGK9@uS@C<(gqiUEhjm> zy_;vb9gpxl!Sf`~IG*QuUgmk7r{H3@V+p@;o&--V-wu0aa@xOH^@FR#eaycTEnz}L zPZa+DM%ajw;*mr2#VC-Ym$9O$jtcP0Ggan1!oU%nw(^Xa?dEVzTX;sB(LGCvA!?)3 zX0O!PwXZl4x%F9Qm1(u9BZ75Rsoy`jlBp*g#4UIEJZgct$wwkspwY znoEAFY{)#pEx{R?4|=iE?G~EH{gltJ7Od{i(4dH`3p<;KgO9C6wh!;>g8Y+ilcOIF zeaiN!l4g_43;kOy4clWQ!pZj40cFmVbN=YIK*orI^Mrz=8{+u`Yb^lj9LBBlPoV*!Fd1cP07oSh7two zCL#h+EVlZe339+fOS6r0e0OVlH&y z)48q-^?OqK8FqCc85n|ryLM0dOmehL*`fMR*Mm4DFXr5s>U+AxJ_w{bk1-Y(c=BhW zw!T2WwM%JZy}mzi1*q}xYO#DqO4G3;I#M)u&|B#($zuzEd%F$yt{ARedUDa)`o5Ma zy{iuh@Tt02U)mkRyY~3XYzri@D#toRrP`5SKz2N;4i((#cVHDXo11+0K~16-ysLWS z_f&DN0Bh@RwOpm;HQ>a)#FNx?lkm? zd|5$IIq95^jDp3*7p*WF>oD8(MKv{Ie%tfuwY>w~foNf&&Im`-5?FTC@@B=ZY;H za0Q~i_WWa6gW~-DJ3|tg-KxBj3{e^5y3+*6Y9i)VAAujr28j8T0LbIeg~D^ zt(=A1#Xe43|EwYhatNUP7O)a?Lm`1{gaoGg$fU}{^RFi;#jGPlx*Nd>O$aB*p~Qj; z&SYtw-ys4PX*8XPjaMB=5Q55&-l5wzufRYdwL;1}>d`uWKrij%I$kk9d!r~_xVlGY zyJ}4v*LERZ3v2?ewa+3W#7oT+*UHbZrROWAsis3e)(G`Zmsy0(A|H=P2l9wlolU&f zSj0;ywnnISinkExOlm*BLE|O!rwGVWFYuvadwJocVeHF!4f}=Nu=nsoO>}nr7$GfI z7UbqgXsKs1u6I*wRBqSG)AHfmaU-DuV`+8jCY7X6ZuxqVlFWys`UM0Alfg_lc{w)W zSNjrk)nvbbU>n8}z-BcG;JFZ)uYdUJ9Js`7rUkBsEn4zTfNenx*C@Q(P_yg*i^R&9 zBxOt#c{X~wO^9TXt6PdyNNZTIccSQC->nL0PX5>e`#4#aFUSVVDngV3znu7+KoKRC z`mNh!33<3)jlw|tBQgpFu?h;X%7$p-0zjj?!(ApGmPH3oZZo})(*%a$p-Rg*S4{Gb{<$8N=Q zwB_?0ofglLT91gC=4Acq>@)w109=NQtQM!vm>DYyh39_d3qu#XhK1sdfIm1AG2K?` z|DL8Cj9iMTv`Ve~PjnhpnY0zqQJ~W_a0%rH7Y&kyUp51ZA^M zsyjmbie8(WDOW_j*lO-H&mr6J>rQEKP{`vz66k}%oW&JPmx|aW8bZ#`ib+!~3F|I6T2ixuEphtfsahZvGwBmyj zI!Gl19wcxu_D3q4sO%#1%Ug?+Rbi!<{az`PvV5> ze8ecR>WgT-BX}<3j*mz&U=34`y76myW`%Hk@T6_D_L2{$F&YFMUELJvyl zVC-k%)uz-CUOgy3T3n1b54M$5I#L_iP#)iZV6YZ3&anf8<~=(`YJl{3svvKW)Bq9Y z&J9v_fEEr7P&@^i$v^`*=gws2ISFv8ut% zSE4NTk{TXvKO5d(H9iPOms{h*Sje#ChRGVA?!57d*!2l~F(c}|41h<90sWQ5G6-Q) z!ulm_uY~QQU2246_%350BUa0-0rC=9_OHfglWh2to|jICkbu`l!Iq$pH%=)T%5gX@ zeYpBC>Dep^w5FgJ!X*2KD}@yuBkVP&gHw8ZsTV~b!SHW#Z=LwC z_v`T+RqMvmI;-InIhvg2V#Z+@EzQv+%ab4{Yoe3PuaK&36+Vkb;dGBK?=by@q)WnQi}7QY@4! zfgebp!<0jdd5uqrPXwr()#ptjbV<&uF!xQ6a{F-hmMQoALjdhL`aO^Q{9S&~zk2Ya zo-WkmQ{+gU1-GGLQ|AS8rtr-6_suD6Ro3Escs=DvmI-iZ@2Opf_TrmTZ9){B z$+Rzxd-xsZ%~O;J1ovn=%zv^{N!#SQHSS9@Jb(NOdq^dPMJD;o6nwjIQ$RguYh=w{ zj8nYtkRajtC4WJZUy(pe+7_FgVgr>djisem6Ye6~{F01%viyrGsjT&T#X>Au{(~+u z$>J|#=Qn#0%+U5Bd`^1qpx7Mly)!v)we40$X396Fjl|%Q^jkLG$;--^rDbNF>L9{& ztNYox1wK-1O{RRq`!tfHb(F9z6MhoK?6gUje(tEg;i=j8{Pm@;Kl5_f^`d_04ShrA zj=wFSGy=|0Ew0iJCBW#&HjoRa76f&B{Aof1R(+}-<-6W{ao$gU&R z+c`1A$0@``rvquoZ%K?VY#my9$N{+J1_TbZ^d5)XibNRi z$9Kvl4Qyh*(FMYtY`V`umFW;gtod)888fz~;9(r*0Rdb<55(>QDmCU+)A8o8H99Rm zcr-dy?wN@hm5Aq5)W^$Kw4Fv1jw2oUCdvgg5z`=Ko5^k7V7?rhVM1|3ut1Csp z+%KMnHh=+4M6-st2u+2kD&dmEJ$E{B4ZX1$=4fJ_E9zE^Hoa1Yq1SA27VDWnP5LBr zV3J)Ebl72fr!pBc<^ek}$Q*o%+SZyov&jID!~8uBO6^nv;vCgxP6cFK)s5jg&RpfD zG32T^2W6qu{a46QysA9tmzxism4p6CyvF-7=`ZTZ`zm#F$*}6S&}#ax!leJyPM>G; z9pR8IMS_t5HBtv<5C_dkc6O%eQ3X5Su<`~d4==IIa6D|_g`o7`q6LaBZgcAOrDF_) zIH;4rLCV(FD~_-QboqxcAz?0__q5cP#r}&w5iQg$=w{Co7Mn*d!mfDn_$-1ex^gdJ zhCcoa+y2?;a;)y|{r>5Wgg(AIC32%xM0HC`dM$s_YAxf4B<5kUmFC8v($b3vLE+`L z2J71#BqE(M&*UdlUW@J-dRX}_kHef2Q143~f{I)X0^qHs$oyskR=>XduaCfod(5%p zsf@+NXLgarJcnw`>uJ(j30xkZB|?Bq^mcQs)c<)D39+lpLf$utu)#v@iP#o^zz|Zc zeXLMDW0z6-gybu~@;!;#0f`-3yT?3op>);pF5q?PaVULyta%#ipE`_#4gopKHuDQW z+M>WVfjJQ!z>NH$Tx)wkrKFo$eR&n#Qj(fopf|9`iy^J8jToh;pXPMn{}4?_W;f*8 zPjkv6#unvj!wfS8tU#6dYh=#FHUIu-#u$`XF=RR){Fy-K$CG0h=1P49D$WwMZOTsLF#AD&6qm4`2goW*5iFn8u*@#2W@D?h z9p+g2u!XNiCg~7t)FD~!DUgNZeZf4B`5lIl8|9Qc>tk56)K6%ztR2U)efv;6^)J8g z87E+X#=;}Q2$q(DD}2TL=9&IBc{>I!ZmvW~^o4uqm&&~x3ZOBn5a6)__+x#M9 zS}N?TS2k_qL!D0Z5J>!_tObb*GtPT<{|zB%uI>vyrzd1n5%ZdVxl~ee(AM+X-GH&a(HliB(C9NdRkG4PNjAcKuSu2dm8bz#LP2ay zT&2Ny2KOOFny=skZ51r>kW4}78#*&N@S6-g6CWJ6oRbG#er+8~Lr*fOLO3ku#~DM^ z6GH2=J5=3`Y+csvp|MxI<02i2tXws3;C%TA$MyTe#xC=aED(56t1`cLMvl-=oXUxc$NS4^)oy z#d`H2ZC%O5_y_1W&j(C6dysb)hBE|cnXOD7H&?#CTD>=0UoN-B%P*8Uft<(^5e4KP zccItuS-<@%^eJ|hVC^a90jQ|WBHYfaYN{gGf;)7r(fNQT3_RdIjU^~di8vS(=P7x|L2A8k>C-V%QY=l9l# z+$Q#Sz=hxu)QOE(H}f8tAX_O%&=jxS`&b6(k-o?*-%qbHlV zqC|**objl_&xUW4=mLe?^_xeUCBNj3qQGc6zGj)Qw*bn8G9I;iQWF?{)@b;N#qbli zaJczSv@f(g}I)O0Gti&Ze7YlC&!dm-w>9iWVsjxHl*gXLoqsA`va}_OPC!92w zznYgSl>{7hQ~lC0u}cKA){noqCH`S>SuuaFS&k`fuU}hV1i)0#pbF~pt0U`~=c55M zJ<*01ux(5FJZ=3b;rRXLD|A&`4_5M_t>0^I|^SBh{~> zsVF(AC4N}->aglnw;v1~-4Z{d!j7o09-Nu>6d=fo(q`d**fMVhMUakG_u2dlN>g)@ z%y?mDJ`w+EO%DHsowLajcb=88)kg#;1onMF`a(ha^z)x)W?Ueps+sXPGvk*+r)cek zil<_a!8+5{38Tj%;fDRwGn?E}$rwHFX>V5E7vGyxYV zIK0jRSo$)2E=h-Sgj?S$g!^Lj61A*u1F^HrHzws!=nh^3b!h1XK{-2@PrOsY`w0C; zfyOkizhzA9qW{@ElF4v^Ookolb8=JY>+^<9A(=g98(}hqa zSGC3It99ZowN9|{HG2L%cu4rf3jET*&GFLvT)OC@o@go3Y1t0PKDemI+8ndHWdMi$ z8^BIh!IZ(Sdxi+SZ>Eoxz|XJXkNn z0}fm;FirJ{58hOfV`QBTLvhr?%hI;lmLXVkt#*I2u}h{oOSt;8Cw3YWUYG;6@vQ1T zMFTp=rBe(*?9|S2=C9##vs9pg_w3w*Ml^jK(z461lXQAl`p~B`(!vxICg@Fr^+>u=7-^(K_yCRa7MvcYd~v6Oe(0>2Fi@c~UjA z-jR;meC`krQYx*@a=T^bh`d&Q136o^m7%&a)H8T1f&hOY1lWUTj`S{}zYpPU;&={N zBi?+H60C}U19W~b{GmVJS0()6>UY~{7_97+n_*>ZS<@oHNcH}UYw3aprYJbO}}26B}nuajN ze@tu{BuQ(3mLRp=XsI8y{Gx{ngPq*!rmaUDx<$=VCK~tfy}qnJC93UE-O7Hg{fE54 zZ|=2M;gqn1=1bJP)iI53Sc&dp6yR6)+LSOQ7TLl0(22lm3AfAlmIr`Khmp()k{(L%GEgfXiZ#t;S*nRYgJLK>>~G z5*1g`Pm~!{s#wEJ`K$XCZ`fW;BC7%iZ=ieUAO+%nL0j{8L7}C)<|W;e^@gp>&%%Qn z_;G*5L!nZ$u`@IkAz-u`>knO%G zaO(`+t@;nVA$-=D-X~-FXP~IY6z|=PXN)=6m%4ye!n^?)%@Ee9jZ+rmlvbkop!jzC z^BaPT)`_bV-uVlImbyt~&AENMwRg+;lT~}Tg=$J3jHs(gnUaF0kT`2Pu4Opbztme( za_hLY6qZKIOii_0W-)!aB>k0;G0<%Ml~zp;W?pEjn^_s1f_X~`rp0V6r_B`%jE(@I zRFq&Ao)Xe~WS`np{a5Oy6-wyZWIUJGfS0IGjb|*9epvOqILwt;h0v_@MaMQg9}&Kr z%jh$2s>lv~O3r6k^LjWe#5=-5%R53V-VyE%AM_C{R05m-m2><%yOg)?BshXexY zu4}$`An4Mfn2`lBA~~pkOZ*4cBDdeBIOtRu8zjYRH5`6q#e|(<)1a`Rrw$Z( zH#!3UjubD^+@CICpb)Gfs!cTYb1Z4Ev1qf=+!bM4oGI7#k=^z$Q33SW555W1WU6v! z>ARg&i!6V4Oazjrl9uJ`4|u~Dg0)z-{Os*$ZUi;XDjFieD3;JJIif*vSX)Pa3Q#u# z!!gTSKoUXvJoizkB77)n#ZrY5EqBJ-%(Eyfjpdo;kw;H>bg46Gf5yAm2zy?V?1txT z)f&&ENU$aSTB$GLd5p-dp1TMf;dXRw_1wuD^F=cJ$8}b^=1K{ z4DhgjL;R{JKo0HGe=1BU78q+E692idj5j=9gg$;lmfsxWWp%@ca-Rj%8*y#d55a)$ z4o`V8%I<&RAo(tXy_{>an)SS&W4})l7Sv)pi(xxAG6+uS4S$cSzyDN!KT>}`RDX}C zzlYV|LH2AXmOc25SqTKyY?Kf^#GixszF?Z~2oV->cB~3atTdj_l#d4*#;of}8cKf8 zWcr61UJn}Spf>m2V8gqyKHKn7*+HWFP$b<}G!N-gP9Xd6<9AhDlcl6`!A0X`9Rd?X z%5OJeTD|A(DyzY5(?d)6wuq)0)X~m6JE6~+ysukb2TM<^R_<&aYBiQhd*wdfT3TxlSiUdD6 z@1)$~^9oL$W${sx2Wy}IEg6_S5};?M-pT-ggBCw8s?5^vLcwMiZIO-gIH=5{gecs- zV2>5(Hg;roDJmu?oXu;lhk6lHKG7<3qZi~&-On6&?m6pyS);sL>CMuK0t!ZWuQ}Nx zuRF|hMGMYv3+syfUSB21)1I1oZJsRl+&WamaP^ygFo0H%j>=&epf{FwIx9ICp8@2vT0F$ZgrKMu`Tm&#O-8@*YREXO#>9LL zj9eR^buL5^(^n@w+v+(@J{Y`E=hTyUWqs%X9T(m|IFm{+R99?#&IYMk0>Wg9p>9-`{25y?ql;5KA?=|0* ztxTdQgVeh;qDsEhisAb_^?fnlk%kXqo=Afk{X@jyW>n?%SN*avuj;v*a-iYO9?otpzgewfhZcQI7X)J-rdwR>u}v8#8cuI3|u{={Ls!20o3)LGl5 z_-V;xo@1rU-KniC)&1eb6~1BP+HBnIZ8m0bQY~!UUDsTFsM$E6Sk=_yEn3HW3{iOL zmvxNh`qQ(Zl}* zl9|%=$Rbr2#U%zxXNipDN&1kg;goSTewZ|5m9J_q-YV-Vx*qUF{Z-G`9DUn2t>iS1 z9b|0n3kvK!er_wm<1{`U{YNh>OTUZyg|pp`bd>-{2iZ4u6{Vda!c;MDmiMf40w_-{NI9UmtS>nNdH7Nh(BNM4Y>TOnq) z&e;{r?96o?l|(sgLTN#tYENGLF0=;FsyaNWl_>t{t#~#y@KeB-UED-Qru17oSVX25 z;t#+~qCmH(<(u)tdSI2*Sv{0bsnoe5h_=z(qVRcgzG#P|FiCzO?|cFcM_Dy_F;siR z758M1+LnSfOO)YV={GE*X{%>=*6L=a$)8Q45ApStT6HB$)eN9#H0wh%$L}1TL!S*o;}QNgV84ZHqD1K47VJC&I5@b7Pq|`|0FVM#}Dl z3i)Cyz%%!a*W&v}EIo=NsV0B9#)bVgwnz=|aBL#emVkuBR%Ne7x}PCi@gU9+GJx27ejjq)ifd+i3c6Aiq)bJsD13l&u7@F~z54~qrWOJ1n_Q-K5bf7QYvMUI zI)D{KeOcx|SQXTlGfiXpSKqH!YG_`*G7ov`seSvpMXwoV?ztY9!!-_zT1Cz@n( zLb@D-=?AWLe8QbPi%yBbQL*}ses`ku@vSO+u7h9_cX+T=@-_)pk?VB)Ux%!O6SFCM zN*V9s-5xMDx}E-DhYct2 zLrx{2w4@a>swFQyQb)#-TXUuOHQk_o5|&TCOptc||U>4kz(^+95v$#R4 z8Q)aSa^RtHAYI@K+aKXlGh)Am?kdcw=rM4tqNTzyKVA9Qzgf=lLoAvhBB#p-W(gTH zPw$j#vo>OwHg1k0l92mEcpuoWebL&meK73(dnULqsJF6Ze;6H9Yu`|gN5g0Ih7y)% zx6JhUW#eStqZ93mJhbyoZ_5v5ef_Dh{jzuRHn7eNf@z2(a;Um`2R8}1^XDCR3PIQ_ z(h=t;+Q~`Ke#7#o7tCe^aE7<5C|HNZ4GHocO3w)Nv+oo8jf&UO`IMxJtk-w};IK5Kq z%`g}{vn{@?++mE~Lf&cLFSnZarj8Nlihks?)XLr!vcBDyl$T|7hZ{dwA;T51dZu*J zCRhS9cuszA6W7vj;aR0tZi`~<81u*hxsf9dA}PNXDC~9&Vg9xyiU-M)f9Jwl;5f|k z3-@K_c1_MW3PXtnPEw~k3O7zZL!K@OwJewd_IURi0pjaWu)T1fX$I)HV1r%!G%w(< zN6WwKZIZJnqP2N^+}nhTIE-!IQ(}G`NzQZCIp3`*^G3@2Tf9lVV97~8r?T$7Mc;oQ zj7*keo?Uvqd@b1`y@hUfzLY4vOmh4k3xnuunhrO7_wfpu+`U?d)c|)GMvT zyFC6Emb9b?*<&(SyP>@gHSbxr1aMiNiO!RsL(%Jky|sj#`i}f~VnYFp<(bmwHp&i( z)>`!+avoo#>Y7zv8SsYqyV>))m-BiWx{9uHD^cqRw$?I=x{{V!G^U$$ZEw>JtZb&X zDAOfDC$P@-A6U{%;GcDD)lA4=lrGlAtuB{eIu40EBM8&K@qmVWcZ-3cUEDTP?sES_RdFMG zU%Bj0=uhCqjS$^;K;XZfbvxX@r~Azql4Dw_y*5A<%k~Q=<7|uV!OEw{#FrO2qJ_m6uS7KxzK8I`2!;ni{LWgpOt*DyhMCqHh$3KmQJ`gg~6~QT5Ilh z$>puj{@8w1JZresN0qcXyL`SrpHU2R+wNs#>ZH>QSw0_O3>cygechQbp&;X@XG%|5 z&rAD$nNfk+0dyB3)6~7!^2|z}ZP8#g-_`235#T8h4kjmHE&|ts2l$+IFzx6NFaZUT zOR1R#`8Io`zlmnka_;E?J=OY&A0GNp@1$p@@V>1>jKl9J|3 ztSC;v(E^ZP5reesqzqnUBAYjhL)iPuWp-G0mVBXJ@|o8PkC(YOSF<%o!?_HKmCAjx zl}f+&ETBvBgm+_jNGEp~TFlT#{XU^-1AGM|rFbYpO&w9852jqE^oQ#NCL>Zq;a=Es zGF>NNq=SvHgr9+Z1C|R265=>SwKYQJwXhnA)Tgh1>KZ!2x)Xz2CfUbrStR3fuU3nA zMYpQi7qIl*5z$?SvmQzYJpRIH1?uq5o$zxWSIP&5u^ z9O-eH3q6aAu}W&;DCLXyagTTHW_1Pd2FMa~4R)sUu@T9(gGexv!XiYWjnD@ezWkjFr?rs`rQNv0+UmDC3+>=X=ZyC1F1L4{46WFdgCFCvzu#a5ih z32i{>r_TO}Ge4Usnf%Pq>cb&Y5&q5O-=*r5mk>ot96dA&IF+kJ$NMzZNk$fIP1o=C zgsQJzsb!QavQlwD_2T(Ci19`5l(GPO_SQS_*wcK!KJHu8KJ3MzFJHGfL0CwP7Ym88 zgoLJ`MM18DxN`uH?RVGR*gm7q*|fQR&tOLy<3(`>GL9lF0p=B_NbTdK_9$(nu}&;A zG_@+$8TWQbE$lEFqNk~%!`=P`v@~WYU+H!bV#i6hwE_i{gHV)RwXMFO{jo%l3dkQT zh~{15vWIJ%2prHkNGAL0HvEP#?c79V?&dZ3dRzX&8$puY6K5$XKiRwXZclei z=xJ}-8RP<4zs{=Xjyz%$ukI~$+~#(4eD2~4vuqUcy-gR>5&RH0{Q!zZeoxH){wtfm zHT&C|{f+WP@ms9DnDW7R-)!$a5@N&Kgai-*G3afo<}uzk#oGj5mPD#KK z&E6ql`?#P#V|T6QtSlFE3%*2&5=wZR5J~|}_T)Zbc|&8qZ<FMB@TcY|^D5%2rHx9MRD#rtkCx9WJ` z{Ahi=Z=ttIA|}WCVrZ`D_lv#Foix;TGEeF0nN3i&qN9V(641KGs@P)f+Mo6@5i$XD zF3|ItE)*S*VbKCOP?Y+(VhbnUO5H&_&z8`ROs-eEcVw5&4z8BG+NQm?&vae95!_!H zOkVskF(@uhPYY^pu)GV@4oRnppn0w=f?B^-!vZ0w9~2I8?*<>5p^3B8`H8c0GpIdZ z$OHvf7xDq{U!={^zz%3uF@kfidADfc;5xH?(%;ZaE3J&6tw6M(&im~7ed(iFDt=0I z-k`dA(ym(jeB{)WDdtq(?g{VPEyM9htA)DN1D{46MMhSW1nMgFeS?DXx_XWc2axvc(K!H4|62vtLEqNR8n5cbN&}IRmBzs@lBUPmwM-STL z&WrQ0aOYfj*B-R$kw(cDobNCa7ika;mmD2#MG$q>vel0HhbWp)PbFB;!# zpuH%%ZK#okVk2pG3e9FppII&KT-LxDrJ!{D7$`1zKU%;4^}zQH{t1M?m9-EiGN<}z zv{GcUfTA)#p_)s}XX2BZq3QKQGjGkio`nUnq{$mJCTq*+h{}24^_;j(TevdQWP5=fiMg(Mq+L};!}OXinME2>0CMH$k;bxQb0d^ z>hwOnV?EI_s=AJ>TB)9)Djz~Yk;%9;dVOkf8=kfj{3} zcpw8>6BO2b0gAt&>dQ3#u3M2+eS`U9Cxvhjih9vnnbiBreZVt`Qw=!j7Xe*!btn5H z9IfW>Jc5KZ9J~q7R}BXj#eOSWVn}*ru%Y@U{7_}u<+&)`0%Ryj-^pKJN)#GVFq9YG ziQkHq1{)UVoy7$gbvd1vnn8hyRp!N+{VzWAYIfDc+1{qJr2xS7bom9Oo-Dt>(BtKI zF~?GVL1$im1q02JU5%m-fdfHDDmWI>sFyPayX;b#T4XfA)~)IWT<1v6yin_j66=w| z^EAGfV}4}Ob19l#gVax;z!>|f#K|`BQVzG^hZXX|rUyKyV6$bCMbC0@*C&@)J9XYI zy1?hst5E8@xn@QO4VYyA%mCyj#Pp1bLpvw!Wld)!ix>;7glL7w)G4N-FB+s5V^M)^ zI9L%qk-rnr>}fby>1{4BEqGFgAcmx=)MqAdXhT z+ub7f>qJ~<*|z+sNmz`nFg0$YuDLxNac9tM<4ozNAbY#`<@54kcxFn!!6anWG{irG zHi=Zj{waG+)JLLKcJbdR3coB>v})bb%THGqGxq$Y>A! zL&^es`vv9ZPNl>VNA`oBq*bDB(E5Vt-O0@h9)!2)6edbD7<7lV@GV>|{7|=gY`avR zYMG}$nWq`%X{C9ZXP#Qk(|q%^#5^rFPv6&1b_3I9GOjimt0W`oe(GI*h+W`Twd9Kj zd1C0Q6PVN$mTk)_8U6x2I<_Y>ICeC3etxdZk#HTTI7k&yaRrq=I3c%+Z=I;C=T=cp z_YPHBDqotk22v?{46R&zKCSrsqC?~7p(iILeol$(s;;6fL1hnblQ|IHv{~JpEaz3b zIFDY)28L6*Cx&?cViv(JPUFgo85et#7FjLYxRyJ$%)RDN2(?Yqz*yg+08ErE}Ohj>z7OwMyXZ5(Q@vlq1cl&I-f?Ry&`B* zD?V-(kBt0e^gRCk9k&JthV38t3diNk%$0xdh3^7!vmKF}dS;7mu7k8A<Jw>U(>E>SpP_|HoeY%C4dd#d&}_)m-tt7>oF8+hVG@wSlZ zv=wAvrdA+Lw4l}50^Q!_eWFUBT+j%LRBFK)Y>p^WNA)frdlA=pg^?h5>75`Ximcg?w?}TMuO;6>&<1PP33ujvO+|9&o@4}1W0eocncP)S|_?&8dh4QHO zFnl7Jxq1$_t99+NtzIvvSr0TZserBoS@QN!V$8m2qU_6&m094piLoo%3&J$|Z~A-z z^rRmWLiQc=S>sQVMdr%My$nWnKB=*>-u~1F5kjt2TNS(Ix6;~mfa{W2^i0h|1Bfh4 z7G{e$=+NJov3kWwE*6o>pI?@d^~lJAx&>Wbs=)&jE+>W#vhtYGA)RQDJwkR zT)hHQ&+&h$2W`XhYri*Do4K)7vUS)y2W2J_?$1~q8U88g36V2#(86N?J8zOJq-SMt zwTse%J6`9l2Hz~6mIcr*B_F3`ru5I!SbW@{dEhrIE6B=8vwTY7QNok9_p9%7M}UuP zr~q%%-E3>D(O2;uHd{>%x;4o=+vN%601={nkbB1b*Ts9ZGQ^shu<+E3pftl(+1pgh z1Ma)rvEoP~?7xc6^om#MdEx zh~)R-$E=;_CGR!X{K(;Gx1R!!Ibz#iqos#$M#+rKuP4`=*}avrdy#(&l+c7m zn<$)NxmI9rO8Im#=w^XiW>4Dg7fxp=%$s9-K(g%(-+Xy5%buhTfP zfk?`f?)!^OH+wr%`XDPoaKmubo=oWj1JVyl5lUC*Ui!(1P^UVAdnU1nY{uhc07;7DlP-cK&I@7lHD(UViZ#g@Bl7qhBox7?M>rWFepml3AKbz6skCrDE!eM!<%fD!sF!Hz zVM&hGV^C2TpIfECfp73JnU%hYw_P9^?~_3j2beYE4w_}DeHy*_aK#2|7dB(anqE<# zPSC``SK2*R+NJu#R1e!P3e=smP7_c;NUChkB_;js z8{VPWFK0eHFw+d{*OIjw?H&lxQEaa)9=l8nf~VOp>kD@4kYI~vZcSBmSY{n;0l_Mb zpMT2yE_heAU?9-)Sa}sotafn05rm3#@ltk_y#q9(zmq8~`lB>{x84fEqImHkBlMHa zVuXG-BJ>m6n70qhOn{-jMBUa1iP&a{Mjl+`f z3JTYNR^x>uX=k66yb|eVYORobVEvF7x2evdf>H5owzMReoH__Q)6P)h>Y_;EYS-LP z{stC${tWhW#TTuvw}jOf=@GQJTmvyu-i zK0rsYxpYfU+<&jg9+~F(;1w(u06#L7)A6%&Kc<^PBg@g5$S-h+nV#R0$AV-!{GAIv zLwo0P_;2$W-;(mnaW4ME6+|t1qCMnaw`gRr0{&t9g~^C(zNq{@>Qm1b^9k&^S_`-m zykMVSq{YOt;Pc^4R1$DWY_&on9d4e_DrKonLnD=*!Gg>#4@j^?`|=`+RU?|755TLG z0{D}lZ>YOKBFu!5_aDy4SBf{!XBbD;2x^VSY^Bw5(vp|KZC!M`1h+EU@$1TgJ&=0{5!2K$1oA&tnBdEzYYv`1O-ws!U{aRx1WrQDp;HyNJC3tZ_|SoUwt zZCd8kKPJuzi%u2-c63i>2&~cxNlwK_E!@W}HzId!HZtA-B1jg}$MM(+N{NpfBUiTgfkUxzUGAZznPSMB z2Y%0;WeGY4(M$9#Kg*I#*TxTg5gXp+eg_zAO5R1u^o#KW2gTETsNC1(-jsc32VCi= zOe5%1(ci3Gl51sLJojl_nzdDiRthlC#_`$HBAd_tScL_>?6LaGB)kc&SbZ!khKM<|G_Y3#y zMJH6x$cv8mK0yo&E6=}wQE9~v+B|y<9cn0ag`F>kE4IcyqhtBiWw94<+J4;XLp0Ff z@r0f0^*fA^8&iJ-2S!iE$!c_TJXIXUk$%*LM~h?HT!4`DQEkKJr>M>4;m6%JjHkr; zMWMu8PuiKd2Hl-yxY+MpJ&2Y8bE!A^tr>InRGh0dw?W1TE8!*G?EwQ@IaucO(wq4+ z=F>`0YR6lyXK2_lEg3qsL?pr0WzjRLugr_$?0pz!hk5>;i$(zw&KwhLbq1X;20a7; z2AEK7dy*Km=C417$14Fd_l0|2bK1IxUm@(`ar7os1i1tW&cJ_ z9gL~9JmLJ$KZUTQLe{MIu?^J>6kVWxgi8Yu|1SBK{WEh;Hxa)}itPOpzRLWFeZ;As zM_(D0P%~m|ZP`DP!l>w80G<%u8c`2)R@lE4e%#}0Xg;C4(35fY-nEIsgv|MzpI-MA z)(LC(y*#W1@H?1$#`T)#VbjhA-%;79Cw>P)GwX%S)dmI0MR8O zR^PbuPL+bMBV~oF^aN$qtFPx++G%$cOYmV3MNCcJLaK9H$LKSnmJ`jPT(cPOPQX4C_4~8hed2L~P1rbt#(FXhv-mN5VA1dn;@`6; zln46g@0p8drlY@Wx#wKpa?iQWndgDMJ1*Bd`l5R$MG8&#fUBl^**w!fRIN?_LU}FH zL1AT%Z7XJYhh(>1gX6}`_X}vC9?TF2Ujcg`%b97|923O*0 z&y#X+Y-vF)njjyr&3O7ttR7Gzb($_AjjG=b$p5KM$8#gUKt48^rmCf5jVS@H>Q+-; zR0*DKAj7KIp{_Q0)1?@X7nw(CMol(pSsd_j&uKEGO?VGoEz=-9zj-`wY+DMbQYoCg zW5!wmwiJI{iq~AwgX1CFE3EcH8LeCGeS&iFqme3*xacnHSN5ufcz_Xn(g z#J>}8at_A;s^H7EJ3e(Wb{K%M94+%czz7S(94#|couS{aY-g0|3L|sLA0h-z(w02S zE`1NeMP1HWqZw1+U!atJdL*jhWLD^*`QMm2Xbx4@ciMcbem}C^ZgtMX1gOxUW#QG9 zeOY&WjcDTMEgOkHvu;hW0*o)#`{A-~VIkca;5`^&alAW^jaWjCtTlcPs#DUroQt)7 zr+4TVAv&ki_`7Q}jaP*1_n=F=gB=HvqCc@!J;;L6*ioUDIVFLXrNcJX4tJ~pnmf{E z%GynU55AD~4Z-V@jkUvQudW+rlk^6FURQ#x9JDV_SxVX`oG8#AlpNHw09gBCe6}&< zKa4dr$hVn3xi&vh>x&NdK2di_r~m9$64MAhKl^k0BLa&o17__MaQhUq8UlgN6Y1(K?yB04oCsch z_A4QKllXjIzEWmRGj|300&}%4oOXk!jXfYLWjS8Mb)B|QsqJ@U$I7^U+_Akg-5w|6%l{3qZ-eh3VH7U$KJk2bbuM%wmJz$i4lFnhV}9ZYMF&N2bCoC| zgphdRk9VI(+=M}~8uL)VgEKlzjMi2Nz!2|J*lK+$IyZ$a!{janR_fL96QmITOMHZ5 ziI2eTZk$IG>AT z9YPzT+?`v89D9@+s(X&y+M#~+f^n{ydWXJ?g$dWxFY=eX&foIoFW0u7905Gxq$zoA zUN8rx$^--oc+!$S6+tacN~MQ~?FIom@(Ms`#k)N$t0&Yt7N$nJ-HuHc^@Er@zC9n) z8T1iigUma=>utG0YR12SDOYDw<=%Uym`=rr8+WiW>Ipt0N@VHk2LIw{af5$`LV z|K*AfMu%c+JXM)KHrUuL7q#d&L~#@Sm9<+Zj#}g-@I$;~bI`wS;mG)QPtd=A!HF@K z|GC?ajc<1`$FXBz0|W@s6dT1;*jxK%RVF<%=>7W_&i&bGNCux~hb^a&D|Q@z^I{Y2 zjq&dMs0VBVmRK~H-GL_S!Q0B!TyD=@juXk2g17?Skx35?v~DcV@7+B*v+vEI^PpbX za6($jkLK@t^D9sq7r=N7GpipE*E&GieiS4|5x`K`3&J7e_YOjLD&r0dp&J%AqNC$IwRK(Jc0-Rf3_4K_sFTx-(RH}U$gA}9O_u1&@5+i zNyGCvW~2q`Ie>P0rWOCZd(jlm?zC^^XN50XyK=XdPDR8C!e>9?BpW})x74_=m={{r<0?8x$`iz_!4o|sh08*f+bVBlSUDAkK-A=j+fNz+>0m8 ziz593d%W~hS_WWnsdk=Y3^uvCxK2h~-&?f@v$gngPhRXKMCHbY1}naz1}L$&{E&yq zqD@x9n<;HZyg`3Yg6|mbDv2K`U$WW2vBMM~cbkA4BBSj^WxD7!|R$Kd*9d+bFjO`{TuCWt&Y zM~7gF9~+b@J%B)m<4c(xvA45xcch49t5%+N7fNL(@-2pz8F#N#gHJYaj^uvrv+7@6 z%TA=tNw;uSaKw&QAEeO3x@e4Qg1|I<-a?M4WgoDdu$?D7GLG9|dhx};S8&?6G)w08Nd(*|? z#LO=o=|L*MD{2?N$j9+Vfv_tbAFy-!7e(JSWt>JHR1afql7l*ya}TCkZ^~UkO#S#G zdOyR|t!t&%MQkUE0M4%9Q@$ z9w~$^M`kC5o)N@pN}0Pa0OBv?Wl9%HxrF;Z*>$=V!C}QemB&Q!&&cuSx$b^OL+bmL{5=3 zKk1v4Pc&Z)0MKGi@s4*`oEoWjKiL7t>q?h!V>{qoVaDE#Q-yURSye|oE_6#V0BIz7 z9quhoD^L6QTGV{)W`1(Yu(Qw`0}$Z#gE%XB+C!pp{=QpCZPcxdC(r$y|w56BRiyYW{1Pm+fB>WLi{vY&XEbk|+-S7ssY z4#D1-B`<62;#b=NPrF2K*mmzC?cC(wwe(aNGy2rswTcP|A~$*9-e_vQ_yG!~Ur=tY zDj0c}(=&0?FaDOF6~yg-GgfT>Oul9B2xeYNyNR`!dCC7Kidb}cFkSXGm$8K+3Ef}+ zo8IQZJcbgwm#Ht<*0PPcC}1we-m1)@F0JE`D88~r+sx&D`_D*n%<<*Ss!$Wy>19fH zF;pz00W#<@{0d2fpUN0rY+22fJNtrmFV3Dk5ghF87H6%Xsx5^c||c@-Ev%mcC{m09!9D zFAGtwB;3{EbN^&i+G9R4cg5ktP0X{Yd>9@Ju&S)eB&X%6^N>`nNM7p%hWY$szWGhJ zW9b~L{u8cggU6v?6Q9_lQEO38Z?G&LEm6)B*sW;A4a#(}fy?6uMl3ml!mpQ8*e>c} z29a)Wv}J9JyG-Us>f`&_M)sH|c?NrZ;(#K(M_>F@`+l@`k-U8QGI?ZQeRi-+B+Rdt zJ16GH&chbm!+DQ>%dV-o9TUW56I3PIX<}&~B5cAYwT8{*?}~Y`=O_HNH{SgP*8J%L z?Hph`<))TM7%S1O79L9is;pn(gbB>?S>S02jRNkyDs>ifsIE6l?uLR*`!Mr&1n2~4 zb&Gmr1H;&)F7jdiPYk2O%$39A$kGYutLfRt>kD)OcrQ;q%^a+#A~N}oj9G=hSGgVD zWCNd!)Pr-~%g4GM7se-cJEHUO0N9O%UOajYU#$S_gQVQo%6q%0TQ5hxMp6W6ni|DOcp3DD1cZZCN=NH9M!ZF{mkKuNOwH%7S)|c@!b#$G z5ISVm3R-J`^L{z_*u!<|!l^>4ne!6ge<)V0j^lb|d^4mcH*a424S(?}pWCqz!bseb z{E;*#ZJ=ud9F2I_hCH}o2oO`^O%~QvS2vN&vTY6hmBYE1+R9O=rti~P0TFV8ckl17 zX~}|J0Y3vhu2A_zG0G4t=(1+RmyzN}0f#s#oZi8#<6o(ohLqVN;WKCGhGX-J;3DL z=ARVjTMNIB8e7EvFx>G4agM&(Kvw*1A{FhKG1Yec$GbLC=869+FDjSU7mtU^k=))8 zXCgWrp*P9}yx60`^X~M~>euYe>;+LtFX?XtxRPP}I z32dQJ=({l4g!n&RmGbcus?~q^aF#r{gCt!@bx|XhYt*Yf_Rb3A_Xc(zLK`z*>tyD|1_$kp#3as({xaAb^5QL{7;hO{w6~0Z zfT-Cw5q?B^^Bh=&j}-Hf3vE|7#S1(Q-ll($ttz<@iY5Un_}r)39lGS(W8BagBcvzz z1Mqt9?aY+!U}H&ROQ{8}8H}2!w@D=2=>71D8JH2a-vDmU#F;5qZr(_d<|cqzD+-+r z`wPKhypPb8JNbZ|`e1y?(Rj8LG5FDumPq+^LG7ib1*7F)d^WG7W3$p&IBr(we5`TP zSz$n2MQ7NFCvjMcKYEDvwPuH@DuG;Qvoh>|Z_}gl4!C?QQcf8e?sgCn2h@~Yfgei& ztxI6kowzy96qU$XT9?E)8m@XC{^oeM)aORS0DPI!JLAGo?3VesNSdJDbZNmS^L+oY z8g1Zi2(xuP0GY&Edwr(#(MB_gCsGMti4|Ws**GF`o#DOPO&*RuBkT$m-%y_YZC*^9 z=u6Bh*1O|~hRxXUPn&IfBR!>^8F}8jA0>&MSO~e*57;?*dgtWF2q=ul)^}hW7S3fn zfuQ%^^}@{%?aGMIXZ#E(evW2Xs-a_`Mf?V0-33c1PB#?iP@=wdK$;X2zJVOzcx>9gEwrKc;20-bTbC4vAW=hB@^K$0 z4(EUN`fPVj4z{|=alSjTFgB!RWDxChaaDqw@{X24l5E_cLAPPScIyPl2rJnv^#Mhp zigtmK)47d2b&Ou=4sCj)BLmAy%eq@wbxHY5>9fntl8X@$tIZ4DkX6xR)uYpE5oGyp zU<$LievO_@Jy+g4&!>Fq6XrvXytjFGZctdGI&{JRHmoyI2Vz|D_4%^EG33c3gW?KV zd`n9h4F1hcXiw#g@Q{qK^S_Vq)lvWNBYb0-8DSmJ`M-_uR0i_p5&C6>!+4<=Yrd4w zeg(9yki>bVs*QTN87*?`OqAqMG4t`W3S-G@2~8Io|c#t>nGMvb4334awrR zGBZI^2B;w`Zx?w&6&ukXUMlkv9pXfu5b_^d-j?=cN&{rtyXCPoXdg5K1`Y)MhrD+> znGn5;u3&=7Ltr+wAVuNiEL zyE@ALix>JQokt%R-gpEJF_EmVqakXc16CY;1Pw8)pN2RJx{nzfslLT+40v>*)tWUuWC_f`3EP8&_mU36oJGbg>PJA=Eutmt*OpctBfj zijNG=Ggn0liPJ79cztcuLLp6Ov)Q>FqfKPE@v}^H1F@xoz&J|891=$&ntuY;AE{Pp zizjD%a3I9buN6w!KWC0XL>dg$bga2{X{n1)u3VmIeD7}Wgy(C&N-&P z?LzUcK3wb~2seWwy{M#2`8ONm7+N(>~l`W?d_LfR-w0DRzo_ zgKi|RJrOq^H8=(czK?^*+O{Kb6KgT)c<~crRJm6(2Q(8M- zP&BGxa`+J|ROgVmz7lY00DG^$Lm$ke;!DRf;wov6kNgh)=&v)Szr9_E2VxJ5*7;u< z`vnk%>Nq<6)QNP70sIwJ78$&^>5qqG0Ec^KY_mSlonc!~kk`V~K74-?Vm}~3@({1E z%0U!$L_g<$q#b~jaJhp`OPph3$1`~z^&<_6OFWKNNRApO>X_!B9b4MYQ`7wF256TCrx#3!=?t_j#L* zx>a%gCc$(uX3ns$h}Xb+f#%QQg}#=YA@2mD{y<*HMdj}-0wp}U#C9v;UPhytQjczg z_xG6hJG-R3yq~MztHs&+x0v@U`rluq-*3vjpT>Lb#@$^jy=9V4!n=9vc(MXRXxTk9ee;|D*-V0lt@n%Xt;8}thvqlr; zLuY4RmY-8)O)TgxfRuX7ph;Yc;_=!iJH zGofm}&#u*>YKF{B%)Iyzda={fE2I}cn5{@6TUW9N+JZjkMj1OIi98Z1;SA6UE^pC^14jh(} z%8^Olgg_&4HUDB3Q3T`+{pb*S?^PSDM6JiZdR7%NB|fUf3(jR=^<}4qB;035F!NlX zT7q9?+H2`yPcZ%*GZ(B_m%-Iuaz@^gd`Ja*&SHBXCdYBOY^ES6HyT*u}!~0O!?8{#;ZE7+y zp#)mc0Y7dLn>Of0*J%-^Iqe8sd(>US*oWMGQPd6y8hEg)VCzvQsUjLjH0ceBX1O2T+P#S5w#bfMKhQF`pHCE2kHD-Vy}O+TZhE@y81wv1mN&7ryR zcb0I<2tK|i`u%~u0r7yCxJTfpjvi@6kcoEfe0oI3F^t(RMyVt#S+yZD77Z-Y#UL{{ zS+(=@aF|NsCoq8s36fKL8f#?E(Zag^$8;n)?Qq8BWC$m)&SO<=QzMp2KiQl%o6}}< zCg+soXtRD6ZeW~tQ+b=-b@!FG^DCfjdWZo91l#gbSneb% zEz%E=MxrTQ9?#<{9)*SZGS5Ek`x`_xPwNjx5CoW@gjwC6s}O4}L^J(u;kO@g#sYH2 zP}w-*jGcNQcg7rcY@TpqL_r~Be~#oFQ_VbkzH8sr^X=_&LPj&y>_85RoRO9Vaz?td zXXH7$xa|7=#a|xrcQ2a3xhU^H7iavpEpq+P{w)G+vnTpU|Mr-W=-(dR0o%hV=A0C4 zsk7G$IklzE*{(i%9YZ<|to50}l_?kM+>UwuR!y%ECAe-@h*K#VwprW0-2=w$oN8eJAxL^zPu6iIKeFyPs)9Qxiz|!0La(m) zrNb?qUg28k99DQnc7>;BS6G;C^M%K{7yvp;%TweWzr!V6>sJX$Yll7Rmp_tTPc2bD zHiJ+$6@U+f1TT-K-Ns)Etu$P%}-!QkR&-bakOg%uqp-n5C*sVxBtPB&yX( zCNW=)F^R=$gihEEj81t>x<%3llhQj|My+~GTINN)W74Z6z1yT^+SFE)mgAw?O(YI@2tX%R1| zi6&hl=}MC>lXSUB`y^dv(&HsvWYSuL)M3)qlK-iO{kAAzC}q-?q+d5_VdSWtCM`F6 zwcex`OS;XZ8zlXpNw-LPl}WFV^t~p%QqnCZJx|h0O!@&y&o}9ZB|Y1u+ax{1q}wHJ zaFo4C(gBmdQ_^Rd^eRb@H|gDyKGvkWC0%0DO42Tq?vZq#hWmD(q(3le2e&xYZPFe| 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⩔1VQdbW<; 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 T1au>y8v)%2=tkhPj==u`UoXM- From 4fb85f0c80d158e52ee48a34394a5b665f8d3df8 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 20:46:45 +0200 Subject: [PATCH 079/676] GUI: richtext struct is not in the class --- .../Project/Src/BasicView/Disassembly.cpp | 2 +- .../Project/Src/BasicView/RichTextPainter.cpp | 2 +- .../Project/Src/BasicView/RichTextPainter.h | 36 +++++++++---------- .../Project/Src/BasicView/ScriptView.cpp | 34 +++++++++--------- x64_dbg_gui/Project/Src/Bridge/Bridge.cpp | 2 +- .../Project/Src/Disassembler/BeaHighlight.cpp | 6 ++-- .../Project/Src/Disassembler/BeaHighlight.h | 8 ++--- 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 5d5687aa..61311015 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -342,7 +342,7 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse depth++; } - QList richText; + QList richText; BeaHighlight::PrintRtfInstruction(&richText, &mInstBuffer.at(rowOffset).disasm); RichTextPainter::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText, QFontMetrics(this->font()).width(QChar(' '))); break; diff --git a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp index d6d3750a..99c2f13d 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RichTextPainter.cpp @@ -1,6 +1,6 @@ #include "RichTextPainter.h" -void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth) +void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth) { int len=richText->size(); for(int i=0; i #include -//structures -enum CustomRichTextFlags -{ - FlagNone, - FlagColor, - FlagBackground, - FlagAll -}; - -typedef struct _CustomRichText_t -{ - QString text; - QColor textColor; - QColor textBackground; - CustomRichTextFlags flags; -} CustomRichText_t; - class RichTextPainter { public: + //structures + enum CustomRichTextFlags + { + FlagNone, + FlagColor, + FlagBackground, + FlagAll + }; + + typedef struct _CustomRichText_t + { + QString text; + QColor textColor; + QColor textBackground; + CustomRichTextFlags flags; + } CustomRichText_t; + //functions - static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth); + static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const QList* richText, int charwidth); }; #endif // RICHTEXTPAINTER_H diff --git a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp index 23d39970..cfcbc07c 100644 --- a/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/ScriptView.cpp @@ -75,8 +75,8 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset painter->save(); int charwidth=QFontMetrics(this->font()).width(QChar(' ')); int xadd=charwidth; //for testing - QList richText; - CustomRichText_t newRichText; + QList richText; + RichTextPainter::CustomRichText_t newRichText; QString command=getCellContent(rowBase+rowOffset, col); //handle comments @@ -98,21 +98,21 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset { if(isScriptCommand(command, "ret")) { - newRichText.flags=FlagBackground; + newRichText.flags=RichTextPainter::FlagBackground; newRichText.textBackground=QColor("#00FFFF"); newRichText.text="ret"; richText.push_back(newRichText); QString remainder=command.right(command.length()-3); if(remainder.length()) { - newRichText.flags=FlagNone; + newRichText.flags=RichTextPainter::FlagNone; newRichText.text=remainder; richText.push_back(newRichText); } } else { - newRichText.flags=FlagNone; + newRichText.flags=RichTextPainter::FlagNone; newRichText.text=command; richText.push_back(newRichText); } @@ -128,7 +128,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset switch(branchinfo.type) { case scriptjmp: //unconditional jumps - newRichText.flags=FlagBackground; + newRichText.flags=RichTextPainter::FlagBackground; newRichText.textBackground=QColor("#FFFF00"); break; @@ -138,29 +138,29 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case scriptjajg: case scriptjbejle: case scriptjaejge: - newRichText.flags=FlagAll; + newRichText.flags=RichTextPainter::FlagAll; newRichText.textBackground=QColor("#FFFF00"); newRichText.textColor=QColor("#FF0000"); break; case scriptcall: //calls - newRichText.flags=FlagBackground; + newRichText.flags=RichTextPainter::FlagBackground; newRichText.textBackground=QColor("#00FFFF"); break; default: - newRichText.flags=FlagNone; + newRichText.flags=RichTextPainter::FlagNone; break; } newRichText.text=command.left(i); richText.push_back(newRichText); //space - newRichText.flags=FlagNone; + newRichText.flags=RichTextPainter::FlagNone; newRichText.text=" "; richText.push_back(newRichText); //label QString label=branchinfo.branchlabel; - newRichText.flags=FlagBackground; + newRichText.flags=RichTextPainter::FlagBackground; newRichText.textBackground=QColor("#FFFF00"); newRichText.text=label; richText.push_back(newRichText); @@ -168,7 +168,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset QString remainder=command.right(command.length()-command.indexOf(label)-label.length()); if(remainder.length()) { - newRichText.flags=FlagNone; + newRichText.flags=RichTextPainter::FlagNone; newRichText.text=remainder; richText.push_back(newRichText); } @@ -177,7 +177,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case linelabel: { - newRichText.flags=FlagColor; + newRichText.flags=RichTextPainter::FlagColor; newRichText.textColor=QColor("#808080"); newRichText.text=command; richText.push_back(newRichText); @@ -187,7 +187,7 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset case linecomment: { - newRichText.flags=FlagColor; + newRichText.flags=RichTextPainter::FlagColor; newRichText.textColor=QColor("#808080"); newRichText.text=command; richText.push_back(newRichText); @@ -203,11 +203,11 @@ QString ScriptView::paintContent(QPainter* painter, int_t rowBase, int rowOffset //append the comment (when present) if(comment.length()) { - CustomRichText_t newRichText; - newRichText.flags=FlagNone; + RichTextPainter::CustomRichText_t newRichText; + newRichText.flags=RichTextPainter::FlagNone; newRichText.text=" "; richText.push_back(newRichText); //space - newRichText.flags=FlagColor; + newRichText.flags=RichTextPainter::FlagColor; newRichText.textColor=QColor("#808080"); newRichText.text=comment; richText.push_back(newRichText); //comment diff --git a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp index 825008d4..a6f69d4a 100644 --- a/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp +++ b/x64_dbg_gui/Project/Src/Bridge/Bridge.cpp @@ -617,7 +617,7 @@ __declspec(dllexport) void* _gui_sendmessage(GUIMSG type, void* param1, void* pa return 0; QBeaEngine* disasm = new QBeaEngine(); Instruction_t instr=disasm->DisassembleAt(wBuffer, 16, 0, 0, parVA); - QList richText; + QList richText; BeaHighlight::PrintRtfInstruction(&richText, &instr.disasm); QString finalInstruction=""; for(int i=0; i* richText, const ARGTYPE* Argument, const INSTRTYPE* Instruction, bool* had_arg) +bool BeaHighlight::PrintArgument(QList* richText, const ARGTYPE* Argument, const INSTRTYPE* Instruction, bool* had_arg) { CustomRichText_t argument; argument.flags=FlagNone; @@ -194,7 +194,7 @@ bool BeaHighlight::PrintArgument(QList* richText, const ARGTYP return true; } -void BeaHighlight::PrintBaseInstruction(QList* richText, const DISASM* MyDisasm) +void BeaHighlight::PrintBaseInstruction(QList* richText, const DISASM* MyDisasm) { CustomRichText_t mnemonic; char mnemonicText[16]; @@ -241,7 +241,7 @@ void BeaHighlight::PrintBaseInstruction(QList* richText, const richText->push_back(mnemonic); } -void BeaHighlight::PrintRtfInstruction(QList* richText, const DISASM* MyDisasm) +void BeaHighlight::PrintRtfInstruction(QList* richText, const DISASM* MyDisasm) { CustomRichText_t space; space.text=" "; diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h index 10ec7d12..cdc5c2d5 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaHighlight.h @@ -4,14 +4,14 @@ #include "QBeaEngine.h" #include "RichTextPainter.h" -class BeaHighlight +class BeaHighlight : RichTextPainter { public: - static void PrintRtfInstruction(QList* richText, const DISASM* MyDisasm); + static void PrintRtfInstruction(QList* richText, const DISASM* MyDisasm); private: static SEGMENTREG ConvertBeaSeg(int beaSeg); - static void PrintBaseInstruction(QList* richText, const DISASM* MyDisasm); - static bool PrintArgument(QList* richText, const ARGTYPE* Argument, const INSTRTYPE* Instruction, bool* had_arg); + static void PrintBaseInstruction(QList* richText, const DISASM* MyDisasm); + static bool PrintArgument(QList* richText, const ARGTYPE* Argument, const INSTRTYPE* Instruction, bool* had_arg); }; From 1a8090ab06ea3cfd76b6d2eca5bebd5e850ee13a Mon Sep 17 00:00:00 2001 From: tr4ceflow Date: Thu, 12 Jun 2014 21:48:17 +0200 Subject: [PATCH 080/676] GUI: add setLabelSlot in Hex-Dump --- x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 36 +++++++++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/CPUDump.h | 4 +++ 2 files changed, 40 insertions(+) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp index b7799d90..20aff8dc 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp @@ -131,7 +131,12 @@ void CPUDump::setupContextMenu() //Disassembly mDisassemblyAction = new QAction("&Disassembly", this); this->addAction(mDisassemblyAction); + + mSetLabelAction = new QAction("Set Label", this); + this->addAction(mSetLabelAction); + connect(mDisassemblyAction, SIGNAL(triggered()), this, SLOT(disassemblySlot())); + connect(mSetLabelAction, SIGNAL(triggered()), this, SLOT(setLabelSlot())); } QString CPUDump::paintContent(QPainter* painter, int_t rowBase, int rowOffset, int col, int x, int y, int w, int h) @@ -163,6 +168,11 @@ void CPUDump::contextMenuEvent(QContextMenuEvent* event) wMenu->addMenu(mFloatMenu); wMenu->addAction(mAddressAction); wMenu->addAction(mDisassemblyAction); + + //if(mSelection.firstSelectedIndex) + + wMenu->addAction(mSetLabelAction); + wMenu->exec(event->globalPos()); //execute context menu } @@ -586,6 +596,32 @@ void CPUDump::disassemblySlot() msg.exec(); } +void CPUDump::setLabelSlot() +{ + if(!DbgIsDebugging()) + return; + + int_t wBase = DbgMemFindBaseAddr(getSelectionStart(),0); + wBase = 0x401000; + uint_t wVA = getSelectionStart() + wBase; + LineEditDialog mLineEdit(this); + QString addr_text=QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); + char label_text[MAX_COMMENT_SIZE]=""; + if(DbgGetLabelAt((duint)wVA, SEG_DEFAULT, label_text)) + mLineEdit.setText(QString(label_text)); + mLineEdit.setWindowTitle("Add label at " + addr_text); + if(mLineEdit.exec()!=QDialog::Accepted) + return; + if(!DbgSetLabelAt(wVA, mLineEdit.editText.toUtf8().constData())) + { + QMessageBox msg(QMessageBox::Critical, "Error!", "DbgSetLabelAt failed!"); + msg.setWindowIcon(QIcon(":/icons/images/compile-error.png")); + msg.setParent(this, Qt::Dialog); + msg.setWindowFlags(msg.windowFlags()&(~Qt::WindowContextHelpButtonHint)); + msg.exec(); + } +} + void CPUDump::selectionGet(SELECTIONDATA* selection) { selection->start=getSelectionStart() + mBase; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.h b/x64_dbg_gui/Project/Src/Gui/CPUDump.h index d0134292..c06180db 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.h @@ -7,6 +7,7 @@ #include #include #include "NewTypes.h" +#include "LineEditDialog.h" #include "HexDump.h" #include "Bridge.h" #include "GotoDialog.h" @@ -45,6 +46,7 @@ public slots: void addressSlot(); void disassemblySlot(); + void setLabelSlot(); void selectionGet(SELECTIONDATA* selection); void selectionSet(const SELECTIONDATA* selection); @@ -86,6 +88,8 @@ private: QAction* mAddressAction; QAction* mDisassemblyAction; + QAction* mSetLabelAction; + QMenu* mSpecialMenu; QMenu* mCustomMenu; From adfb11587e745a6b87cdf91129d7f7f428581fd9 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 21:51:19 +0200 Subject: [PATCH 081/676] GUI: fixed base --- x64_dbg_gui/Project/Src/Gui/CPUDump.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp index 20aff8dc..93e50013 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDump.cpp @@ -601,9 +601,7 @@ void CPUDump::setLabelSlot() if(!DbgIsDebugging()) return; - int_t wBase = DbgMemFindBaseAddr(getSelectionStart(),0); - wBase = 0x401000; - uint_t wVA = getSelectionStart() + wBase; + uint_t wVA = getSelectionStart() + this->mBase; LineEditDialog mLineEdit(this); QString addr_text=QString("%1").arg(wVA, sizeof(int_t) * 2, 16, QChar('0')).toUpper(); char label_text[MAX_COMMENT_SIZE]=""; From 3350d26f9d05e3f9dbab9228bfa8cf791d5ff96a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 12 Jun 2014 22:34:52 +0200 Subject: [PATCH 082/676] GUI: fixed BeaTokenizer + fixed CPUSideBar crash + added token to Instruction_t --- .../Project/Src/BasicView/Disassembly.h | 1 - .../Project/Src/Disassembler/BeaTokenizer.cpp | 276 ++++++++++++++---- .../Project/Src/Disassembler/BeaTokenizer.h | 25 +- .../Project/Src/Disassembler/QBeaEngine.cpp | 4 + .../Project/Src/Disassembler/QBeaEngine.h | 2 + x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 2 +- 6 files changed, 244 insertions(+), 66 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index 140336d3..6017c2d5 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -92,7 +92,6 @@ public: signals: void selectionChanged(int_t parVA); - void repainted(); void disassembledAt(int_t parVA, int_t parCIP, bool history, int_t newTableOffset); public slots: diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp index 7426ba16..122d8414 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp @@ -1,20 +1,18 @@ #include "BeaTokenizer.h" +#include "Configuration.h" +//variables +QMap BeaTokenizer::colorNamesMap; +QStringList BeaTokenizer::segmentNames; +QMap BeaTokenizer::memSizeNames; +QMap> BeaTokenizer::registerMap; + + +//functions BeaTokenizer::BeaTokenizer() { } -//djb2 (http://www.cse.yorku.ca/~oz/hash.html) -unsigned long BeaTokenizer::BeaHashInstruction(const DISASM* disasm) -{ - const char* str=disasm->CompleteInstr; - unsigned long hash=5381; - int c; - while(c=*str++) - hash=((hash<<5)+hash)+c; /*hash*33+c*/ - return hash; -} - void BeaTokenizer::AddToken(BeaInstructionToken* instr, const BeaTokenType type, const QString text, const BeaTokenValue* value) { BeaSingleToken token; @@ -91,42 +89,12 @@ QString BeaTokenizer::PrintValue(const BeaTokenValue* value) QString BeaTokenizer::RegisterToString(int size, int reg) { ARGUMENTS_TYPE regValue=(ARGUMENTS_TYPE)(reg&0xFFFF); - QMap registerValueMap; - registerValueMap.insert(REG0, 0); - registerValueMap.insert(REG1, 1); - registerValueMap.insert(REG2, 2); - registerValueMap.insert(REG3, 3); - registerValueMap.insert(REG4, 4); - registerValueMap.insert(REG5, 5); - registerValueMap.insert(REG6, 6); - registerValueMap.insert(REG7, 7); - registerValueMap.insert(REG8, 8); - registerValueMap.insert(REG9, 9); - registerValueMap.insert(REG10, 10); - registerValueMap.insert(REG11, 11); - registerValueMap.insert(REG12, 12); - registerValueMap.insert(REG13, 13); - registerValueMap.insert(REG14, 14); - registerValueMap.insert(REG15, 15); - if(!registerValueMap.contains(regValue)) //not a register - return "UNKNOWN_REGISTER"; - QMap registerMap; -#ifdef _WIN64 - const char Registers8Bits64[16][8] = {"al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"}; - registerMap.insert(8, (const char**)Registers8Bits64); - const char Registers64Bits[16][4] = {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}; - registerMap.insert(64, (const char**)Registers64Bits); -#else //x86 - const char Registers8Bits32[8][4] = {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"}; - registerMap.insert(8, (const char**)Registers8Bits32); -#endif //_WIN64 - const char Registers16Bits[16][8] = {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"}; - registerMap.insert(16, (const char**)Registers16Bits); - const char Registers32Bits[16][8] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"}; - registerMap.insert(32, (const char**)Registers32Bits); if(!registerMap.contains(size)) //invalid size return "UNKNOWN_REGISTER"; - return registerMap[size][regValue]; + QMap* currentMap=®isterMap.find(size).value(); + if(!currentMap->contains(regValue)) + return "UNKNOWN_REGISTER"; + return currentMap->find(regValue).value(); } void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, const ARGTYPE* arg, bool* hadarg) @@ -158,20 +126,11 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co } else if((arg->ArgType&MEMORY_TYPE)==MEMORY_TYPE) //memory argument { - //initialization - QStringList segmentNames; - segmentNames<<""<<"es"<<"ds"<<"fs"<<"gs"<<"cs"<<"ss"; - QMap memSizeNames; //lookup table for memory sizes - memSizeNames.insert(8, "byte"); - memSizeNames.insert(16, "word"); - memSizeNames.insert(32, "dword"); - memSizeNames.insert(64, "qword"); - memSizeNames.insert(80, "tword"); - memSizeNames.insert(128, "dqword"); - memSizeNames.insert(256, "yword"); - memSizeNames.insert(512, "zword"); //#size ptr #segment:[#BaseRegister + #IndexRegister*#Scale +/- #Displacement] - AddToken(instr, TokenMemorySize, memSizeNames.find(arg->ArgSize).value(), 0); + if(memSizeNames.contains(arg->ArgSize)) + AddToken(instr, TokenMemorySize, memSizeNames.find(arg->ArgSize).value(), 0); + else + AddToken(instr, TokenMemorySize, "???", 0); AddToken(instr, TokenRequiredSpace, " ", 0); AddToken(instr, TokenMemoryText, "ptr", 0); AddToken(instr, TokenRequiredSpace, " ", 0); @@ -238,10 +197,173 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co AddToken(instr, TokenGeneral, argMnemonic, 0); } -void BeaTokenizer::BeaTokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm) +void BeaTokenizer::AddColorName(BeaTokenType type, QString color, QString backgroundColor) +{ + BeaTokenColor tokenColor; + tokenColor.color=color; + tokenColor.backgroundColor=color; + colorNamesMap.insert(type, tokenColor); +} + +void BeaTokenizer::Init() +{ + registerMap.clear(); +#ifdef _WIN64 + QMap Registers8Bits64; + Registers8Bits64.insert(REG0, "al"); + Registers8Bits64.insert(REG1, "cl"); + Registers8Bits64.insert(REG2, "dl"); + Registers8Bits64.insert(REG3, "bl"); + Registers8Bits64.insert(REG4, "spl"); + Registers8Bits64.insert(REG5, "bpl"); + Registers8Bits64.insert(REG6, "sil"); + Registers8Bits64.insert(REG7, "dil"); + Registers8Bits64.insert(REG8, "r8b"); + Registers8Bits64.insert(REG9, "r9b"); + Registers8Bits64.insert(REG10, "r10b"); + Registers8Bits64.insert(REG11, "r11b"); + Registers8Bits64.insert(REG12, "r12b"); + Registers8Bits64.insert(REG13, "r13b"); + Registers8Bits64.insert(REG14, "r14b"); + Registers8Bits64.insert(REG15, "r15b"); + registerMap.insert(8, Registers8Bits64); + QMap Registers64Bits; + Registers64Bits.insert(REG0, "rax"); + Registers64Bits.insert(REG1, "rcx"); + Registers64Bits.insert(REG2, "rdx"); + Registers64Bits.insert(REG3, "rbx"); + Registers64Bits.insert(REG4, "rsp"); + Registers64Bits.insert(REG5, "rbp"); + Registers64Bits.insert(REG6, "rsi"); + Registers64Bits.insert(REG7, "rdi"); + Registers64Bits.insert(REG8, "r8"); + Registers64Bits.insert(REG9, "r9"); + Registers64Bits.insert(REG10, "r10"); + Registers64Bits.insert(REG11, "r11"); + Registers64Bits.insert(REG12, "r12"); + Registers64Bits.insert(REG13, "r13"); + Registers64Bits.insert(REG14, "r14"); + Registers64Bits.insert(REG15, "r15"); + registerMap.insert(64, Registers64Bits); +#else //x86 + QMap Registers8Bits32; + Registers8Bits32.insert(REG0, "al"); + Registers8Bits32.insert(REG1, "cl"); + Registers8Bits32.insert(REG2, "dl"); + Registers8Bits32.insert(REG3, "bl"); + Registers8Bits32.insert(REG4, "ah"); + Registers8Bits32.insert(REG5, "ch"); + Registers8Bits32.insert(REG6, "dh"); + Registers8Bits32.insert(REG7, "bh"); + registerMap.insert(8, Registers8Bits32); +#endif //_WIN64 + QMap Registers16Bits; + Registers16Bits.insert(REG0, "ax"); + Registers16Bits.insert(REG1, "cx"); + Registers16Bits.insert(REG2, "dx"); + Registers16Bits.insert(REG3, "bx"); + Registers16Bits.insert(REG4, "sp"); + Registers16Bits.insert(REG5, "bp"); + Registers16Bits.insert(REG6, "si"); + Registers16Bits.insert(REG7, "di"); +#ifdef _WIN64 + Registers16Bits.insert(REG8, "r8w"); + Registers16Bits.insert(REG9, "r9w"); + Registers16Bits.insert(REG10, "r10w"); + Registers16Bits.insert(REG11, "r11w"); + Registers16Bits.insert(REG12, "r12w"); + Registers16Bits.insert(REG13, "r13w"); + Registers16Bits.insert(REG14, "r14w"); + Registers16Bits.insert(REG15, "r15w"); +#endif //_WIN64 + registerMap.insert(16, Registers16Bits); + + QMap Registers32Bits; + Registers32Bits.insert(REG0, "eax"); + Registers32Bits.insert(REG1, "ecx"); + Registers32Bits.insert(REG2, "edx"); + Registers32Bits.insert(REG3, "ebx"); + Registers32Bits.insert(REG4, "esp"); + Registers32Bits.insert(REG5, "ebp"); + Registers32Bits.insert(REG6, "esi"); + Registers32Bits.insert(REG7, "edi"); +#ifdef _WIN64 + Registers32Bits.insert(REG8, "r8d"); + Registers32Bits.insert(REG9, "r9d"); + Registers32Bits.insert(REG10, "r10d"); + Registers32Bits.insert(REG11, "r11d"); + Registers32Bits.insert(REG12, "r12d"); + Registers32Bits.insert(REG13, "r13d"); + Registers32Bits.insert(REG14, "r14d"); + Registers32Bits.insert(REG15, "r15d"); +#endif //_WIN64 + registerMap.insert(32, Registers32Bits); + + //memory parser + memSizeNames.clear(); + memSizeNames.insert(8, "byte"); + memSizeNames.insert(16, "word"); + memSizeNames.insert(32, "dword"); + memSizeNames.insert(64, "qword"); + memSizeNames.insert(80, "tword"); + memSizeNames.insert(128, "dqword"); + memSizeNames.insert(256, "yword"); + memSizeNames.insert(512, "zword"); + segmentNames.clear(); + segmentNames<<"??"<<"es"<<"ds"<<"fs"<<"gs"<<"cs"<<"ss"; + + //color names map + colorNamesMap.clear(); + //filling + AddColorName(TokenComma, "", ""); + AddColorName(TokenComma, "", ""); + AddColorName(TokenRequiredSpace, "", ""); + AddColorName(TokenOptionalSpace, "", ""); + AddColorName(TokenMemorySpace, "", ""); + //general instruction parts + AddColorName(TokenPrefix, "", ""); + AddColorName(TokenGeneral, "", ""); + AddColorName(TokenCodeDest, "", ""); //jump/call destinations + AddColorName(TokenImmediat, "", ""); + //mnemonics + AddColorName(TokenMnemonicNormal, "", ""); + AddColorName(TokenMnemonicPushPop, "", ""); + AddColorName(TokenMnemonicCallRet, "", ""); + AddColorName(TokenMnemonicCondJump, "", ""); + AddColorName(TokenMnemonicUncondJump, "", ""); + AddColorName(TokenMnemonicNop, "", ""); + //memory + AddColorName(TokenMemorySize, "", ""); + AddColorName(TokenMemoryText, "", ""); + AddColorName(TokenMemorySegment, "", ""); + AddColorName(TokenMemoryBrackets, "", ""); + AddColorName(TokenMemoryBaseRegister, "", ""); + AddColorName(TokenMemoryIndexRegister, "", ""); + AddColorName(TokenMemoryScale, "", ""); + AddColorName(TokenMemoryDisplacement, "", ""); + AddColorName(TokenMemoryPlusMinus, "", ""); + //registers + AddColorName(TokenGeneralRegister, "", ""); + AddColorName(TokenFpuRegister, "", ""); + AddColorName(TokenMmxRegister, "", ""); + AddColorName(TokenSseRegister, "", ""); +} + +//djb2 (http://www.cse.yorku.ca/~oz/hash.html) +unsigned long BeaTokenizer::HashInstruction(const DISASM* disasm) +{ + const char* str=disasm->CompleteInstr; + unsigned long hash=5381; + int c; + while(c=*str++) + hash=((hash<<5)+hash)+c; /*hash*33+c*/ + return hash; +} + +void BeaTokenizer::TokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm) { //initialization - instr->hash=BeaHashInstruction(disasm); //hash instruction + instr->hash=HashInstruction(disasm); //hash instruction instr->tokens.clear(); //clear token list //base instruction @@ -254,3 +376,37 @@ void BeaTokenizer::BeaTokenizeInstruction(BeaInstructionToken* instr, const DISA Argument(instr, disasm, &disasm->Argument2, &hadarg); Argument(instr, disasm, &disasm->Argument3, &hadarg); } + +void BeaTokenizer::TokenToRichText(const BeaInstructionToken* instr, QList* richTextList) +{ + for(int i=0; itokens.size(); i++) + { + BeaSingleToken token=instr->tokens.at(i); + RichTextPainter::CustomRichText_t richText; + richText.flags=FlagNone; + richText.text=token.text; + if(colorNamesMap.contains(token.type)) + { + BeaTokenColor tokenColor=colorNamesMap[token.type]; + QString color=tokenColor.color; + QString backgroundColor=tokenColor.backgroundColor; + if(color.length() && backgroundColor.length()) + { + richText.flags=FlagAll; + richText.textColor=ConfigColor(color); + richText.textBackground=ConfigColor(backgroundColor); + } + else if(color.length()) + { + richText.flags=FlagColor; + richText.textColor=ConfigColor(color); + } + else if(backgroundColor.length()) + { + richText.flags=FlagBackground; + richText.textBackground=ConfigColor(backgroundColor); + } + } + richTextList->append(richText); + } +} diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h index 64bcfad8..d8a706a5 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h @@ -8,15 +8,13 @@ #include #include "BeaEngine.h" #include "NewTypes.h" +#include "RichTextPainter.h" -class BeaTokenizer +class BeaTokenizer : RichTextPainter { public: BeaTokenizer(); - static unsigned long BeaHashInstruction(const DISASM* disasm); - static void BeaTokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm); - enum BeaTokenType { //filling @@ -73,7 +71,25 @@ public: int x; //x of the first character }; + struct BeaTokenColor + { + QString color; + QString backgroundColor; + }; + + static void Init(); + static unsigned long HashInstruction(const DISASM* disasm); + static void TokenizeInstruction(BeaInstructionToken* instr, const DISASM* disasm); + static void TokenToRichText(const BeaInstructionToken* instr, QList* richTextList); + private: + //variables + static QMap colorNamesMap; + static QStringList segmentNames; + static QMap memSizeNames; + static QMap> registerMap; + + //functions static void AddToken(BeaInstructionToken* instr, const BeaTokenType type, const QString text, const BeaTokenValue* value); static void Prefix(BeaInstructionToken* instr, const DISASM* disasm); static bool IsNopInstruction(QString mnemonic, const DISASM* disasm); @@ -81,6 +97,7 @@ private: static QString PrintValue(const BeaTokenValue* value); static QString RegisterToString(int size, int reg); static void Argument(BeaInstructionToken* instr, const DISASM* disasm, const ARGTYPE* arg, bool* hadarg); + static void AddColorName(BeaTokenType type, QString color, QString backgroundColor); }; #endif // BEATOKENIZER_H diff --git a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp index a983620c..1f2c7e9e 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.cpp @@ -5,6 +5,7 @@ QBeaEngine::QBeaEngine() { // Reset the Disasm structure memset(&mDisasmStruct, 0, sizeof(DISASM)); + BeaTokenizer::Init(); } @@ -184,6 +185,9 @@ Instruction_t QBeaEngine::DisassembleAt(byte_t* data, uint_t size, uint_t instIn wInst.lentgh = len; wInst.disasm = mDisasmStruct; + //tokenize + BeaTokenizer::TokenizeInstruction(&wInst.token, &mDisasmStruct); + return wInst; } diff --git a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h index 8145026e..a3eac743 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h +++ b/x64_dbg_gui/Project/Src/Disassembler/QBeaEngine.h @@ -6,6 +6,7 @@ #include "BeaEngine.h" #include "NewTypes.h" +#include "BeaTokenizer.h" typedef struct _Instruction_t { @@ -14,6 +15,7 @@ typedef struct _Instruction_t uint_t rva; int lentgh; DISASM disasm; + BeaTokenizer::BeaInstructionToken token; } Instruction_t; class QBeaEngine diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index ea9077dd..d1b25900 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -127,7 +127,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) else if(destVA <= last_va && destVA >= first_va) { int destLine = line; - while(destLine < viewableRows && InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA) + while(destLine && destLine < InstrBuffer->size() && InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA) { if(destVA>instrVA) //jump goes up destLine++; From d836493764761eb01faf1f2aa54618d22cef013c Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 13 Jun 2014 02:27:29 +0200 Subject: [PATCH 083/676] GUI: RegisterView: use the REGSTRUCT at CIP as reference to highlighting (keep CIP register changes when you change a register manually) --- .../Project/Src/BasicView/RegistersView.cpp | 17 +++++++++++++++-- .../Project/Src/BasicView/RegistersView.h | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp index 99586038..4e9fa167 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.cpp @@ -129,6 +129,9 @@ RegistersView::RegistersView(QWidget * parent) : QAbstractScrollArea(parent), mV mCharWidth = QFontMetrics(this->font()).averageCharWidth(); memset(&wRegDumpStruct, 0, sizeof(REGDUMP)); + memset(&wCipRegDumpStruct, 0, sizeof(REGDUMP)); + mCip=0; + mRegisterUpdates.clear(); // Context Menu this->setContextMenuPolicy(Qt::CustomContextMenu); @@ -614,20 +617,30 @@ int_t RegistersView::registerValue(const REGDUMP* regd,const REGISTER_NAME reg){ void RegistersView::setRegisters(REGDUMP* reg) { // tests if new-register-value == old-register-value holds - mRegisterUpdates.clear(); + if(mCip!=reg->cip) //CIP changed + { + wCipRegDumpStruct=wRegDumpStruct; + mRegisterUpdates.clear(); + mCip=reg->cip; + } QMap::const_iterator it = mRegisterMapping.begin(); // iterate all ids (CAX, CBX, ...) while (it != mRegisterMapping.end()) { // does a register-value change happens? - if(registerValue(reg,it.key()) != registerValue(&wRegDumpStruct,it.key())) + if(registerValue(reg,it.key()) != registerValue(&wCipRegDumpStruct,it.key())) mRegisterUpdates.insert(it.key()); + else if(mRegisterUpdates.contains(it.key())) //registers are equal + mRegisterUpdates.remove(it.key()); it++; } // now we can save the values wRegDumpStruct = (*reg); + if(mCip!=reg->cip) + wCipRegDumpStruct=wRegDumpStruct; + // force repaint emit refresh(); diff --git a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h index ad65a1a0..0ea70b66 100644 --- a/x64_dbg_gui/Project/Src/BasicView/RegistersView.h +++ b/x64_dbg_gui/Project/Src/BasicView/RegistersView.h @@ -112,6 +112,7 @@ private: QMap mRegisterPlaces; // contains a dump of the current register values REGDUMP wRegDumpStruct; + REGDUMP wCipRegDumpStruct; // font measures (TODO: create a class that calculates all thos values) unsigned int mRowHeight, mCharWidth; // context menu actions @@ -124,6 +125,7 @@ private: QAction* wCM_CopyToClipboard; QAction* wCM_FollowInDisassembly; QAction* wCM_FollowInDump; + int_t mCip; }; #endif // REGISTERSVIEW_H From a68e2d1e4c5c79bf4e497df3e1e505542a77ccee Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 13 Jun 2014 02:32:13 +0200 Subject: [PATCH 084/676] GUI: CPUSideBar: fixed a massive lag + added disabled breakpoint color + better color properties for jump lines (unconditional: true/false and conditional true/false) --- x64_dbg_bridge/bridgemain.cpp | 7 +++ x64_dbg_bridge/bridgemain.h | 4 +- x64_dbg_dbg/_exports.cpp | 10 ++++ .../Src/BasicView/AbstractTableView.cpp | 2 +- .../Project/Src/BasicView/Disassembly.cpp | 6 +- .../Project/Src/Gui/AppearanceDialog.cpp | 37 +++++++++++-- .../Project/Src/Gui/CPUDisassembly.cpp | 2 +- x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp | 55 ++++++++++--------- x64_dbg_gui/Project/Src/Gui/CPUSideBar.h | 3 +- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 13 ++--- 10 files changed, 93 insertions(+), 46 deletions(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 4fbba721..f5b0900f 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -643,6 +643,13 @@ BRIDGE_IMPEXP bool DbgIsRunLocked() return false; } +BRIDGE_IMPEXP bool DbgIsBpDisabled(duint addr) +{ + if(_dbg_sendmessage(DBG_IS_BP_DISABLED, (void*)addr, 0)) + return true; + return false; +} + //GUI BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index b7f6c4fc..7566b02d 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -144,7 +144,8 @@ enum DBGMSG DBG_LOOP_OVERLAPS, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_LOOP_ADD, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_LOOP_DEL, // param1=FUNCTION_LOOP_INFO* info, param2=unused - DBG_IS_RUN_LOCKED // param1=unused, param2=unused + DBG_IS_RUN_LOCKED, // param1=unused, param2=unused + DBG_IS_BP_DISABLED // param1=duint addr, param2=unused }; enum SCRIPTLINETYPE @@ -527,6 +528,7 @@ BRIDGE_IMPEXP bool DbgLoopOverlaps(int depth, duint start, duint end); BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end); BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr); BRIDGE_IMPEXP bool DbgIsRunLocked(); +BRIDGE_IMPEXP bool DbgIsBpDisabled(duint addr); //Gui defines #define GUI_PLUGIN_MENU 0 diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index ea65cfee..c969b656 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -905,6 +905,16 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par return (uint)waitislocked(WAITID_RUN); } break; + + case DBG_IS_BP_DISABLED: + { + BREAKPOINT bp; + if(bpget((uint)param1, BPNORMAL, 0, &bp)) + return !(uint)bp.enabled; + return (uint)false; + } + break; + } return 0; } diff --git a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp index 9adb1cf9..a2ddab97 100644 --- a/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/AbstractTableView.cpp @@ -928,6 +928,7 @@ void AbstractTableView::setTableOffset(int_t val) void AbstractTableView::reloadData() { mShouldReload = true; + emit tableOffsetChanged(mTableOffset); repaint(); } @@ -935,7 +936,6 @@ void AbstractTableView::reloadData() void AbstractTableView::repaint() { this->viewport()->repaint(); - } diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 61311015..c88cbed1 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -343,8 +343,11 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse } QList richText; - BeaHighlight::PrintRtfInstruction(&richText, &mInstBuffer.at(rowOffset).disasm); + + BeaTokenizer::BeaInstructionToken* token = &mInstBuffer[rowOffset].token; + BeaTokenizer::TokenToRichText(token, &richText); RichTextPainter::paintRichText(painter, x + loopsize, y, getColumnWidth(col) - loopsize, getRowHeight(), 4, &richText, QFontMetrics(this->font()).width(QChar(' '))); + token->x = x + loopsize; break; } @@ -1080,7 +1083,6 @@ void Disassembly::prepareData() void Disassembly::reloadData() { emit selectionChanged(rvaToVa(mSelection.firstSelectedIndex)); - emit repainted(); AbstractTableView::reloadData(); } diff --git a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp index 86c050c3..a3dd5603 100644 --- a/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp +++ b/x64_dbg_gui/Project/Src/Gui/AppearanceDialog.cpp @@ -415,7 +415,6 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend("Selection", "DisassemblySelectionColor", ""); colorInfoListAppend("Background", "DisassemblyBackgroundColor", ""); - colorInfoListAppend("SideBar:", "", ""); #ifdef _WIN64 colorInfoListAppend("RIP Label", "SideBarCipLabelColor", "SideBarCipLabelBackgroundColor"); @@ -424,10 +423,13 @@ void AppearanceDialog::colorInfoListInit() #endif //_WIN64 colorInfoListAppend("Bullets", "SideBarBulletColor", ""); colorInfoListAppend("Breakpoints", "SideBarBulletBreakpointColor", ""); + colorInfoListAppend("Disabled Breakpoints", "SideBarBulletDisabledBreakpointColor", ""); colorInfoListAppend("Bookmarks", "SideBarBulletBookmarkColor", ""); - colorInfoListAppend("Jump Lines (conditional jump)", "SideBarConditionalJumpLineColor", ""); - colorInfoListAppend("Jump Lines (unconditional jump)", "SideBarUnconditionalJumpLineColor", ""); - colorInfoListAppend("Jump Lines (selected jump)", "SideBarJumpLineSelectionColor", ""); + colorInfoListAppend("Conditional Jump Lines (jump)", "SideBarConditionalJumpLineTrueColor", ""); + colorInfoListAppend("Conditional Jump Lines (no jump)", "SideBarConditionalJumpLineFalseColor", ""); + colorInfoListAppend("Unconditional Jump Lines (jump)", "SideBarUnconditionalJumpLineTrueColor", ""); + colorInfoListAppend("Unconditional Jump Lines (no jump)", "SideBarUnconditionalJumpLineFalseColor", ""); + colorInfoListAppend("Jump Lines (executing)", "SideBarJumpLineExecuteColor", ""); colorInfoListAppend("Background", "SideBarBackgroundColor", ""); colorInfoListAppend("Registers:", "", ""); @@ -438,7 +440,32 @@ void AppearanceDialog::colorInfoListInit() colorInfoListAppend("Name of Labels", "RegistersLabelColor", ""); colorInfoListAppend("Extra Info", "RegistersExtraInfoColor", ""); - + //dev helper + const QMap* Colors=&Configuration::instance()->defaultColors; + QString notFound; + for(int i=0; isize(); i++) + { + QString id=Colors->keys().at(i); + bool bFound=false; + for(int j=0; jlistColorNames->setContextMenuPolicy(Qt::ActionsContextMenu); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index 9fdcf712..e9172a78 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -376,7 +376,7 @@ void CPUDisassembly::toggleInt3BPAction() } DbgCmdExec(wCmd.toUtf8().constData()); - emit repainted(); + emit Disassembly::repainted(); } diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp index d1b25900..659c2dad 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.cpp @@ -45,7 +45,8 @@ void CPUSideBar::changeTopmostAddress(int_t i) if(i!=topVA) { topVA = i; - //qDebug() << i; + memset(®Dump, 0, sizeof(REGDUMP)); + DbgGetRegDump(®Dump); repaint(); } } @@ -99,7 +100,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) int_t instrVA = instr.rva + CodePtr->getBase(); // draw bullet - drawBullets(&painter, line, DbgGetBpxTypeAt(instrVA) != bp_none, DbgGetBookmarkAt(instrVA)); + drawBullets(&painter, line, DbgGetBpxTypeAt(instrVA) != bp_none, DbgIsBpDisabled(instrVA), DbgGetBookmarkAt(instrVA)); if(isJump(line)) //handle jumps { @@ -127,7 +128,7 @@ void CPUSideBar::paintEvent(QPaintEvent *event) else if(destVA <= last_va && destVA >= first_va) { int destLine = line; - while(destLine && destLine < InstrBuffer->size() && InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA) + while(destLine>-1 && destLine < InstrBuffer->size() && InstrBuffer->at(destLine).rva+CodePtr->getBase() != destVA) { if(destVA>instrVA) //jump goes up destLine++; @@ -149,29 +150,23 @@ void CPUSideBar::paintEvent(QPaintEvent *event) drawLabel(&painter, line, "EIP"); #endif - // read registers and add register labels - REGDUMP z; - memset(&z, 0, sizeof(REGDUMP)); - DbgGetRegDump(&z); - const int_t cur_VA = CodePtr->getBase() + InstrBuffer->at(line).rva; #ifdef _WIN64 - if(cur_VA == z.cax) drawLabel(&painter, line, "RAX"); - if(cur_VA == z.cbx) drawLabel(&painter, line, "RBX"); - if(cur_VA == z.ccx) drawLabel(&painter, line, "RCX"); - if(cur_VA == z.cdx) drawLabel(&painter, line, "RDX"); - if(cur_VA == z.csi) drawLabel(&painter, line, "RSI"); - if(cur_VA == z.cdi) drawLabel(&painter, line, "RDI"); + if(cur_VA == regDump.cax) drawLabel(&painter, line, "RAX"); + if(cur_VA == regDump.cbx) drawLabel(&painter, line, "RBX"); + if(cur_VA == regDump.ccx) drawLabel(&painter, line, "RCX"); + if(cur_VA == regDump.cdx) drawLabel(&painter, line, "RDX"); + if(cur_VA == regDump.csi) drawLabel(&painter, line, "RSI"); + if(cur_VA == regDump.cdi) drawLabel(&painter, line, "RDI"); #else //x86 - if(cur_VA == z.cax) drawLabel(&painter, line, "EAX"); - if(cur_VA == z.cbx) drawLabel(&painter, line, "EBX"); - if(cur_VA == z.ccx) drawLabel(&painter, line, "ECX"); - if(cur_VA == z.cdx) drawLabel(&painter, line, "EDX"); - if(cur_VA == z.csi) drawLabel(&painter, line, "ESI"); - if(cur_VA == z.cdi) drawLabel(&painter, line, "EDI"); + if(cur_VA == regDump.cax) drawLabel(&painter, line, "EAX"); + if(cur_VA == regDump.cbx) drawLabel(&painter, line, "EBX"); + if(cur_VA == regDump.ccx) drawLabel(&painter, line, "ECX"); + if(cur_VA == regDump.cdx) drawLabel(&painter, line, "EDX"); + if(cur_VA == regDump.csi) drawLabel(&painter, line, "ESI"); + if(cur_VA == regDump.cdi) drawLabel(&painter, line, "EDI"); #endif - } } @@ -179,16 +174,21 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo { painter->save(); if(!conditional) - painter->setPen(QPen(ConfigColor("SideBarConditionalJumpLineColor"), 1, Qt::SolidLine)); // jmp + painter->setPen(QPen(ConfigColor("SideBarConditionalJumpLineFalseColor"), 1, Qt::SolidLine)); // jmp else - painter->setPen(QPen(ConfigColor("SideBarUnconditionalJumpLineColor"), 1, Qt::DashLine)); + painter->setPen(QPen(ConfigColor("SideBarUnconditionalJumpLineFalseColor"), 1, Qt::DashLine)); QPen tmp = painter->pen(); if(isactive) //selected { + tmp.setWidth(2); //bold line = selected if(isexecute) //only highlight selected jumps - tmp.setColor(ConfigColor("SideBarJumpLineSelectionColor")); - tmp.setWidth(2); + { + if(!conditional) + tmp.setColor(ConfigColor("SideBarConditionalJumpLineTrueColor")); + else + tmp.setColor(ConfigColor("SideBarUnconditionalJumpLineTrueColor")); + } } painter->setPen(tmp); @@ -290,7 +290,7 @@ void CPUSideBar::drawJump(QPainter* painter, int startLine,int endLine,int jumpo painter->restore(); } -void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbookmark) +void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbpdisabled, bool isbookmark) { painter->save(); @@ -311,7 +311,8 @@ void CPUSideBar::drawBullets(QPainter* painter, int line, bool isbp, bool isbook //painter->drawLine(0, y, viewport()->width(), y); //draw raster painter->setRenderHint(QPainter::Antialiasing, true); - //painter->setPen(QPen("#FFFFFF")); + if(isbpdisabled) //disabled breakpoint + painter->setPen(ConfigColor("SideBarBulletDisabledBreakpointColor")); painter->drawEllipse(x, y+yAdd, radius, radius); painter->restore(); diff --git a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h index d891d95d..4e431ab7 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUSideBar.h @@ -26,7 +26,7 @@ public slots: protected: void paintEvent(QPaintEvent *event); void drawLabel(QPainter* painter, int Line, QString Text); - void drawBullets(QPainter* painter, int line, bool ispb, bool isbookmark); + void drawBullets(QPainter* painter, int line, bool ispb, bool isbpdisabled, bool isbookmark); bool isJump(int i) const; void drawJump(QPainter* painter, int startLine, int endLine, int jumpoffset, bool conditional, bool isexecute, bool isactive); @@ -40,6 +40,7 @@ private: CPUDisassembly *CodePtr; QList *InstrBuffer; QColor backgroundColor; + REGDUMP regDump; }; #endif // CPUSIDEBAR_H diff --git a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp index ae59ed2b..7ac9be0b 100644 --- a/x64_dbg_gui/Project/Src/Gui/Configuration.cpp +++ b/x64_dbg_gui/Project/Src/Gui/Configuration.cpp @@ -54,12 +54,13 @@ void Configuration::readColors() defaultColorMap.insert("SideBarCipLabelColor", QColor("#FFFFFF")); defaultColorMap.insert("SideBarCipLabelBackgroundColor", QColor("#4040FF")); defaultColorMap.insert("SideBarBackgroundColor", QColor("#FFFBF0")); - defaultColorMap.insert("SideBarJumpLineSelectionColor", QColor("#FF0000")); - defaultColorMap.insert("SideBarUnconditionalJumpLineColor", QColor("#808080")); - defaultColorMap.insert("SideBarConditionalJumpLineColor", QColor("#808080")); + defaultColorMap.insert("SideBarConditionalJumpLineTrueColor", QColor("#FF0000")); + defaultColorMap.insert("SideBarConditionalJumpLineFalseColor", QColor("#808080")); + defaultColorMap.insert("SideBarUnconditionalJumpLineTrueColor", QColor("#FF0000")); + defaultColorMap.insert("SideBarUnconditionalJumpLineFalseColor", QColor("#808080")); defaultColorMap.insert("SideBarBulletColor", QColor("#808080")); defaultColorMap.insert("SideBarBulletBreakpointColor", QColor("#FF0000")); - // TODO: defaultColorMap.insert("SideBarBulletBreakpointDisabledColor", QColor("#0F610F")); + defaultColorMap.insert("SideBarBulletDisabledBreakpointColor", QColor("#FF0000")); defaultColorMap.insert("SideBarBulletBookmarkColor", QColor("#FEE970")); defaultColorMap.insert("RegistersBackgroundColor", QColor("#FFFBF0")); @@ -69,10 +70,6 @@ void Configuration::readColors() defaultColorMap.insert("RegistersLabelColor", QColor("#000000")); defaultColorMap.insert("RegistersExtraInfoColor", QColor("#000000")); - - - - Colors = defaultColors = defaultColorMap; //read config for(int i=0; i Date: Fri, 13 Jun 2014 02:32:51 +0200 Subject: [PATCH 085/676] GUI: BeaTokenizer: fixed various small bugs in the tokenizer, now it appears to be working good --- .../Project/Src/Disassembler/BeaTokenizer.cpp | 64 +++++++++++-------- .../Project/Src/Disassembler/BeaTokenizer.h | 2 +- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp index 122d8414..e1f2d40e 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp @@ -78,22 +78,21 @@ void BeaTokenizer::Mnemonic(BeaInstructionToken* instr, const DISASM* disasm) else if(IsNopInstruction(mnemonic, disasm)) //nop instructions type=TokenMnemonicNop; AddToken(instr, type, mnemonic, 0); - AddToken(instr, TokenRequiredSpace, " ", 0); } QString BeaTokenizer::PrintValue(const BeaTokenValue* value) { - return QString("%1").arg(value->value, 0, 16, QChar('0')); + return QString("%1").arg(value->value&(uint_t)-1, 0, 16, QChar('0')).toUpper(); } QString BeaTokenizer::RegisterToString(int size, int reg) { ARGUMENTS_TYPE regValue=(ARGUMENTS_TYPE)(reg&0xFFFF); if(!registerMap.contains(size)) //invalid size - return "UNKNOWN_REGISTER"; + return QString("UNKNOWN_REGISTER(size:%1)").arg(size); QMap* currentMap=®isterMap.find(size).value(); if(!currentMap->contains(regValue)) - return "UNKNOWN_REGISTER"; + return QString("UNKNOWN_REGISTER(reg:%1)").arg(reg); return currentMap->find(regValue).value(); } @@ -107,24 +106,12 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co AddToken(instr, TokenComma, ",", 0); AddToken(instr, TokenOptionalSpace, " ", 0); } + else //no arg yet (only prefix/mnemonic + AddToken(instr, TokenRequiredSpace, " ", 0); //print argument QString argMnemonic=QString(arg->ArgMnemonic).toLower().trimmed(); - if(disasm->Instruction.BranchType != 0) //jump/call - { - BeaTokenValue value; - value.size=arg->ArgSize/16; - value.value=disasm->Instruction.AddrValue; - AddToken(instr, TokenCodeDest, PrintValue(&value), &value); - } - else if((arg->ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) //immediat - { - BeaTokenValue value; - value.size=arg->ArgSize/16; - value.value=disasm->Instruction.Immediat; - AddToken(instr, TokenImmediat, PrintValue(&value), &value); - } - else if((arg->ArgType&MEMORY_TYPE)==MEMORY_TYPE) //memory argument + if((arg->ArgType&MEMORY_TYPE)==MEMORY_TYPE) //memory argument { //#size ptr #segment:[#BaseRegister + #IndexRegister*#Scale +/- #Displacement] if(memSizeNames.contains(arg->ArgSize)) @@ -140,7 +127,7 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co bool prependPlusMinus=false; if(arg->Memory.BaseRegister) //base register { - AddToken(instr, TokenMemoryBaseRegister, RegisterToString(arg->ArgSize, arg->Memory.BaseRegister), 0); + AddToken(instr, TokenMemoryBaseRegister, RegisterToString(sizeof(int_t)*8, arg->Memory.BaseRegister), 0); prependPlusMinus=true; } if(arg->Memory.IndexRegister) //index register + scale @@ -148,11 +135,18 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co if(prependPlusMinus) { AddToken(instr, TokenMemorySpace, " ", 0); - AddToken(instr, TokenMemoryPlusMinus, "+", 0); + AddToken(instr, TokenMemoryOperator, "+", 0); AddToken(instr, TokenMemorySpace, " ", 0); } - AddToken(instr, TokenMemoryIndexRegister, RegisterToString(arg->ArgSize, arg->Memory.BaseRegister), 0); - AddToken(instr, TokenMemoryScale, QString("%1").arg(arg->Memory.Displacement), 0); + AddToken(instr, TokenMemoryIndexRegister, RegisterToString(sizeof(int_t)*8, arg->Memory.IndexRegister), 0); + int scale=arg->Memory.Scale; + if(scale>1) //eax * 1 = eax + { + AddToken(instr, TokenMemorySpace, " ", 0); + AddToken(instr, TokenMemoryOperator, "*", 0); + AddToken(instr, TokenMemorySpace, " ", 0); + AddToken(instr, TokenMemoryScale, QString("%1").arg(arg->Memory.Scale), 0); + } prependPlusMinus=true; } @@ -170,18 +164,33 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co if(printDisplacement.value<0) //negative -> '-(displacement*-1)' { printDisplacement.value*=-1; + printDisplacement.size=arg->ArgSize/8; plusMinus="-"; } if(prependPlusMinus) { AddToken(instr, TokenMemorySpace, " ", 0); - AddToken(instr, TokenMemoryPlusMinus, plusMinus, 0); + AddToken(instr, TokenMemoryOperator, plusMinus, 0); AddToken(instr, TokenMemorySpace, " ", 0); } AddToken(instr, TokenMemoryDisplacement, PrintValue(&printDisplacement), &displacement); } AddToken(instr, TokenMemoryBrackets, "]", 0); } + else if(disasm->Instruction.BranchType != 0) //jump/call + { + BeaTokenValue value; + value.size=arg->ArgSize/8; + value.value=disasm->Instruction.AddrValue; + AddToken(instr, TokenCodeDest, PrintValue(&value), &value); + } + else if((arg->ArgType&CONSTANT_TYPE)==CONSTANT_TYPE) //immediat + { + BeaTokenValue value; + value.size=arg->ArgSize/8; + value.value=disasm->Instruction.Immediat; + AddToken(instr, TokenImmediat, PrintValue(&value), &value); + } else if((arg->ArgType®ISTER_TYPE)==REGISTER_TYPE) //registers { BeaTokenType type=TokenGeneralRegister; //general x86/unknown register @@ -195,6 +204,7 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co } else //other AddToken(instr, TokenGeneral, argMnemonic, 0); + *hadarg=true; //we now added an argument } void BeaTokenizer::AddColorName(BeaTokenType type, QString color, QString backgroundColor) @@ -341,7 +351,7 @@ void BeaTokenizer::Init() AddColorName(TokenMemoryIndexRegister, "", ""); AddColorName(TokenMemoryScale, "", ""); AddColorName(TokenMemoryDisplacement, "", ""); - AddColorName(TokenMemoryPlusMinus, "", ""); + AddColorName(TokenMemoryOperator, "", ""); //registers AddColorName(TokenGeneralRegister, "", ""); AddColorName(TokenFpuRegister, "", ""); @@ -408,5 +418,9 @@ void BeaTokenizer::TokenToRichText(const BeaInstructionToken* instr, QListappend(richText); + richText.flags=FlagColor; + richText.textColor=Qt::red; + richText.text="|"; + richTextList->append(richText); } } diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h index d8a706a5..f70a1ca3 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.h @@ -43,7 +43,7 @@ public: TokenMemoryIndexRegister, TokenMemoryScale, TokenMemoryDisplacement, - TokenMemoryPlusMinus, + TokenMemoryOperator, //registers TokenGeneralRegister, TokenFpuRegister, From ae50e0a7a33a552df96e7119d955213b94032b66 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 13 Jun 2014 02:33:21 +0200 Subject: [PATCH 086/676] GUI: generate debug symbols in release mode (useful for JIT debugging on unknown crashes) --- x64_dbg_gui/Project/DebuggerX64.pro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/DebuggerX64.pro b/x64_dbg_gui/Project/DebuggerX64.pro index c4dc6105..575dd67c 100644 --- a/x64_dbg_gui/Project/DebuggerX64.pro +++ b/x64_dbg_gui/Project/DebuggerX64.pro @@ -13,7 +13,9 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #QMAKE_CFLAGS_RELEASE += -O3 #QMAKE_CXXFLAGS_RELEASE += -O3 - +#generate debug symbols in release mode +QMAKE_CFLAGS_RELEASE += -Zi +QMAKE_LFLAGS_RELEASE += /DEBUG !contains(QMAKE_HOST.arch, x86_64) { TARGET = x32_gui From 13cd7a9353d1fb96825d772cd0db25ede38ef3ff Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 13 Jun 2014 05:09:47 +0200 Subject: [PATCH 087/676] GUI: BeaTokenizer: added string instructions + fixed minor bugs + more highlighting customization + added label resolver to BeaTokenizer --- .../Project/Src/Disassembler/BeaTokenizer.cpp | 192 ++++++++++++------ .../Project/Src/Disassembler/BeaTokenizer.h | 23 ++- x64_dbg_gui/Project/Src/Gui/Configuration.cpp | 47 +++++ 3 files changed, 190 insertions(+), 72 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp index e1f2d40e..547a712f 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp @@ -7,7 +7,6 @@ QStringList BeaTokenizer::segmentNames; QMap BeaTokenizer::memSizeNames; QMap> BeaTokenizer::registerMap; - //functions BeaTokenizer::BeaTokenizer() { @@ -17,7 +16,7 @@ void BeaTokenizer::AddToken(BeaInstructionToken* instr, const BeaTokenType type, { BeaSingleToken token; token.type=type; - if(type!=TokenRequiredSpace && type!=TokenOptionalSpace && type!=TokenMemorySpace) + if(type!=TokenSpace && type!=TokenArgumentSpace && type!=TokenMemoryOperatorSpace) token.text=text.trimmed(); //remove whitespaces from the start and end else token.text=text; @@ -36,17 +35,17 @@ void BeaTokenizer::Prefix(BeaInstructionToken* instr, const DISASM* disasm) if(disasm->Prefix.LockPrefix) { AddToken(instr, TokenPrefix, "lock", 0); - AddToken(instr, TokenRequiredSpace, " ", 0); + AddToken(instr, TokenSpace, " ", 0); } if(disasm->Prefix.RepPrefix) { AddToken(instr, TokenPrefix, "rep", 0); - AddToken(instr, TokenRequiredSpace, " ", 0); + AddToken(instr, TokenSpace, " ", 0); } if(disasm->Prefix.RepnePrefix) { AddToken(instr, TokenPrefix, "repne", 0); - AddToken(instr, TokenRequiredSpace, " ", 0); + AddToken(instr, TokenSpace, " ", 0); } } @@ -59,9 +58,55 @@ bool BeaTokenizer::IsNopInstruction(QString mnemonic, const DISASM* disasm) return false; } +void BeaTokenizer::StringInstructionMemory(BeaInstructionToken* instr, int size, QString segment, ARGUMENTS_TYPE reg) +{ + if(memSizeNames.contains(size)) + AddToken(instr, TokenMemorySize, memSizeNames.find(size).value()+" ptr", 0); + else + AddToken(instr, TokenMemorySize, "??? ptr", 0); + AddToken(instr, TokenSpace, " ", 0); + AddToken(instr, TokenMemorySegment, segment, 0); + AddToken(instr, TokenUncategorized, ":", 0); + AddToken(instr, TokenMemoryBrackets, "[", 0); + AddToken(instr, TokenMemoryBaseRegister, RegisterToString(sizeof(int_t)*8, reg), 0); //EDI/RDI + AddToken(instr, TokenMemoryBrackets, "]", 0); +} + +void BeaTokenizer::StringInstruction(QString mnemonic, BeaInstructionToken* instr, const DISASM* disasm) +{ + AddToken(instr, TokenMnemonicNormal, mnemonic, 0); + AddToken(instr, TokenSpace, " ", 0); + if(mnemonic=="movs") + { + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "es", REG7); //EDI/RDI + AddToken(instr, TokenComma, ",", 0); + AddToken(instr, TokenArgumentSpace, " ", 0); + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "ds", REG6); //ESI/RSI + } + else if(mnemonic=="cmps") + { + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "ds", REG6); //EDI/RDI + AddToken(instr, TokenComma, ",", 0); + AddToken(instr, TokenArgumentSpace, " ", 0); + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "es", REG7); //ESI/RSI + } + else if(mnemonic=="scas" || mnemonic=="stos") + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "es", REG7); //ESI/RSI + else if(mnemonic=="lods") + StringInstructionMemory(instr, disasm->Argument1.ArgSize, "ds", REG6); //ESI/RSI + else if(mnemonic=="outs") + { + AddToken(instr, TokenGeneralRegister, "dx", 0); + AddToken(instr, TokenComma, ",", 0); + AddToken(instr, TokenArgumentSpace, " ", 0); + StringInstructionMemory(instr, disasm->Argument2.ArgSize, "es", REG6); //EDI/RDI + } +} + void BeaTokenizer::Mnemonic(BeaInstructionToken* instr, const DISASM* disasm) { QString mnemonic=QString(disasm->Instruction.Mnemonic).trimmed().toLower(); + QString completeInstr=QString(disasm->CompleteInstr).trimmed().toLower(); BeaTokenType type=TokenMnemonicNormal; int brtype=disasm->Instruction.BranchType; if(brtype) //jump/call @@ -77,12 +122,34 @@ void BeaTokenizer::Mnemonic(BeaInstructionToken* instr, const DISASM* disasm) type=TokenMnemonicPushPop; else if(IsNopInstruction(mnemonic, disasm)) //nop instructions type=TokenMnemonicNop; + else if(completeInstr.contains("movs") || completeInstr.contains("cmps") || completeInstr.contains("scas") || completeInstr.contains("lods") || completeInstr.contains("stos") || completeInstr.contains("outs")) + { + mnemonic.truncate(4); + StringInstruction(mnemonic, instr, disasm); + return; + } AddToken(instr, type, mnemonic, 0); } -QString BeaTokenizer::PrintValue(const BeaTokenValue* value) +QString BeaTokenizer::PrintValue(const BeaTokenValue* value, bool module) { - return QString("%1").arg(value->value&(uint_t)-1, 0, 16, QChar('0')).toUpper(); + char labelText[MAX_LABEL_SIZE]=""; + char moduleText[MAX_MODULE_SIZE]=""; + int_t addr=value->value; + bool bHasLabel=DbgGetLabelAt(addr, SEG_DEFAULT, labelText); + bool bHasModule=(module && DbgGetModuleAt(addr, moduleText)); + QString addrText; + addrText=QString("%1").arg(addr&(uint_t)-1, 0, 16, QChar('0')).toUpper(); + QString finalText; + if(bHasLabel && bHasModule) // + finalText=QString("<%1.%2>").arg(moduleText).arg(labelText); + else if(bHasModule) //module.addr + finalText=QString("%1.%2").arg(moduleText).arg(addrText); + else if(bHasLabel) //

                        GNU GENERAL PUBLIC LICENSE
    +                       Version 3, 29 June 2007
    +
    + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
    + Everyone is permitted to copy and distribute verbatim copies
    + of this license document, but changing it is not allowed.
    +
    +                            Preamble
    +
    +  The GNU General Public License is a free, copyleft license for
    +software and other kinds of works.
    +
    +  The licenses for most software and other practical works are designed
    +to take away your freedom to share and change the works.  By contrast,
    +the GNU General Public License is intended to guarantee your freedom to
    +share and change all versions of a program--to make sure it remains free
    +software for all its users.  We, the Free Software Foundation, use the
    +GNU General Public License for most of our software; it applies also to
    +any other work released this way by its authors.  You can apply it to
    +your programs, too.
    +
    +  When we speak of free software, we are referring to freedom, not
    +price.  Our General Public Licenses are designed to make sure that you
    +have the freedom to distribute copies of free software (and charge for
    +them if you wish), that you receive source code or can get it if you
    +want it, that you can change the software or use pieces of it in new
    +free programs, and that you know you can do these things.
    +
    +  To protect your rights, we need to prevent others from denying you
    +these rights or asking you to surrender the rights.  Therefore, you have
    +certain responsibilities if you distribute copies of the software, or if
    +you modify it: responsibilities to respect the freedom of others.
    +
    +  For example, if you distribute copies of such a program, whether
    +gratis or for a fee, you must pass on to the recipients the same
    +freedoms that you received.  You must make sure that they, too, receive
    +or can get the source code.  And you must show them these terms so they
    +know their rights.
    +
    +  Developers that use the GNU GPL protect your rights with two steps:
    +(1) assert copyright on the software, and (2) offer you this License
    +giving you legal permission to copy, distribute and/or modify it.
    +
    +  For the developers' and authors' protection, the GPL clearly explains
    +that there is no warranty for this free software.  For both users' and
    +authors' sake, the GPL requires that modified versions be marked as
    +changed, so that their problems will not be attributed erroneously to
    +authors of previous versions.
    +
    +  Some devices are designed to deny users access to install or run
    +modified versions of the software inside them, although the manufacturer
    +can do so.  This is fundamentally incompatible with the aim of
    +protecting users' freedom to change the software.  The systematic
    +pattern of such abuse occurs in the area of products for individuals to
    +use, which is precisely where it is most unacceptable.  Therefore, we
    +have designed this version of the GPL to prohibit the practice for those
    +products.  If such problems arise substantially in other domains, we
    +stand ready to extend this provision to those domains in future versions
    +of the GPL, as needed to protect the freedom of users.
    +
    +  Finally, every program is threatened constantly by software patents.
    +States should not allow patents to restrict development and use of
    +software on general-purpose computers, but in those that do, we wish to
    +avoid the special danger that patents applied to a free program could
    +make it effectively proprietary.  To prevent this, the GPL assures that
    +patents cannot be used to render the program non-free.
    +
    +  The precise terms and conditions for copying, distribution and
    +modification follow.
    +
    +                       TERMS AND CONDITIONS
    +
    +  0. Definitions.
    +
    +  "This License" refers to version 3 of the GNU General Public License.
    +
    +  "Copyright" also means copyright-like laws that apply to other kinds of
    +works, such as semiconductor masks.
    +
    +  "The Program" refers to any copyrightable work licensed under this
    +License.  Each licensee is addressed as "you".  "Licensees" and
    +"recipients" may be individuals or organizations.
    +
    +  To "modify" a work means to copy from or adapt all or part of the work
    +in a fashion requiring copyright permission, other than the making of an
    +exact copy.  The resulting work is called a "modified version" of the
    +earlier work or a work "based on" the earlier work.
    +
    +  A "covered work" means either the unmodified Program or a work based
    +on the Program.
    +
    +  To "propagate" a work means to do anything with it that, without
    +permission, would make you directly or secondarily liable for
    +infringement under applicable copyright law, except executing it on a
    +computer or modifying a private copy.  Propagation includes copying,
    +distribution (with or without modification), making available to the
    +public, and in some countries other activities as well.
    +
    +  To "convey" a work means any kind of propagation that enables other
    +parties to make or receive copies.  Mere interaction with a user through
    +a computer network, with no transfer of a copy, is not conveying.
    +
    +  An interactive user interface displays "Appropriate Legal Notices"
    +to the extent that it includes a convenient and prominently visible
    +feature that (1) displays an appropriate copyright notice, and (2)
    +tells the user that there is no warranty for the work (except to the
    +extent that warranties are provided), that licensees may convey the
    +work under this License, and how to view a copy of this License.  If
    +the interface presents a list of user commands or options, such as a
    +menu, a prominent item in the list meets this criterion.
    +
    +  1. Source Code.
    +
    +  The "source code" for a work means the preferred form of the work
    +for making modifications to it.  "Object code" means any non-source
    +form of a work.
    +
    +  A "Standard Interface" means an interface that either is an official
    +standard defined by a recognized standards body, or, in the case of
    +interfaces specified for a particular programming language, one that
    +is widely used among developers working in that language.
    +
    +  The "System Libraries" of an executable work include anything, other
    +than the work as a whole, that (a) is included in the normal form of
    +packaging a Major Component, but which is not part of that Major
    +Component, and (b) serves only to enable use of the work with that
    +Major Component, or to implement a Standard Interface for which an
    +implementation is available to the public in source code form.  A
    +"Major Component", in this context, means a major essential component
    +(kernel, window system, and so on) of the specific operating system
    +(if any) on which the executable work runs, or a compiler used to
    +produce the work, or an object code interpreter used to run it.
    +
    +  The "Corresponding Source" for a work in object code form means all
    +the source code needed to generate, install, and (for an executable
    +work) run the object code and to modify the work, including scripts to
    +control those activities.  However, it does not include the work's
    +System Libraries, or general-purpose tools or generally available free
    +programs which are used unmodified in performing those activities but
    +which are not part of the work.  For example, Corresponding Source
    +includes interface definition files associated with source files for
    +the work, and the source code for shared libraries and dynamically
    +linked subprograms that the work is specifically designed to require,
    +such as by intimate data communication or control flow between those
    +subprograms and other parts of the work.
    +
    +  The Corresponding Source need not include anything that users
    +can regenerate automatically from other parts of the Corresponding
    +Source.
    +
    +  The Corresponding Source for a work in source code form is that
    +same work.
    +
    +  2. Basic Permissions.
    +
    +  All rights granted under this License are granted for the term of
    +copyright on the Program, and are irrevocable provided the stated
    +conditions are met.  This License explicitly affirms your unlimited
    +permission to run the unmodified Program.  The output from running a
    +covered work is covered by this License only if the output, given its
    +content, constitutes a covered work.  This License acknowledges your
    +rights of fair use or other equivalent, as provided by copyright law.
    +
    +  You may make, run and propagate covered works that you do not
    +convey, without conditions so long as your license otherwise remains
    +in force.  You may convey covered works to others for the sole purpose
    +of having them make modifications exclusively for you, or provide you
    +with facilities for running those works, provided that you comply with
    +the terms of this License in conveying all material for which you do
    +not control copyright.  Those thus making or running the covered works
    +for you must do so exclusively on your behalf, under your direction
    +and control, on terms that prohibit them from making any copies of
    +your copyrighted material outside their relationship with you.
    +
    +  Conveying under any other circumstances is permitted solely under
    +the conditions stated below.  Sublicensing is not allowed; section 10
    +makes it unnecessary.
    +
    +  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
    +
    +  No covered work shall be deemed part of an effective technological
    +measure under any applicable law fulfilling obligations under article
    +11 of the WIPO copyright treaty adopted on 20 December 1996, or
    +similar laws prohibiting or restricting circumvention of such
    +measures.
    +
    +  When you convey a covered work, you waive any legal power to forbid
    +circumvention of technological measures to the extent such circumvention
    +is effected by exercising rights under this License with respect to
    +the covered work, and you disclaim any intention to limit operation or
    +modification of the work as a means of enforcing, against the work's
    +users, your or third parties' legal rights to forbid circumvention of
    +technological measures.
    +
    +  4. Conveying Verbatim Copies.
    +
    +  You may convey verbatim copies of the Program's source code as you
    +receive it, in any medium, provided that you conspicuously and
    +appropriately publish on each copy an appropriate copyright notice;
    +keep intact all notices stating that this License and any
    +non-permissive terms added in accord with section 7 apply to the code;
    +keep intact all notices of the absence of any warranty; and give all
    +recipients a copy of this License along with the Program.
    +
    +  You may charge any price or no price for each copy that you convey,
    +and you may offer support or warranty protection for a fee.
    +
    +  5. Conveying Modified Source Versions.
    +
    +  You may convey a work based on the Program, or the modifications to
    +produce it from the Program, in the form of source code under the
    +terms of section 4, provided that you also meet all of these conditions:
    +
    +    a) The work must carry prominent notices stating that you modified
    +    it, and giving a relevant date.
    +
    +    b) The work must carry prominent notices stating that it is
    +    released under this License and any conditions added under section
    +    7.  This requirement modifies the requirement in section 4 to
    +    "keep intact all notices".
    +
    +    c) You must license the entire work, as a whole, under this
    +    License to anyone who comes into possession of a copy.  This
    +    License will therefore apply, along with any applicable section 7
    +    additional terms, to the whole of the work, and all its parts,
    +    regardless of how they are packaged.  This License gives no
    +    permission to license the work in any other way, but it does not
    +    invalidate such permission if you have separately received it.
    +
    +    d) If the work has interactive user interfaces, each must display
    +    Appropriate Legal Notices; however, if the Program has interactive
    +    interfaces that do not display Appropriate Legal Notices, your
    +    work need not make them do so.
    +
    +  A compilation of a covered work with other separate and independent
    +works, which are not by their nature extensions of the covered work,
    +and which are not combined with it such as to form a larger program,
    +in or on a volume of a storage or distribution medium, is called an
    +"aggregate" if the compilation and its resulting copyright are not
    +used to limit the access or legal rights of the compilation's users
    +beyond what the individual works permit.  Inclusion of a covered work
    +in an aggregate does not cause this License to apply to the other
    +parts of the aggregate.
    +
    +  6. Conveying Non-Source Forms.
    +
    +  You may convey a covered work in object code form under the terms
    +of sections 4 and 5, provided that you also convey the
    +machine-readable Corresponding Source under the terms of this License,
    +in one of these ways:
    +
    +    a) Convey the object code in, or embodied in, a physical product
    +    (including a physical distribution medium), accompanied by the
    +    Corresponding Source fixed on a durable physical medium
    +    customarily used for software interchange.
    +
    +    b) Convey the object code in, or embodied in, a physical product
    +    (including a physical distribution medium), accompanied by a
    +    written offer, valid for at least three years and valid for as
    +    long as you offer spare parts or customer support for that product
    +    model, to give anyone who possesses the object code either (1) a
    +    copy of the Corresponding Source for all the software in the
    +    product that is covered by this License, on a durable physical
    +    medium customarily used for software interchange, for a price no
    +    more than your reasonable cost of physically performing this
    +    conveying of source, or (2) access to copy the
    +    Corresponding Source from a network server at no charge.
    +
    +    c) Convey individual copies of the object code with a copy of the
    +    written offer to provide the Corresponding Source.  This
    +    alternative is allowed only occasionally and noncommercially, and
    +    only if you received the object code with such an offer, in accord
    +    with subsection 6b.
    +
    +    d) Convey the object code by offering access from a designated
    +    place (gratis or for a charge), and offer equivalent access to the
    +    Corresponding Source in the same way through the same place at no
    +    further charge.  You need not require recipients to copy the
    +    Corresponding Source along with the object code.  If the place to
    +    copy the object code is a network server, the Corresponding Source
    +    may be on a different server (operated by you or a third party)
    +    that supports equivalent copying facilities, provided you maintain
    +    clear directions next to the object code saying where to find the
    +    Corresponding Source.  Regardless of what server hosts the
    +    Corresponding Source, you remain obligated to ensure that it is
    +    available for as long as needed to satisfy these requirements.
    +
    +    e) Convey the object code using peer-to-peer transmission, provided
    +    you inform other peers where the object code and Corresponding
    +    Source of the work are being offered to the general public at no
    +    charge under subsection 6d.
    +
    +  A separable portion of the object code, whose source code is excluded
    +from the Corresponding Source as a System Library, need not be
    +included in conveying the object code work.
    +
    +  A "User Product" is either (1) a "consumer product", which means any
    +tangible personal property which is normally used for personal, family,
    +or household purposes, or (2) anything designed or sold for incorporation
    +into a dwelling.  In determining whether a product is a consumer product,
    +doubtful cases shall be resolved in favor of coverage.  For a particular
    +product received by a particular user, "normally used" refers to a
    +typical or common use of that class of product, regardless of the status
    +of the particular user or of the way in which the particular user
    +actually uses, or expects or is expected to use, the product.  A product
    +is a consumer product regardless of whether the product has substantial
    +commercial, industrial or non-consumer uses, unless such uses represent
    +the only significant mode of use of the product.
    +
    +  "Installation Information" for a User Product means any methods,
    +procedures, authorization keys, or other information required to install
    +and execute modified versions of a covered work in that User Product from
    +a modified version of its Corresponding Source.  The information must
    +suffice to ensure that the continued functioning of the modified object
    +code is in no case prevented or interfered with solely because
    +modification has been made.
    +
    +  If you convey an object code work under this section in, or with, or
    +specifically for use in, a User Product, and the conveying occurs as
    +part of a transaction in which the right of possession and use of the
    +User Product is transferred to the recipient in perpetuity or for a
    +fixed term (regardless of how the transaction is characterized), the
    +Corresponding Source conveyed under this section must be accompanied
    +by the Installation Information.  But this requirement does not apply
    +if neither you nor any third party retains the ability to install
    +modified object code on the User Product (for example, the work has
    +been installed in ROM).
    +
    +  The requirement to provide Installation Information does not include a
    +requirement to continue to provide support service, warranty, or updates
    +for a work that has been modified or installed by the recipient, or for
    +the User Product in which it has been modified or installed.  Access to a
    +network may be denied when the modification itself materially and
    +adversely affects the operation of the network or violates the rules and
    +protocols for communication across the network.
    +
    +  Corresponding Source conveyed, and Installation Information provided,
    +in accord with this section must be in a format that is publicly
    +documented (and with an implementation available to the public in
    +source code form), and must require no special password or key for
    +unpacking, reading or copying.
    +
    +  7. Additional Terms.
    +
    +  "Additional permissions" are terms that supplement the terms of this
    +License by making exceptions from one or more of its conditions.
    +Additional permissions that are applicable to the entire Program shall
    +be treated as though they were included in this License, to the extent
    +that they are valid under applicable law.  If additional permissions
    +apply only to part of the Program, that part may be used separately
    +under those permissions, but the entire Program remains governed by
    +this License without regard to the additional permissions.
    +
    +  When you convey a copy of a covered work, you may at your option
    +remove any additional permissions from that copy, or from any part of
    +it.  (Additional permissions may be written to require their own
    +removal in certain cases when you modify the work.)  You may place
    +additional permissions on material, added by you to a covered work,
    +for which you have or can give appropriate copyright permission.
    +
    +  Notwithstanding any other provision of this License, for material you
    +add to a covered work, you may (if authorized by the copyright holders of
    +that material) supplement the terms of this License with terms:
    +
    +    a) Disclaiming warranty or limiting liability differently from the
    +    terms of sections 15 and 16 of this License; or
    +
    +    b) Requiring preservation of specified reasonable legal notices or
    +    author attributions in that material or in the Appropriate Legal
    +    Notices displayed by works containing it; or
    +
    +    c) Prohibiting misrepresentation of the origin of that material, or
    +    requiring that modified versions of such material be marked in
    +    reasonable ways as different from the original version; or
    +
    +    d) Limiting the use for publicity purposes of names of licensors or
    +    authors of the material; or
    +
    +    e) Declining to grant rights under trademark law for use of some
    +    trade names, trademarks, or service marks; or
    +
    +    f) Requiring indemnification of licensors and authors of that
    +    material by anyone who conveys the material (or modified versions of
    +    it) with contractual assumptions of liability to the recipient, for
    +    any liability that these contractual assumptions directly impose on
    +    those licensors and authors.
    +
    +  All other non-permissive additional terms are considered "further
    +restrictions" within the meaning of section 10.  If the Program as you
    +received it, or any part of it, contains a notice stating that it is
    +governed by this License along with a term that is a further
    +restriction, you may remove that term.  If a license document contains
    +a further restriction but permits relicensing or conveying under this
    +License, you may add to a covered work material governed by the terms
    +of that license document, provided that the further restriction does
    +not survive such relicensing or conveying.
    +
    +  If you add terms to a covered work in accord with this section, you
    +must place, in the relevant source files, a statement of the
    +additional terms that apply to those files, or a notice indicating
    +where to find the applicable terms.
    +
    +  Additional terms, permissive or non-permissive, may be stated in the
    +form of a separately written license, or stated as exceptions;
    +the above requirements apply either way.
    +
    +  8. Termination.
    +
    +  You may not propagate or modify a covered work except as expressly
    +provided under this License.  Any attempt otherwise to propagate or
    +modify it is void, and will automatically terminate your rights under
    +this License (including any patent licenses granted under the third
    +paragraph of section 11).
    +
    +  However, if you cease all violation of this License, then your
    +license from a particular copyright holder is reinstated (a)
    +provisionally, unless and until the copyright holder explicitly and
    +finally terminates your license, and (b) permanently, if the copyright
    +holder fails to notify you of the violation by some reasonable means
    +prior to 60 days after the cessation.
    +
    +  Moreover, your license from a particular copyright holder is
    +reinstated permanently if the copyright holder notifies you of the
    +violation by some reasonable means, this is the first time you have
    +received notice of violation of this License (for any work) from that
    +copyright holder, and you cure the violation prior to 30 days after
    +your receipt of the notice.
    +
    +  Termination of your rights under this section does not terminate the
    +licenses of parties who have received copies or rights from you under
    +this License.  If your rights have been terminated and not permanently
    +reinstated, you do not qualify to receive new licenses for the same
    +material under section 10.
    +
    +  9. Acceptance Not Required for Having Copies.
    +
    +  You are not required to accept this License in order to receive or
    +run a copy of the Program.  Ancillary propagation of a covered work
    +occurring solely as a consequence of using peer-to-peer transmission
    +to receive a copy likewise does not require acceptance.  However,
    +nothing other than this License grants you permission to propagate or
    +modify any covered work.  These actions infringe copyright if you do
    +not accept this License.  Therefore, by modifying or propagating a
    +covered work, you indicate your acceptance of this License to do so.
    +
    +  10. Automatic Licensing of Downstream Recipients.
    +
    +  Each time you convey a covered work, the recipient automatically
    +receives a license from the original licensors, to run, modify and
    +propagate that work, subject to this License.  You are not responsible
    +for enforcing compliance by third parties with this License.
    +
    +  An "entity transaction" is a transaction transferring control of an
    +organization, or substantially all assets of one, or subdividing an
    +organization, or merging organizations.  If propagation of a covered
    +work results from an entity transaction, each party to that
    +transaction who receives a copy of the work also receives whatever
    +licenses to the work the party's predecessor in interest had or could
    +give under the previous paragraph, plus a right to possession of the
    +Corresponding Source of the work from the predecessor in interest, if
    +the predecessor has it or can get it with reasonable efforts.
    +
    +  You may not impose any further restrictions on the exercise of the
    +rights granted or affirmed under this License.  For example, you may
    +not impose a license fee, royalty, or other charge for exercise of
    +rights granted under this License, and you may not initiate litigation
    +(including a cross-claim or counterclaim in a lawsuit) alleging that
    +any patent claim is infringed by making, using, selling, offering for
    +sale, or importing the Program or any portion of it.
    +
    +  11. Patents.
    +
    +  A "contributor" is a copyright holder who authorizes use under this
    +License of the Program or a work on which the Program is based.  The
    +work thus licensed is called the contributor's "contributor version".
    +
    +  A contributor's "essential patent claims" are all patent claims
    +owned or controlled by the contributor, whether already acquired or
    +hereafter acquired, that would be infringed by some manner, permitted
    +by this License, of making, using, or selling its contributor version,
    +but do not include claims that would be infringed only as a
    +consequence of further modification of the contributor version.  For
    +purposes of this definition, "control" includes the right to grant
    +patent sublicenses in a manner consistent with the requirements of
    +this License.
    +
    +  Each contributor grants you a non-exclusive, worldwide, royalty-free
    +patent license under the contributor's essential patent claims, to
    +make, use, sell, offer for sale, import and otherwise run, modify and
    +propagate the contents of its contributor version.
    +
    +  In the following three paragraphs, a "patent license" is any express
    +agreement or commitment, however denominated, not to enforce a patent
    +(such as an express permission to practice a patent or covenant not to
    +sue for patent infringement).  To "grant" such a patent license to a
    +party means to make such an agreement or commitment not to enforce a
    +patent against the party.
    +
    +  If you convey a covered work, knowingly relying on a patent license,
    +and the Corresponding Source of the work is not available for anyone
    +to copy, free of charge and under the terms of this License, through a
    +publicly available network server or other readily accessible means,
    +then you must either (1) cause the Corresponding Source to be so
    +available, or (2) arrange to deprive yourself of the benefit of the
    +patent license for this particular work, or (3) arrange, in a manner
    +consistent with the requirements of this License, to extend the patent
    +license to downstream recipients.  "Knowingly relying" means you have
    +actual knowledge that, but for the patent license, your conveying the
    +covered work in a country, or your recipient's use of the covered work
    +in a country, would infringe one or more identifiable patents in that
    +country that you have reason to believe are valid.
    +
    +  If, pursuant to or in connection with a single transaction or
    +arrangement, you convey, or propagate by procuring conveyance of, a
    +covered work, and grant a patent license to some of the parties
    +receiving the covered work authorizing them to use, propagate, modify
    +or convey a specific copy of the covered work, then the patent license
    +you grant is automatically extended to all recipients of the covered
    +work and works based on it.
    +
    +  A patent license is "discriminatory" if it does not include within
    +the scope of its coverage, prohibits the exercise of, or is
    +conditioned on the non-exercise of one or more of the rights that are
    +specifically granted under this License.  You may not convey a covered
    +work if you are a party to an arrangement with a third party that is
    +in the business of distributing software, under which you make payment
    +to the third party based on the extent of your activity of conveying
    +the work, and under which the third party grants, to any of the
    +parties who would receive the covered work from you, a discriminatory
    +patent license (a) in connection with copies of the covered work
    +conveyed by you (or copies made from those copies), or (b) primarily
    +for and in connection with specific products or compilations that
    +contain the covered work, unless you entered into that arrangement,
    +or that patent license was granted, prior to 28 March 2007.
    +
    +  Nothing in this License shall be construed as excluding or limiting
    +any implied license or other defenses to infringement that may
    +otherwise be available to you under applicable patent law.
    +
    +  12. No Surrender of Others' Freedom.
    +
    +  If conditions are imposed on you (whether by court order, agreement or
    +otherwise) that contradict the conditions of this License, they do not
    +excuse you from the conditions of this License.  If you cannot convey a
    +covered work so as to satisfy simultaneously your obligations under this
    +License and any other pertinent obligations, then as a consequence you may
    +not convey it at all.  For example, if you agree to terms that obligate you
    +to collect a royalty for further conveying from those to whom you convey
    +the Program, the only way you could satisfy both those terms and this
    +License would be to refrain entirely from conveying the Program.
    +
    +  13. Use with the GNU Affero General Public License.
    +
    +  Notwithstanding any other provision of this License, you have
    +permission to link or combine any covered work with a work licensed
    +under version 3 of the GNU Affero General Public License into a single
    +combined work, and to convey the resulting work.  The terms of this
    +License will continue to apply to the part which is the covered work,
    +but the special requirements of the GNU Affero General Public License,
    +section 13, concerning interaction through a network will apply to the
    +combination as such.
    +
    +  14. Revised Versions of this License.
    +
    +  The Free Software Foundation may publish revised and/or new versions of
    +the GNU General Public License from time to time.  Such new versions will
    +be similar in spirit to the present version, but may differ in detail to
    +address new problems or concerns.
    +
    +  Each version is given a distinguishing version number.  If the
    +Program specifies that a certain numbered version of the GNU General
    +Public License "or any later version" applies to it, you have the
    +option of following the terms and conditions either of that numbered
    +version or of any later version published by the Free Software
    +Foundation.  If the Program does not specify a version number of the
    +GNU General Public License, you may choose any version ever published
    +by the Free Software Foundation.
    +
    +  If the Program specifies that a proxy can decide which future
    +versions of the GNU General Public License can be used, that proxy's
    +public statement of acceptance of a version permanently authorizes you
    +to choose that version for the Program.
    +
    +  Later license versions may give you additional or different
    +permissions.  However, no additional obligations are imposed on any
    +author or copyright holder as a result of your choosing to follow a
    +later version.
    +
    +  15. Disclaimer of Warranty.
    +
    +  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
    +APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
    +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
    +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
    +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    +PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
    +IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
    +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    +
    +  16. Limitation of Liability.
    +
    +  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
    +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
    +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
    +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
    +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
    +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
    +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
    +SUCH DAMAGES.
    +
    +  17. Interpretation of Sections 15 and 16.
    +
    +  If the disclaimer of warranty and limitation of liability provided
    +above cannot be given local legal effect according to their terms,
    +reviewing courts shall apply local law that most closely approximates
    +an absolute waiver of all civil liability in connection with the
    +Program, unless a warranty or assumption of liability accompanies a
    +copy of the Program in return for a fee.
    +
    +                     END OF TERMS AND CONDITIONS
    +
    +            How to Apply These Terms to Your New Programs
    +
    +  If you develop a new program, and you want it to be of the greatest
    +possible use to the public, the best way to achieve this is to make it
    +free software which everyone can redistribute and change under these terms.
    +
    +  To do so, attach the following notices to the program.  It is safest
    +to attach them to the start of each source file to most effectively
    +state the exclusion of warranty; and each file should have at least
    +the "copyright" line and a pointer to where the full notice is found.
    +
    +    <one line to give the program's name and a brief idea of what it does.>
    +    Copyright (C) <year>  <name of author>
    +
    +    This program is free software: you can redistribute it and/or modify
    +    it under the terms of the GNU General Public License as published by
    +    the Free Software Foundation, either version 3 of the License, or
    +    (at your option) any later version.
    +
    +    This program is distributed in the hope that it will be useful,
    +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +    GNU General Public License for more details.
    +
    +    You should have received a copy of the GNU General Public License
    +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    +
    +Also add information on how to contact you by electronic and paper mail.
    +
    +  If the program does terminal interaction, make it output a short
    +notice like this when it starts in an interactive mode:
    +
    +    <program>  Copyright (C) <year>  <name of author>
    +    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +    This is free software, and you are welcome to redistribute it
    +    under certain conditions; type `show c' for details.
    +
    +The hypothetical commands `show w' and `show c' should show the appropriate
    +parts of the General Public License.  Of course, your program's commands
    +might be different; for a GUI interface, you would use an "about box".
    +
    +  You should also get your employer (if you work as a programmer) or school,
    +if any, to sign a "copyright disclaimer" for the program, if necessary.
    +For more information on this, and how to apply and follow the GNU GPL, see
    +<http://www.gnu.org/licenses/>.
    +
    +  The GNU General Public License does not permit incorporating your program
    +into proprietary programs.  If your program is a subroutine library, you
    +may consider it more useful to permit linking proprietary applications with
    +the library.  If this is what you want to do, use the GNU Lesser General
    +Public License instead of this License.  But first, please read
    +<http://www.gnu.org/philosophy/why-not-lgpl.html>.
    +
    \ No newline at end of file diff --git a/readme.txt b/README similarity index 74% rename from readme.txt rename to README index f7eefb29..fe36ce33 100644 --- a/readme.txt +++ b/README @@ -16,12 +16,13 @@ DBG is the debugging part of the debugger. It handles debugging (using TitanEngine) and will provide data for the GUI. GUI is the graphical part of the debugger. It is built on top of Qt and it -provides the user interaction, the dump window (not yet implemented), the -disassembly, the register window, the memory map view, the log view etc. +provides the user interaction, the dump window, the disassembly, +the register window, the memory map view, the log view etc. Bridge is the communication library for the DBG and GUI part (and maybe in the future more parts). The bridge can be used to work on new features, -without having to update the code of the other parts. +without having to update the code of the other parts. It also ensures +low-level code stays (partially separated from the high level GUI code). >Features: - variables (with regard to the upcoming script feature) @@ -34,13 +35,15 @@ without having to update the code of the other parts. - rtr (return from function) - memory allocation/deallocation in the debuggee - quickly accessing API addresses (GetProcAddress->76E13620) -- highlighting (not yet customizable, but really helpful) +- fully customizable GUI colors and instruction highlighting +- IDA-like sidebar with jump arrows +- IDA-like instruction token highlighting (hold 'Z' in disassembly) - memory map - basic module labeling -- import reconstruction (plugin using Scylla) +- import reconstruction (using Scylla) - drag&drop files - goto window -- register/flags view with editing support +- register/flags view with editing support and change highlighting - quite fast working in really big code pages (tested up to 5GB) - GUI hotkeys - dynamic jump arrow (just like OllyDbg) @@ -49,9 +52,9 @@ without having to update the code of the other parts. - plugin support - (manual) function analysis - easily follow calls/jumps/ret (press ENTER when selecting) -- (buggy) dynamic commenting +- (buggy) dynamic commenting (strings) - scripting support (using the debugger commands)! -- simple dump +- simple dump window with various data modes - symbols (+ exports) view with search - simple stack view - programmable reference view @@ -67,6 +70,8 @@ Disassembly powered by BeaEngine (http://beaengine.org/). The icon is taken from VisualPharm (http://www.visualpharm.com/) +Licensed under GLPv3 + >Special thanks: - acidflash - Ahmadmansoor @@ -79,6 +84,7 @@ The icon is taken from VisualPharm (http://www.visualpharm.com/) - Artic - Sorry if I forgot you! ->Lead developers: +>Developers: - Mr. eXoDia -- Sigma \ No newline at end of file +- Sigma +- tr4ceflow \ No newline at end of file From 427153511fe807c76b2f425742e165b0066b4152 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 15 Jun 2014 13:38:36 +0200 Subject: [PATCH 104/676] Revert "PROJECT: updated license + readme" This reverts commit 9c46b98ca2d6783eb508839ecb63138c328083cb. --- LICENSE | 677 ------------------------------------------- README => readme.txt | 26 +- 2 files changed, 10 insertions(+), 693 deletions(-) delete mode 100644 LICENSE rename README => readme.txt (74%) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index de63d14b..00000000 --- a/LICENSE +++ /dev/null @@ -1,677 +0,0 @@ - - -
                        GNU GENERAL PUBLIC LICENSE
    -                       Version 3, 29 June 2007
    -
    - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
    - Everyone is permitted to copy and distribute verbatim copies
    - of this license document, but changing it is not allowed.
    -
    -                            Preamble
    -
    -  The GNU General Public License is a free, copyleft license for
    -software and other kinds of works.
    -
    -  The licenses for most software and other practical works are designed
    -to take away your freedom to share and change the works.  By contrast,
    -the GNU General Public License is intended to guarantee your freedom to
    -share and change all versions of a program--to make sure it remains free
    -software for all its users.  We, the Free Software Foundation, use the
    -GNU General Public License for most of our software; it applies also to
    -any other work released this way by its authors.  You can apply it to
    -your programs, too.
    -
    -  When we speak of free software, we are referring to freedom, not
    -price.  Our General Public Licenses are designed to make sure that you
    -have the freedom to distribute copies of free software (and charge for
    -them if you wish), that you receive source code or can get it if you
    -want it, that you can change the software or use pieces of it in new
    -free programs, and that you know you can do these things.
    -
    -  To protect your rights, we need to prevent others from denying you
    -these rights or asking you to surrender the rights.  Therefore, you have
    -certain responsibilities if you distribute copies of the software, or if
    -you modify it: responsibilities to respect the freedom of others.
    -
    -  For example, if you distribute copies of such a program, whether
    -gratis or for a fee, you must pass on to the recipients the same
    -freedoms that you received.  You must make sure that they, too, receive
    -or can get the source code.  And you must show them these terms so they
    -know their rights.
    -
    -  Developers that use the GNU GPL protect your rights with two steps:
    -(1) assert copyright on the software, and (2) offer you this License
    -giving you legal permission to copy, distribute and/or modify it.
    -
    -  For the developers' and authors' protection, the GPL clearly explains
    -that there is no warranty for this free software.  For both users' and
    -authors' sake, the GPL requires that modified versions be marked as
    -changed, so that their problems will not be attributed erroneously to
    -authors of previous versions.
    -
    -  Some devices are designed to deny users access to install or run
    -modified versions of the software inside them, although the manufacturer
    -can do so.  This is fundamentally incompatible with the aim of
    -protecting users' freedom to change the software.  The systematic
    -pattern of such abuse occurs in the area of products for individuals to
    -use, which is precisely where it is most unacceptable.  Therefore, we
    -have designed this version of the GPL to prohibit the practice for those
    -products.  If such problems arise substantially in other domains, we
    -stand ready to extend this provision to those domains in future versions
    -of the GPL, as needed to protect the freedom of users.
    -
    -  Finally, every program is threatened constantly by software patents.
    -States should not allow patents to restrict development and use of
    -software on general-purpose computers, but in those that do, we wish to
    -avoid the special danger that patents applied to a free program could
    -make it effectively proprietary.  To prevent this, the GPL assures that
    -patents cannot be used to render the program non-free.
    -
    -  The precise terms and conditions for copying, distribution and
    -modification follow.
    -
    -                       TERMS AND CONDITIONS
    -
    -  0. Definitions.
    -
    -  "This License" refers to version 3 of the GNU General Public License.
    -
    -  "Copyright" also means copyright-like laws that apply to other kinds of
    -works, such as semiconductor masks.
    -
    -  "The Program" refers to any copyrightable work licensed under this
    -License.  Each licensee is addressed as "you".  "Licensees" and
    -"recipients" may be individuals or organizations.
    -
    -  To "modify" a work means to copy from or adapt all or part of the work
    -in a fashion requiring copyright permission, other than the making of an
    -exact copy.  The resulting work is called a "modified version" of the
    -earlier work or a work "based on" the earlier work.
    -
    -  A "covered work" means either the unmodified Program or a work based
    -on the Program.
    -
    -  To "propagate" a work means to do anything with it that, without
    -permission, would make you directly or secondarily liable for
    -infringement under applicable copyright law, except executing it on a
    -computer or modifying a private copy.  Propagation includes copying,
    -distribution (with or without modification), making available to the
    -public, and in some countries other activities as well.
    -
    -  To "convey" a work means any kind of propagation that enables other
    -parties to make or receive copies.  Mere interaction with a user through
    -a computer network, with no transfer of a copy, is not conveying.
    -
    -  An interactive user interface displays "Appropriate Legal Notices"
    -to the extent that it includes a convenient and prominently visible
    -feature that (1) displays an appropriate copyright notice, and (2)
    -tells the user that there is no warranty for the work (except to the
    -extent that warranties are provided), that licensees may convey the
    -work under this License, and how to view a copy of this License.  If
    -the interface presents a list of user commands or options, such as a
    -menu, a prominent item in the list meets this criterion.
    -
    -  1. Source Code.
    -
    -  The "source code" for a work means the preferred form of the work
    -for making modifications to it.  "Object code" means any non-source
    -form of a work.
    -
    -  A "Standard Interface" means an interface that either is an official
    -standard defined by a recognized standards body, or, in the case of
    -interfaces specified for a particular programming language, one that
    -is widely used among developers working in that language.
    -
    -  The "System Libraries" of an executable work include anything, other
    -than the work as a whole, that (a) is included in the normal form of
    -packaging a Major Component, but which is not part of that Major
    -Component, and (b) serves only to enable use of the work with that
    -Major Component, or to implement a Standard Interface for which an
    -implementation is available to the public in source code form.  A
    -"Major Component", in this context, means a major essential component
    -(kernel, window system, and so on) of the specific operating system
    -(if any) on which the executable work runs, or a compiler used to
    -produce the work, or an object code interpreter used to run it.
    -
    -  The "Corresponding Source" for a work in object code form means all
    -the source code needed to generate, install, and (for an executable
    -work) run the object code and to modify the work, including scripts to
    -control those activities.  However, it does not include the work's
    -System Libraries, or general-purpose tools or generally available free
    -programs which are used unmodified in performing those activities but
    -which are not part of the work.  For example, Corresponding Source
    -includes interface definition files associated with source files for
    -the work, and the source code for shared libraries and dynamically
    -linked subprograms that the work is specifically designed to require,
    -such as by intimate data communication or control flow between those
    -subprograms and other parts of the work.
    -
    -  The Corresponding Source need not include anything that users
    -can regenerate automatically from other parts of the Corresponding
    -Source.
    -
    -  The Corresponding Source for a work in source code form is that
    -same work.
    -
    -  2. Basic Permissions.
    -
    -  All rights granted under this License are granted for the term of
    -copyright on the Program, and are irrevocable provided the stated
    -conditions are met.  This License explicitly affirms your unlimited
    -permission to run the unmodified Program.  The output from running a
    -covered work is covered by this License only if the output, given its
    -content, constitutes a covered work.  This License acknowledges your
    -rights of fair use or other equivalent, as provided by copyright law.
    -
    -  You may make, run and propagate covered works that you do not
    -convey, without conditions so long as your license otherwise remains
    -in force.  You may convey covered works to others for the sole purpose
    -of having them make modifications exclusively for you, or provide you
    -with facilities for running those works, provided that you comply with
    -the terms of this License in conveying all material for which you do
    -not control copyright.  Those thus making or running the covered works
    -for you must do so exclusively on your behalf, under your direction
    -and control, on terms that prohibit them from making any copies of
    -your copyrighted material outside their relationship with you.
    -
    -  Conveying under any other circumstances is permitted solely under
    -the conditions stated below.  Sublicensing is not allowed; section 10
    -makes it unnecessary.
    -
    -  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
    -
    -  No covered work shall be deemed part of an effective technological
    -measure under any applicable law fulfilling obligations under article
    -11 of the WIPO copyright treaty adopted on 20 December 1996, or
    -similar laws prohibiting or restricting circumvention of such
    -measures.
    -
    -  When you convey a covered work, you waive any legal power to forbid
    -circumvention of technological measures to the extent such circumvention
    -is effected by exercising rights under this License with respect to
    -the covered work, and you disclaim any intention to limit operation or
    -modification of the work as a means of enforcing, against the work's
    -users, your or third parties' legal rights to forbid circumvention of
    -technological measures.
    -
    -  4. Conveying Verbatim Copies.
    -
    -  You may convey verbatim copies of the Program's source code as you
    -receive it, in any medium, provided that you conspicuously and
    -appropriately publish on each copy an appropriate copyright notice;
    -keep intact all notices stating that this License and any
    -non-permissive terms added in accord with section 7 apply to the code;
    -keep intact all notices of the absence of any warranty; and give all
    -recipients a copy of this License along with the Program.
    -
    -  You may charge any price or no price for each copy that you convey,
    -and you may offer support or warranty protection for a fee.
    -
    -  5. Conveying Modified Source Versions.
    -
    -  You may convey a work based on the Program, or the modifications to
    -produce it from the Program, in the form of source code under the
    -terms of section 4, provided that you also meet all of these conditions:
    -
    -    a) The work must carry prominent notices stating that you modified
    -    it, and giving a relevant date.
    -
    -    b) The work must carry prominent notices stating that it is
    -    released under this License and any conditions added under section
    -    7.  This requirement modifies the requirement in section 4 to
    -    "keep intact all notices".
    -
    -    c) You must license the entire work, as a whole, under this
    -    License to anyone who comes into possession of a copy.  This
    -    License will therefore apply, along with any applicable section 7
    -    additional terms, to the whole of the work, and all its parts,
    -    regardless of how they are packaged.  This License gives no
    -    permission to license the work in any other way, but it does not
    -    invalidate such permission if you have separately received it.
    -
    -    d) If the work has interactive user interfaces, each must display
    -    Appropriate Legal Notices; however, if the Program has interactive
    -    interfaces that do not display Appropriate Legal Notices, your
    -    work need not make them do so.
    -
    -  A compilation of a covered work with other separate and independent
    -works, which are not by their nature extensions of the covered work,
    -and which are not combined with it such as to form a larger program,
    -in or on a volume of a storage or distribution medium, is called an
    -"aggregate" if the compilation and its resulting copyright are not
    -used to limit the access or legal rights of the compilation's users
    -beyond what the individual works permit.  Inclusion of a covered work
    -in an aggregate does not cause this License to apply to the other
    -parts of the aggregate.
    -
    -  6. Conveying Non-Source Forms.
    -
    -  You may convey a covered work in object code form under the terms
    -of sections 4 and 5, provided that you also convey the
    -machine-readable Corresponding Source under the terms of this License,
    -in one of these ways:
    -
    -    a) Convey the object code in, or embodied in, a physical product
    -    (including a physical distribution medium), accompanied by the
    -    Corresponding Source fixed on a durable physical medium
    -    customarily used for software interchange.
    -
    -    b) Convey the object code in, or embodied in, a physical product
    -    (including a physical distribution medium), accompanied by a
    -    written offer, valid for at least three years and valid for as
    -    long as you offer spare parts or customer support for that product
    -    model, to give anyone who possesses the object code either (1) a
    -    copy of the Corresponding Source for all the software in the
    -    product that is covered by this License, on a durable physical
    -    medium customarily used for software interchange, for a price no
    -    more than your reasonable cost of physically performing this
    -    conveying of source, or (2) access to copy the
    -    Corresponding Source from a network server at no charge.
    -
    -    c) Convey individual copies of the object code with a copy of the
    -    written offer to provide the Corresponding Source.  This
    -    alternative is allowed only occasionally and noncommercially, and
    -    only if you received the object code with such an offer, in accord
    -    with subsection 6b.
    -
    -    d) Convey the object code by offering access from a designated
    -    place (gratis or for a charge), and offer equivalent access to the
    -    Corresponding Source in the same way through the same place at no
    -    further charge.  You need not require recipients to copy the
    -    Corresponding Source along with the object code.  If the place to
    -    copy the object code is a network server, the Corresponding Source
    -    may be on a different server (operated by you or a third party)
    -    that supports equivalent copying facilities, provided you maintain
    -    clear directions next to the object code saying where to find the
    -    Corresponding Source.  Regardless of what server hosts the
    -    Corresponding Source, you remain obligated to ensure that it is
    -    available for as long as needed to satisfy these requirements.
    -
    -    e) Convey the object code using peer-to-peer transmission, provided
    -    you inform other peers where the object code and Corresponding
    -    Source of the work are being offered to the general public at no
    -    charge under subsection 6d.
    -
    -  A separable portion of the object code, whose source code is excluded
    -from the Corresponding Source as a System Library, need not be
    -included in conveying the object code work.
    -
    -  A "User Product" is either (1) a "consumer product", which means any
    -tangible personal property which is normally used for personal, family,
    -or household purposes, or (2) anything designed or sold for incorporation
    -into a dwelling.  In determining whether a product is a consumer product,
    -doubtful cases shall be resolved in favor of coverage.  For a particular
    -product received by a particular user, "normally used" refers to a
    -typical or common use of that class of product, regardless of the status
    -of the particular user or of the way in which the particular user
    -actually uses, or expects or is expected to use, the product.  A product
    -is a consumer product regardless of whether the product has substantial
    -commercial, industrial or non-consumer uses, unless such uses represent
    -the only significant mode of use of the product.
    -
    -  "Installation Information" for a User Product means any methods,
    -procedures, authorization keys, or other information required to install
    -and execute modified versions of a covered work in that User Product from
    -a modified version of its Corresponding Source.  The information must
    -suffice to ensure that the continued functioning of the modified object
    -code is in no case prevented or interfered with solely because
    -modification has been made.
    -
    -  If you convey an object code work under this section in, or with, or
    -specifically for use in, a User Product, and the conveying occurs as
    -part of a transaction in which the right of possession and use of the
    -User Product is transferred to the recipient in perpetuity or for a
    -fixed term (regardless of how the transaction is characterized), the
    -Corresponding Source conveyed under this section must be accompanied
    -by the Installation Information.  But this requirement does not apply
    -if neither you nor any third party retains the ability to install
    -modified object code on the User Product (for example, the work has
    -been installed in ROM).
    -
    -  The requirement to provide Installation Information does not include a
    -requirement to continue to provide support service, warranty, or updates
    -for a work that has been modified or installed by the recipient, or for
    -the User Product in which it has been modified or installed.  Access to a
    -network may be denied when the modification itself materially and
    -adversely affects the operation of the network or violates the rules and
    -protocols for communication across the network.
    -
    -  Corresponding Source conveyed, and Installation Information provided,
    -in accord with this section must be in a format that is publicly
    -documented (and with an implementation available to the public in
    -source code form), and must require no special password or key for
    -unpacking, reading or copying.
    -
    -  7. Additional Terms.
    -
    -  "Additional permissions" are terms that supplement the terms of this
    -License by making exceptions from one or more of its conditions.
    -Additional permissions that are applicable to the entire Program shall
    -be treated as though they were included in this License, to the extent
    -that they are valid under applicable law.  If additional permissions
    -apply only to part of the Program, that part may be used separately
    -under those permissions, but the entire Program remains governed by
    -this License without regard to the additional permissions.
    -
    -  When you convey a copy of a covered work, you may at your option
    -remove any additional permissions from that copy, or from any part of
    -it.  (Additional permissions may be written to require their own
    -removal in certain cases when you modify the work.)  You may place
    -additional permissions on material, added by you to a covered work,
    -for which you have or can give appropriate copyright permission.
    -
    -  Notwithstanding any other provision of this License, for material you
    -add to a covered work, you may (if authorized by the copyright holders of
    -that material) supplement the terms of this License with terms:
    -
    -    a) Disclaiming warranty or limiting liability differently from the
    -    terms of sections 15 and 16 of this License; or
    -
    -    b) Requiring preservation of specified reasonable legal notices or
    -    author attributions in that material or in the Appropriate Legal
    -    Notices displayed by works containing it; or
    -
    -    c) Prohibiting misrepresentation of the origin of that material, or
    -    requiring that modified versions of such material be marked in
    -    reasonable ways as different from the original version; or
    -
    -    d) Limiting the use for publicity purposes of names of licensors or
    -    authors of the material; or
    -
    -    e) Declining to grant rights under trademark law for use of some
    -    trade names, trademarks, or service marks; or
    -
    -    f) Requiring indemnification of licensors and authors of that
    -    material by anyone who conveys the material (or modified versions of
    -    it) with contractual assumptions of liability to the recipient, for
    -    any liability that these contractual assumptions directly impose on
    -    those licensors and authors.
    -
    -  All other non-permissive additional terms are considered "further
    -restrictions" within the meaning of section 10.  If the Program as you
    -received it, or any part of it, contains a notice stating that it is
    -governed by this License along with a term that is a further
    -restriction, you may remove that term.  If a license document contains
    -a further restriction but permits relicensing or conveying under this
    -License, you may add to a covered work material governed by the terms
    -of that license document, provided that the further restriction does
    -not survive such relicensing or conveying.
    -
    -  If you add terms to a covered work in accord with this section, you
    -must place, in the relevant source files, a statement of the
    -additional terms that apply to those files, or a notice indicating
    -where to find the applicable terms.
    -
    -  Additional terms, permissive or non-permissive, may be stated in the
    -form of a separately written license, or stated as exceptions;
    -the above requirements apply either way.
    -
    -  8. Termination.
    -
    -  You may not propagate or modify a covered work except as expressly
    -provided under this License.  Any attempt otherwise to propagate or
    -modify it is void, and will automatically terminate your rights under
    -this License (including any patent licenses granted under the third
    -paragraph of section 11).
    -
    -  However, if you cease all violation of this License, then your
    -license from a particular copyright holder is reinstated (a)
    -provisionally, unless and until the copyright holder explicitly and
    -finally terminates your license, and (b) permanently, if the copyright
    -holder fails to notify you of the violation by some reasonable means
    -prior to 60 days after the cessation.
    -
    -  Moreover, your license from a particular copyright holder is
    -reinstated permanently if the copyright holder notifies you of the
    -violation by some reasonable means, this is the first time you have
    -received notice of violation of this License (for any work) from that
    -copyright holder, and you cure the violation prior to 30 days after
    -your receipt of the notice.
    -
    -  Termination of your rights under this section does not terminate the
    -licenses of parties who have received copies or rights from you under
    -this License.  If your rights have been terminated and not permanently
    -reinstated, you do not qualify to receive new licenses for the same
    -material under section 10.
    -
    -  9. Acceptance Not Required for Having Copies.
    -
    -  You are not required to accept this License in order to receive or
    -run a copy of the Program.  Ancillary propagation of a covered work
    -occurring solely as a consequence of using peer-to-peer transmission
    -to receive a copy likewise does not require acceptance.  However,
    -nothing other than this License grants you permission to propagate or
    -modify any covered work.  These actions infringe copyright if you do
    -not accept this License.  Therefore, by modifying or propagating a
    -covered work, you indicate your acceptance of this License to do so.
    -
    -  10. Automatic Licensing of Downstream Recipients.
    -
    -  Each time you convey a covered work, the recipient automatically
    -receives a license from the original licensors, to run, modify and
    -propagate that work, subject to this License.  You are not responsible
    -for enforcing compliance by third parties with this License.
    -
    -  An "entity transaction" is a transaction transferring control of an
    -organization, or substantially all assets of one, or subdividing an
    -organization, or merging organizations.  If propagation of a covered
    -work results from an entity transaction, each party to that
    -transaction who receives a copy of the work also receives whatever
    -licenses to the work the party's predecessor in interest had or could
    -give under the previous paragraph, plus a right to possession of the
    -Corresponding Source of the work from the predecessor in interest, if
    -the predecessor has it or can get it with reasonable efforts.
    -
    -  You may not impose any further restrictions on the exercise of the
    -rights granted or affirmed under this License.  For example, you may
    -not impose a license fee, royalty, or other charge for exercise of
    -rights granted under this License, and you may not initiate litigation
    -(including a cross-claim or counterclaim in a lawsuit) alleging that
    -any patent claim is infringed by making, using, selling, offering for
    -sale, or importing the Program or any portion of it.
    -
    -  11. Patents.
    -
    -  A "contributor" is a copyright holder who authorizes use under this
    -License of the Program or a work on which the Program is based.  The
    -work thus licensed is called the contributor's "contributor version".
    -
    -  A contributor's "essential patent claims" are all patent claims
    -owned or controlled by the contributor, whether already acquired or
    -hereafter acquired, that would be infringed by some manner, permitted
    -by this License, of making, using, or selling its contributor version,
    -but do not include claims that would be infringed only as a
    -consequence of further modification of the contributor version.  For
    -purposes of this definition, "control" includes the right to grant
    -patent sublicenses in a manner consistent with the requirements of
    -this License.
    -
    -  Each contributor grants you a non-exclusive, worldwide, royalty-free
    -patent license under the contributor's essential patent claims, to
    -make, use, sell, offer for sale, import and otherwise run, modify and
    -propagate the contents of its contributor version.
    -
    -  In the following three paragraphs, a "patent license" is any express
    -agreement or commitment, however denominated, not to enforce a patent
    -(such as an express permission to practice a patent or covenant not to
    -sue for patent infringement).  To "grant" such a patent license to a
    -party means to make such an agreement or commitment not to enforce a
    -patent against the party.
    -
    -  If you convey a covered work, knowingly relying on a patent license,
    -and the Corresponding Source of the work is not available for anyone
    -to copy, free of charge and under the terms of this License, through a
    -publicly available network server or other readily accessible means,
    -then you must either (1) cause the Corresponding Source to be so
    -available, or (2) arrange to deprive yourself of the benefit of the
    -patent license for this particular work, or (3) arrange, in a manner
    -consistent with the requirements of this License, to extend the patent
    -license to downstream recipients.  "Knowingly relying" means you have
    -actual knowledge that, but for the patent license, your conveying the
    -covered work in a country, or your recipient's use of the covered work
    -in a country, would infringe one or more identifiable patents in that
    -country that you have reason to believe are valid.
    -
    -  If, pursuant to or in connection with a single transaction or
    -arrangement, you convey, or propagate by procuring conveyance of, a
    -covered work, and grant a patent license to some of the parties
    -receiving the covered work authorizing them to use, propagate, modify
    -or convey a specific copy of the covered work, then the patent license
    -you grant is automatically extended to all recipients of the covered
    -work and works based on it.
    -
    -  A patent license is "discriminatory" if it does not include within
    -the scope of its coverage, prohibits the exercise of, or is
    -conditioned on the non-exercise of one or more of the rights that are
    -specifically granted under this License.  You may not convey a covered
    -work if you are a party to an arrangement with a third party that is
    -in the business of distributing software, under which you make payment
    -to the third party based on the extent of your activity of conveying
    -the work, and under which the third party grants, to any of the
    -parties who would receive the covered work from you, a discriminatory
    -patent license (a) in connection with copies of the covered work
    -conveyed by you (or copies made from those copies), or (b) primarily
    -for and in connection with specific products or compilations that
    -contain the covered work, unless you entered into that arrangement,
    -or that patent license was granted, prior to 28 March 2007.
    -
    -  Nothing in this License shall be construed as excluding or limiting
    -any implied license or other defenses to infringement that may
    -otherwise be available to you under applicable patent law.
    -
    -  12. No Surrender of Others' Freedom.
    -
    -  If conditions are imposed on you (whether by court order, agreement or
    -otherwise) that contradict the conditions of this License, they do not
    -excuse you from the conditions of this License.  If you cannot convey a
    -covered work so as to satisfy simultaneously your obligations under this
    -License and any other pertinent obligations, then as a consequence you may
    -not convey it at all.  For example, if you agree to terms that obligate you
    -to collect a royalty for further conveying from those to whom you convey
    -the Program, the only way you could satisfy both those terms and this
    -License would be to refrain entirely from conveying the Program.
    -
    -  13. Use with the GNU Affero General Public License.
    -
    -  Notwithstanding any other provision of this License, you have
    -permission to link or combine any covered work with a work licensed
    -under version 3 of the GNU Affero General Public License into a single
    -combined work, and to convey the resulting work.  The terms of this
    -License will continue to apply to the part which is the covered work,
    -but the special requirements of the GNU Affero General Public License,
    -section 13, concerning interaction through a network will apply to the
    -combination as such.
    -
    -  14. Revised Versions of this License.
    -
    -  The Free Software Foundation may publish revised and/or new versions of
    -the GNU General Public License from time to time.  Such new versions will
    -be similar in spirit to the present version, but may differ in detail to
    -address new problems or concerns.
    -
    -  Each version is given a distinguishing version number.  If the
    -Program specifies that a certain numbered version of the GNU General
    -Public License "or any later version" applies to it, you have the
    -option of following the terms and conditions either of that numbered
    -version or of any later version published by the Free Software
    -Foundation.  If the Program does not specify a version number of the
    -GNU General Public License, you may choose any version ever published
    -by the Free Software Foundation.
    -
    -  If the Program specifies that a proxy can decide which future
    -versions of the GNU General Public License can be used, that proxy's
    -public statement of acceptance of a version permanently authorizes you
    -to choose that version for the Program.
    -
    -  Later license versions may give you additional or different
    -permissions.  However, no additional obligations are imposed on any
    -author or copyright holder as a result of your choosing to follow a
    -later version.
    -
    -  15. Disclaimer of Warranty.
    -
    -  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
    -APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
    -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
    -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
    -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    -PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
    -IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
    -ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    -
    -  16. Limitation of Liability.
    -
    -  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
    -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
    -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
    -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
    -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
    -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
    -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
    -SUCH DAMAGES.
    -
    -  17. Interpretation of Sections 15 and 16.
    -
    -  If the disclaimer of warranty and limitation of liability provided
    -above cannot be given local legal effect according to their terms,
    -reviewing courts shall apply local law that most closely approximates
    -an absolute waiver of all civil liability in connection with the
    -Program, unless a warranty or assumption of liability accompanies a
    -copy of the Program in return for a fee.
    -
    -                     END OF TERMS AND CONDITIONS
    -
    -            How to Apply These Terms to Your New Programs
    -
    -  If you develop a new program, and you want it to be of the greatest
    -possible use to the public, the best way to achieve this is to make it
    -free software which everyone can redistribute and change under these terms.
    -
    -  To do so, attach the following notices to the program.  It is safest
    -to attach them to the start of each source file to most effectively
    -state the exclusion of warranty; and each file should have at least
    -the "copyright" line and a pointer to where the full notice is found.
    -
    -    <one line to give the program's name and a brief idea of what it does.>
    -    Copyright (C) <year>  <name of author>
    -
    -    This program is free software: you can redistribute it and/or modify
    -    it under the terms of the GNU General Public License as published by
    -    the Free Software Foundation, either version 3 of the License, or
    -    (at your option) any later version.
    -
    -    This program is distributed in the hope that it will be useful,
    -    but WITHOUT ANY WARRANTY; without even the implied warranty of
    -    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -    GNU General Public License for more details.
    -
    -    You should have received a copy of the GNU General Public License
    -    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    -
    -Also add information on how to contact you by electronic and paper mail.
    -
    -  If the program does terminal interaction, make it output a short
    -notice like this when it starts in an interactive mode:
    -
    -    <program>  Copyright (C) <year>  <name of author>
    -    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    -    This is free software, and you are welcome to redistribute it
    -    under certain conditions; type `show c' for details.
    -
    -The hypothetical commands `show w' and `show c' should show the appropriate
    -parts of the General Public License.  Of course, your program's commands
    -might be different; for a GUI interface, you would use an "about box".
    -
    -  You should also get your employer (if you work as a programmer) or school,
    -if any, to sign a "copyright disclaimer" for the program, if necessary.
    -For more information on this, and how to apply and follow the GNU GPL, see
    -<http://www.gnu.org/licenses/>.
    -
    -  The GNU General Public License does not permit incorporating your program
    -into proprietary programs.  If your program is a subroutine library, you
    -may consider it more useful to permit linking proprietary applications with
    -the library.  If this is what you want to do, use the GNU Lesser General
    -Public License instead of this License.  But first, please read
    -<http://www.gnu.org/philosophy/why-not-lgpl.html>.
    -
    \ No newline at end of file diff --git a/README b/readme.txt similarity index 74% rename from README rename to readme.txt index fe36ce33..f7eefb29 100644 --- a/README +++ b/readme.txt @@ -16,13 +16,12 @@ DBG is the debugging part of the debugger. It handles debugging (using TitanEngine) and will provide data for the GUI. GUI is the graphical part of the debugger. It is built on top of Qt and it -provides the user interaction, the dump window, the disassembly, -the register window, the memory map view, the log view etc. +provides the user interaction, the dump window (not yet implemented), the +disassembly, the register window, the memory map view, the log view etc. Bridge is the communication library for the DBG and GUI part (and maybe in the future more parts). The bridge can be used to work on new features, -without having to update the code of the other parts. It also ensures -low-level code stays (partially separated from the high level GUI code). +without having to update the code of the other parts. >Features: - variables (with regard to the upcoming script feature) @@ -35,15 +34,13 @@ low-level code stays (partially separated from the high level GUI code). - rtr (return from function) - memory allocation/deallocation in the debuggee - quickly accessing API addresses (GetProcAddress->76E13620) -- fully customizable GUI colors and instruction highlighting -- IDA-like sidebar with jump arrows -- IDA-like instruction token highlighting (hold 'Z' in disassembly) +- highlighting (not yet customizable, but really helpful) - memory map - basic module labeling -- import reconstruction (using Scylla) +- import reconstruction (plugin using Scylla) - drag&drop files - goto window -- register/flags view with editing support and change highlighting +- register/flags view with editing support - quite fast working in really big code pages (tested up to 5GB) - GUI hotkeys - dynamic jump arrow (just like OllyDbg) @@ -52,9 +49,9 @@ low-level code stays (partially separated from the high level GUI code). - plugin support - (manual) function analysis - easily follow calls/jumps/ret (press ENTER when selecting) -- (buggy) dynamic commenting (strings) +- (buggy) dynamic commenting - scripting support (using the debugger commands)! -- simple dump window with various data modes +- simple dump - symbols (+ exports) view with search - simple stack view - programmable reference view @@ -70,8 +67,6 @@ Disassembly powered by BeaEngine (http://beaengine.org/). The icon is taken from VisualPharm (http://www.visualpharm.com/) -Licensed under GLPv3 - >Special thanks: - acidflash - Ahmadmansoor @@ -84,7 +79,6 @@ Licensed under GLPv3 - Artic - Sorry if I forgot you! ->Developers: +>Lead developers: - Mr. eXoDia -- Sigma -- tr4ceflow \ No newline at end of file +- Sigma \ No newline at end of file From c4224efdcf4d8c438702060e5ed09e0a478acca9 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 15 Jun 2014 13:39:07 +0200 Subject: [PATCH 105/676] PROJECT: updated license + readme --- LICENSE | 677 +++++++++++++++++++++++++++++++++++++++++++ readme.txt => README | 26 +- 2 files changed, 693 insertions(+), 10 deletions(-) create mode 100644 LICENSE rename readme.txt => README (74%) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..de63d14b --- /dev/null +++ b/LICENSE @@ -0,0 +1,677 @@ + + +
                        GNU GENERAL PUBLIC LICENSE
    +                       Version 3, 29 June 2007
    +
    + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
    + Everyone is permitted to copy and distribute verbatim copies
    + of this license document, but changing it is not allowed.
    +
    +                            Preamble
    +
    +  The GNU General Public License is a free, copyleft license for
    +software and other kinds of works.
    +
    +  The licenses for most software and other practical works are designed
    +to take away your freedom to share and change the works.  By contrast,
    +the GNU General Public License is intended to guarantee your freedom to
    +share and change all versions of a program--to make sure it remains free
    +software for all its users.  We, the Free Software Foundation, use the
    +GNU General Public License for most of our software; it applies also to
    +any other work released this way by its authors.  You can apply it to
    +your programs, too.
    +
    +  When we speak of free software, we are referring to freedom, not
    +price.  Our General Public Licenses are designed to make sure that you
    +have the freedom to distribute copies of free software (and charge for
    +them if you wish), that you receive source code or can get it if you
    +want it, that you can change the software or use pieces of it in new
    +free programs, and that you know you can do these things.
    +
    +  To protect your rights, we need to prevent others from denying you
    +these rights or asking you to surrender the rights.  Therefore, you have
    +certain responsibilities if you distribute copies of the software, or if
    +you modify it: responsibilities to respect the freedom of others.
    +
    +  For example, if you distribute copies of such a program, whether
    +gratis or for a fee, you must pass on to the recipients the same
    +freedoms that you received.  You must make sure that they, too, receive
    +or can get the source code.  And you must show them these terms so they
    +know their rights.
    +
    +  Developers that use the GNU GPL protect your rights with two steps:
    +(1) assert copyright on the software, and (2) offer you this License
    +giving you legal permission to copy, distribute and/or modify it.
    +
    +  For the developers' and authors' protection, the GPL clearly explains
    +that there is no warranty for this free software.  For both users' and
    +authors' sake, the GPL requires that modified versions be marked as
    +changed, so that their problems will not be attributed erroneously to
    +authors of previous versions.
    +
    +  Some devices are designed to deny users access to install or run
    +modified versions of the software inside them, although the manufacturer
    +can do so.  This is fundamentally incompatible with the aim of
    +protecting users' freedom to change the software.  The systematic
    +pattern of such abuse occurs in the area of products for individuals to
    +use, which is precisely where it is most unacceptable.  Therefore, we
    +have designed this version of the GPL to prohibit the practice for those
    +products.  If such problems arise substantially in other domains, we
    +stand ready to extend this provision to those domains in future versions
    +of the GPL, as needed to protect the freedom of users.
    +
    +  Finally, every program is threatened constantly by software patents.
    +States should not allow patents to restrict development and use of
    +software on general-purpose computers, but in those that do, we wish to
    +avoid the special danger that patents applied to a free program could
    +make it effectively proprietary.  To prevent this, the GPL assures that
    +patents cannot be used to render the program non-free.
    +
    +  The precise terms and conditions for copying, distribution and
    +modification follow.
    +
    +                       TERMS AND CONDITIONS
    +
    +  0. Definitions.
    +
    +  "This License" refers to version 3 of the GNU General Public License.
    +
    +  "Copyright" also means copyright-like laws that apply to other kinds of
    +works, such as semiconductor masks.
    +
    +  "The Program" refers to any copyrightable work licensed under this
    +License.  Each licensee is addressed as "you".  "Licensees" and
    +"recipients" may be individuals or organizations.
    +
    +  To "modify" a work means to copy from or adapt all or part of the work
    +in a fashion requiring copyright permission, other than the making of an
    +exact copy.  The resulting work is called a "modified version" of the
    +earlier work or a work "based on" the earlier work.
    +
    +  A "covered work" means either the unmodified Program or a work based
    +on the Program.
    +
    +  To "propagate" a work means to do anything with it that, without
    +permission, would make you directly or secondarily liable for
    +infringement under applicable copyright law, except executing it on a
    +computer or modifying a private copy.  Propagation includes copying,
    +distribution (with or without modification), making available to the
    +public, and in some countries other activities as well.
    +
    +  To "convey" a work means any kind of propagation that enables other
    +parties to make or receive copies.  Mere interaction with a user through
    +a computer network, with no transfer of a copy, is not conveying.
    +
    +  An interactive user interface displays "Appropriate Legal Notices"
    +to the extent that it includes a convenient and prominently visible
    +feature that (1) displays an appropriate copyright notice, and (2)
    +tells the user that there is no warranty for the work (except to the
    +extent that warranties are provided), that licensees may convey the
    +work under this License, and how to view a copy of this License.  If
    +the interface presents a list of user commands or options, such as a
    +menu, a prominent item in the list meets this criterion.
    +
    +  1. Source Code.
    +
    +  The "source code" for a work means the preferred form of the work
    +for making modifications to it.  "Object code" means any non-source
    +form of a work.
    +
    +  A "Standard Interface" means an interface that either is an official
    +standard defined by a recognized standards body, or, in the case of
    +interfaces specified for a particular programming language, one that
    +is widely used among developers working in that language.
    +
    +  The "System Libraries" of an executable work include anything, other
    +than the work as a whole, that (a) is included in the normal form of
    +packaging a Major Component, but which is not part of that Major
    +Component, and (b) serves only to enable use of the work with that
    +Major Component, or to implement a Standard Interface for which an
    +implementation is available to the public in source code form.  A
    +"Major Component", in this context, means a major essential component
    +(kernel, window system, and so on) of the specific operating system
    +(if any) on which the executable work runs, or a compiler used to
    +produce the work, or an object code interpreter used to run it.
    +
    +  The "Corresponding Source" for a work in object code form means all
    +the source code needed to generate, install, and (for an executable
    +work) run the object code and to modify the work, including scripts to
    +control those activities.  However, it does not include the work's
    +System Libraries, or general-purpose tools or generally available free
    +programs which are used unmodified in performing those activities but
    +which are not part of the work.  For example, Corresponding Source
    +includes interface definition files associated with source files for
    +the work, and the source code for shared libraries and dynamically
    +linked subprograms that the work is specifically designed to require,
    +such as by intimate data communication or control flow between those
    +subprograms and other parts of the work.
    +
    +  The Corresponding Source need not include anything that users
    +can regenerate automatically from other parts of the Corresponding
    +Source.
    +
    +  The Corresponding Source for a work in source code form is that
    +same work.
    +
    +  2. Basic Permissions.
    +
    +  All rights granted under this License are granted for the term of
    +copyright on the Program, and are irrevocable provided the stated
    +conditions are met.  This License explicitly affirms your unlimited
    +permission to run the unmodified Program.  The output from running a
    +covered work is covered by this License only if the output, given its
    +content, constitutes a covered work.  This License acknowledges your
    +rights of fair use or other equivalent, as provided by copyright law.
    +
    +  You may make, run and propagate covered works that you do not
    +convey, without conditions so long as your license otherwise remains
    +in force.  You may convey covered works to others for the sole purpose
    +of having them make modifications exclusively for you, or provide you
    +with facilities for running those works, provided that you comply with
    +the terms of this License in conveying all material for which you do
    +not control copyright.  Those thus making or running the covered works
    +for you must do so exclusively on your behalf, under your direction
    +and control, on terms that prohibit them from making any copies of
    +your copyrighted material outside their relationship with you.
    +
    +  Conveying under any other circumstances is permitted solely under
    +the conditions stated below.  Sublicensing is not allowed; section 10
    +makes it unnecessary.
    +
    +  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
    +
    +  No covered work shall be deemed part of an effective technological
    +measure under any applicable law fulfilling obligations under article
    +11 of the WIPO copyright treaty adopted on 20 December 1996, or
    +similar laws prohibiting or restricting circumvention of such
    +measures.
    +
    +  When you convey a covered work, you waive any legal power to forbid
    +circumvention of technological measures to the extent such circumvention
    +is effected by exercising rights under this License with respect to
    +the covered work, and you disclaim any intention to limit operation or
    +modification of the work as a means of enforcing, against the work's
    +users, your or third parties' legal rights to forbid circumvention of
    +technological measures.
    +
    +  4. Conveying Verbatim Copies.
    +
    +  You may convey verbatim copies of the Program's source code as you
    +receive it, in any medium, provided that you conspicuously and
    +appropriately publish on each copy an appropriate copyright notice;
    +keep intact all notices stating that this License and any
    +non-permissive terms added in accord with section 7 apply to the code;
    +keep intact all notices of the absence of any warranty; and give all
    +recipients a copy of this License along with the Program.
    +
    +  You may charge any price or no price for each copy that you convey,
    +and you may offer support or warranty protection for a fee.
    +
    +  5. Conveying Modified Source Versions.
    +
    +  You may convey a work based on the Program, or the modifications to
    +produce it from the Program, in the form of source code under the
    +terms of section 4, provided that you also meet all of these conditions:
    +
    +    a) The work must carry prominent notices stating that you modified
    +    it, and giving a relevant date.
    +
    +    b) The work must carry prominent notices stating that it is
    +    released under this License and any conditions added under section
    +    7.  This requirement modifies the requirement in section 4 to
    +    "keep intact all notices".
    +
    +    c) You must license the entire work, as a whole, under this
    +    License to anyone who comes into possession of a copy.  This
    +    License will therefore apply, along with any applicable section 7
    +    additional terms, to the whole of the work, and all its parts,
    +    regardless of how they are packaged.  This License gives no
    +    permission to license the work in any other way, but it does not
    +    invalidate such permission if you have separately received it.
    +
    +    d) If the work has interactive user interfaces, each must display
    +    Appropriate Legal Notices; however, if the Program has interactive
    +    interfaces that do not display Appropriate Legal Notices, your
    +    work need not make them do so.
    +
    +  A compilation of a covered work with other separate and independent
    +works, which are not by their nature extensions of the covered work,
    +and which are not combined with it such as to form a larger program,
    +in or on a volume of a storage or distribution medium, is called an
    +"aggregate" if the compilation and its resulting copyright are not
    +used to limit the access or legal rights of the compilation's users
    +beyond what the individual works permit.  Inclusion of a covered work
    +in an aggregate does not cause this License to apply to the other
    +parts of the aggregate.
    +
    +  6. Conveying Non-Source Forms.
    +
    +  You may convey a covered work in object code form under the terms
    +of sections 4 and 5, provided that you also convey the
    +machine-readable Corresponding Source under the terms of this License,
    +in one of these ways:
    +
    +    a) Convey the object code in, or embodied in, a physical product
    +    (including a physical distribution medium), accompanied by the
    +    Corresponding Source fixed on a durable physical medium
    +    customarily used for software interchange.
    +
    +    b) Convey the object code in, or embodied in, a physical product
    +    (including a physical distribution medium), accompanied by a
    +    written offer, valid for at least three years and valid for as
    +    long as you offer spare parts or customer support for that product
    +    model, to give anyone who possesses the object code either (1) a
    +    copy of the Corresponding Source for all the software in the
    +    product that is covered by this License, on a durable physical
    +    medium customarily used for software interchange, for a price no
    +    more than your reasonable cost of physically performing this
    +    conveying of source, or (2) access to copy the
    +    Corresponding Source from a network server at no charge.
    +
    +    c) Convey individual copies of the object code with a copy of the
    +    written offer to provide the Corresponding Source.  This
    +    alternative is allowed only occasionally and noncommercially, and
    +    only if you received the object code with such an offer, in accord
    +    with subsection 6b.
    +
    +    d) Convey the object code by offering access from a designated
    +    place (gratis or for a charge), and offer equivalent access to the
    +    Corresponding Source in the same way through the same place at no
    +    further charge.  You need not require recipients to copy the
    +    Corresponding Source along with the object code.  If the place to
    +    copy the object code is a network server, the Corresponding Source
    +    may be on a different server (operated by you or a third party)
    +    that supports equivalent copying facilities, provided you maintain
    +    clear directions next to the object code saying where to find the
    +    Corresponding Source.  Regardless of what server hosts the
    +    Corresponding Source, you remain obligated to ensure that it is
    +    available for as long as needed to satisfy these requirements.
    +
    +    e) Convey the object code using peer-to-peer transmission, provided
    +    you inform other peers where the object code and Corresponding
    +    Source of the work are being offered to the general public at no
    +    charge under subsection 6d.
    +
    +  A separable portion of the object code, whose source code is excluded
    +from the Corresponding Source as a System Library, need not be
    +included in conveying the object code work.
    +
    +  A "User Product" is either (1) a "consumer product", which means any
    +tangible personal property which is normally used for personal, family,
    +or household purposes, or (2) anything designed or sold for incorporation
    +into a dwelling.  In determining whether a product is a consumer product,
    +doubtful cases shall be resolved in favor of coverage.  For a particular
    +product received by a particular user, "normally used" refers to a
    +typical or common use of that class of product, regardless of the status
    +of the particular user or of the way in which the particular user
    +actually uses, or expects or is expected to use, the product.  A product
    +is a consumer product regardless of whether the product has substantial
    +commercial, industrial or non-consumer uses, unless such uses represent
    +the only significant mode of use of the product.
    +
    +  "Installation Information" for a User Product means any methods,
    +procedures, authorization keys, or other information required to install
    +and execute modified versions of a covered work in that User Product from
    +a modified version of its Corresponding Source.  The information must
    +suffice to ensure that the continued functioning of the modified object
    +code is in no case prevented or interfered with solely because
    +modification has been made.
    +
    +  If you convey an object code work under this section in, or with, or
    +specifically for use in, a User Product, and the conveying occurs as
    +part of a transaction in which the right of possession and use of the
    +User Product is transferred to the recipient in perpetuity or for a
    +fixed term (regardless of how the transaction is characterized), the
    +Corresponding Source conveyed under this section must be accompanied
    +by the Installation Information.  But this requirement does not apply
    +if neither you nor any third party retains the ability to install
    +modified object code on the User Product (for example, the work has
    +been installed in ROM).
    +
    +  The requirement to provide Installation Information does not include a
    +requirement to continue to provide support service, warranty, or updates
    +for a work that has been modified or installed by the recipient, or for
    +the User Product in which it has been modified or installed.  Access to a
    +network may be denied when the modification itself materially and
    +adversely affects the operation of the network or violates the rules and
    +protocols for communication across the network.
    +
    +  Corresponding Source conveyed, and Installation Information provided,
    +in accord with this section must be in a format that is publicly
    +documented (and with an implementation available to the public in
    +source code form), and must require no special password or key for
    +unpacking, reading or copying.
    +
    +  7. Additional Terms.
    +
    +  "Additional permissions" are terms that supplement the terms of this
    +License by making exceptions from one or more of its conditions.
    +Additional permissions that are applicable to the entire Program shall
    +be treated as though they were included in this License, to the extent
    +that they are valid under applicable law.  If additional permissions
    +apply only to part of the Program, that part may be used separately
    +under those permissions, but the entire Program remains governed by
    +this License without regard to the additional permissions.
    +
    +  When you convey a copy of a covered work, you may at your option
    +remove any additional permissions from that copy, or from any part of
    +it.  (Additional permissions may be written to require their own
    +removal in certain cases when you modify the work.)  You may place
    +additional permissions on material, added by you to a covered work,
    +for which you have or can give appropriate copyright permission.
    +
    +  Notwithstanding any other provision of this License, for material you
    +add to a covered work, you may (if authorized by the copyright holders of
    +that material) supplement the terms of this License with terms:
    +
    +    a) Disclaiming warranty or limiting liability differently from the
    +    terms of sections 15 and 16 of this License; or
    +
    +    b) Requiring preservation of specified reasonable legal notices or
    +    author attributions in that material or in the Appropriate Legal
    +    Notices displayed by works containing it; or
    +
    +    c) Prohibiting misrepresentation of the origin of that material, or
    +    requiring that modified versions of such material be marked in
    +    reasonable ways as different from the original version; or
    +
    +    d) Limiting the use for publicity purposes of names of licensors or
    +    authors of the material; or
    +
    +    e) Declining to grant rights under trademark law for use of some
    +    trade names, trademarks, or service marks; or
    +
    +    f) Requiring indemnification of licensors and authors of that
    +    material by anyone who conveys the material (or modified versions of
    +    it) with contractual assumptions of liability to the recipient, for
    +    any liability that these contractual assumptions directly impose on
    +    those licensors and authors.
    +
    +  All other non-permissive additional terms are considered "further
    +restrictions" within the meaning of section 10.  If the Program as you
    +received it, or any part of it, contains a notice stating that it is
    +governed by this License along with a term that is a further
    +restriction, you may remove that term.  If a license document contains
    +a further restriction but permits relicensing or conveying under this
    +License, you may add to a covered work material governed by the terms
    +of that license document, provided that the further restriction does
    +not survive such relicensing or conveying.
    +
    +  If you add terms to a covered work in accord with this section, you
    +must place, in the relevant source files, a statement of the
    +additional terms that apply to those files, or a notice indicating
    +where to find the applicable terms.
    +
    +  Additional terms, permissive or non-permissive, may be stated in the
    +form of a separately written license, or stated as exceptions;
    +the above requirements apply either way.
    +
    +  8. Termination.
    +
    +  You may not propagate or modify a covered work except as expressly
    +provided under this License.  Any attempt otherwise to propagate or
    +modify it is void, and will automatically terminate your rights under
    +this License (including any patent licenses granted under the third
    +paragraph of section 11).
    +
    +  However, if you cease all violation of this License, then your
    +license from a particular copyright holder is reinstated (a)
    +provisionally, unless and until the copyright holder explicitly and
    +finally terminates your license, and (b) permanently, if the copyright
    +holder fails to notify you of the violation by some reasonable means
    +prior to 60 days after the cessation.
    +
    +  Moreover, your license from a particular copyright holder is
    +reinstated permanently if the copyright holder notifies you of the
    +violation by some reasonable means, this is the first time you have
    +received notice of violation of this License (for any work) from that
    +copyright holder, and you cure the violation prior to 30 days after
    +your receipt of the notice.
    +
    +  Termination of your rights under this section does not terminate the
    +licenses of parties who have received copies or rights from you under
    +this License.  If your rights have been terminated and not permanently
    +reinstated, you do not qualify to receive new licenses for the same
    +material under section 10.
    +
    +  9. Acceptance Not Required for Having Copies.
    +
    +  You are not required to accept this License in order to receive or
    +run a copy of the Program.  Ancillary propagation of a covered work
    +occurring solely as a consequence of using peer-to-peer transmission
    +to receive a copy likewise does not require acceptance.  However,
    +nothing other than this License grants you permission to propagate or
    +modify any covered work.  These actions infringe copyright if you do
    +not accept this License.  Therefore, by modifying or propagating a
    +covered work, you indicate your acceptance of this License to do so.
    +
    +  10. Automatic Licensing of Downstream Recipients.
    +
    +  Each time you convey a covered work, the recipient automatically
    +receives a license from the original licensors, to run, modify and
    +propagate that work, subject to this License.  You are not responsible
    +for enforcing compliance by third parties with this License.
    +
    +  An "entity transaction" is a transaction transferring control of an
    +organization, or substantially all assets of one, or subdividing an
    +organization, or merging organizations.  If propagation of a covered
    +work results from an entity transaction, each party to that
    +transaction who receives a copy of the work also receives whatever
    +licenses to the work the party's predecessor in interest had or could
    +give under the previous paragraph, plus a right to possession of the
    +Corresponding Source of the work from the predecessor in interest, if
    +the predecessor has it or can get it with reasonable efforts.
    +
    +  You may not impose any further restrictions on the exercise of the
    +rights granted or affirmed under this License.  For example, you may
    +not impose a license fee, royalty, or other charge for exercise of
    +rights granted under this License, and you may not initiate litigation
    +(including a cross-claim or counterclaim in a lawsuit) alleging that
    +any patent claim is infringed by making, using, selling, offering for
    +sale, or importing the Program or any portion of it.
    +
    +  11. Patents.
    +
    +  A "contributor" is a copyright holder who authorizes use under this
    +License of the Program or a work on which the Program is based.  The
    +work thus licensed is called the contributor's "contributor version".
    +
    +  A contributor's "essential patent claims" are all patent claims
    +owned or controlled by the contributor, whether already acquired or
    +hereafter acquired, that would be infringed by some manner, permitted
    +by this License, of making, using, or selling its contributor version,
    +but do not include claims that would be infringed only as a
    +consequence of further modification of the contributor version.  For
    +purposes of this definition, "control" includes the right to grant
    +patent sublicenses in a manner consistent with the requirements of
    +this License.
    +
    +  Each contributor grants you a non-exclusive, worldwide, royalty-free
    +patent license under the contributor's essential patent claims, to
    +make, use, sell, offer for sale, import and otherwise run, modify and
    +propagate the contents of its contributor version.
    +
    +  In the following three paragraphs, a "patent license" is any express
    +agreement or commitment, however denominated, not to enforce a patent
    +(such as an express permission to practice a patent or covenant not to
    +sue for patent infringement).  To "grant" such a patent license to a
    +party means to make such an agreement or commitment not to enforce a
    +patent against the party.
    +
    +  If you convey a covered work, knowingly relying on a patent license,
    +and the Corresponding Source of the work is not available for anyone
    +to copy, free of charge and under the terms of this License, through a
    +publicly available network server or other readily accessible means,
    +then you must either (1) cause the Corresponding Source to be so
    +available, or (2) arrange to deprive yourself of the benefit of the
    +patent license for this particular work, or (3) arrange, in a manner
    +consistent with the requirements of this License, to extend the patent
    +license to downstream recipients.  "Knowingly relying" means you have
    +actual knowledge that, but for the patent license, your conveying the
    +covered work in a country, or your recipient's use of the covered work
    +in a country, would infringe one or more identifiable patents in that
    +country that you have reason to believe are valid.
    +
    +  If, pursuant to or in connection with a single transaction or
    +arrangement, you convey, or propagate by procuring conveyance of, a
    +covered work, and grant a patent license to some of the parties
    +receiving the covered work authorizing them to use, propagate, modify
    +or convey a specific copy of the covered work, then the patent license
    +you grant is automatically extended to all recipients of the covered
    +work and works based on it.
    +
    +  A patent license is "discriminatory" if it does not include within
    +the scope of its coverage, prohibits the exercise of, or is
    +conditioned on the non-exercise of one or more of the rights that are
    +specifically granted under this License.  You may not convey a covered
    +work if you are a party to an arrangement with a third party that is
    +in the business of distributing software, under which you make payment
    +to the third party based on the extent of your activity of conveying
    +the work, and under which the third party grants, to any of the
    +parties who would receive the covered work from you, a discriminatory
    +patent license (a) in connection with copies of the covered work
    +conveyed by you (or copies made from those copies), or (b) primarily
    +for and in connection with specific products or compilations that
    +contain the covered work, unless you entered into that arrangement,
    +or that patent license was granted, prior to 28 March 2007.
    +
    +  Nothing in this License shall be construed as excluding or limiting
    +any implied license or other defenses to infringement that may
    +otherwise be available to you under applicable patent law.
    +
    +  12. No Surrender of Others' Freedom.
    +
    +  If conditions are imposed on you (whether by court order, agreement or
    +otherwise) that contradict the conditions of this License, they do not
    +excuse you from the conditions of this License.  If you cannot convey a
    +covered work so as to satisfy simultaneously your obligations under this
    +License and any other pertinent obligations, then as a consequence you may
    +not convey it at all.  For example, if you agree to terms that obligate you
    +to collect a royalty for further conveying from those to whom you convey
    +the Program, the only way you could satisfy both those terms and this
    +License would be to refrain entirely from conveying the Program.
    +
    +  13. Use with the GNU Affero General Public License.
    +
    +  Notwithstanding any other provision of this License, you have
    +permission to link or combine any covered work with a work licensed
    +under version 3 of the GNU Affero General Public License into a single
    +combined work, and to convey the resulting work.  The terms of this
    +License will continue to apply to the part which is the covered work,
    +but the special requirements of the GNU Affero General Public License,
    +section 13, concerning interaction through a network will apply to the
    +combination as such.
    +
    +  14. Revised Versions of this License.
    +
    +  The Free Software Foundation may publish revised and/or new versions of
    +the GNU General Public License from time to time.  Such new versions will
    +be similar in spirit to the present version, but may differ in detail to
    +address new problems or concerns.
    +
    +  Each version is given a distinguishing version number.  If the
    +Program specifies that a certain numbered version of the GNU General
    +Public License "or any later version" applies to it, you have the
    +option of following the terms and conditions either of that numbered
    +version or of any later version published by the Free Software
    +Foundation.  If the Program does not specify a version number of the
    +GNU General Public License, you may choose any version ever published
    +by the Free Software Foundation.
    +
    +  If the Program specifies that a proxy can decide which future
    +versions of the GNU General Public License can be used, that proxy's
    +public statement of acceptance of a version permanently authorizes you
    +to choose that version for the Program.
    +
    +  Later license versions may give you additional or different
    +permissions.  However, no additional obligations are imposed on any
    +author or copyright holder as a result of your choosing to follow a
    +later version.
    +
    +  15. Disclaimer of Warranty.
    +
    +  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
    +APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
    +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
    +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
    +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    +PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
    +IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
    +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    +
    +  16. Limitation of Liability.
    +
    +  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
    +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
    +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
    +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
    +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
    +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
    +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
    +SUCH DAMAGES.
    +
    +  17. Interpretation of Sections 15 and 16.
    +
    +  If the disclaimer of warranty and limitation of liability provided
    +above cannot be given local legal effect according to their terms,
    +reviewing courts shall apply local law that most closely approximates
    +an absolute waiver of all civil liability in connection with the
    +Program, unless a warranty or assumption of liability accompanies a
    +copy of the Program in return for a fee.
    +
    +                     END OF TERMS AND CONDITIONS
    +
    +            How to Apply These Terms to Your New Programs
    +
    +  If you develop a new program, and you want it to be of the greatest
    +possible use to the public, the best way to achieve this is to make it
    +free software which everyone can redistribute and change under these terms.
    +
    +  To do so, attach the following notices to the program.  It is safest
    +to attach them to the start of each source file to most effectively
    +state the exclusion of warranty; and each file should have at least
    +the "copyright" line and a pointer to where the full notice is found.
    +
    +    <one line to give the program's name and a brief idea of what it does.>
    +    Copyright (C) <year>  <name of author>
    +
    +    This program is free software: you can redistribute it and/or modify
    +    it under the terms of the GNU General Public License as published by
    +    the Free Software Foundation, either version 3 of the License, or
    +    (at your option) any later version.
    +
    +    This program is distributed in the hope that it will be useful,
    +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +    GNU General Public License for more details.
    +
    +    You should have received a copy of the GNU General Public License
    +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    +
    +Also add information on how to contact you by electronic and paper mail.
    +
    +  If the program does terminal interaction, make it output a short
    +notice like this when it starts in an interactive mode:
    +
    +    <program>  Copyright (C) <year>  <name of author>
    +    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    +    This is free software, and you are welcome to redistribute it
    +    under certain conditions; type `show c' for details.
    +
    +The hypothetical commands `show w' and `show c' should show the appropriate
    +parts of the General Public License.  Of course, your program's commands
    +might be different; for a GUI interface, you would use an "about box".
    +
    +  You should also get your employer (if you work as a programmer) or school,
    +if any, to sign a "copyright disclaimer" for the program, if necessary.
    +For more information on this, and how to apply and follow the GNU GPL, see
    +<http://www.gnu.org/licenses/>.
    +
    +  The GNU General Public License does not permit incorporating your program
    +into proprietary programs.  If your program is a subroutine library, you
    +may consider it more useful to permit linking proprietary applications with
    +the library.  If this is what you want to do, use the GNU Lesser General
    +Public License instead of this License.  But first, please read
    +<http://www.gnu.org/philosophy/why-not-lgpl.html>.
    +
    \ No newline at end of file diff --git a/readme.txt b/README similarity index 74% rename from readme.txt rename to README index f7eefb29..fe36ce33 100644 --- a/readme.txt +++ b/README @@ -16,12 +16,13 @@ DBG is the debugging part of the debugger. It handles debugging (using TitanEngine) and will provide data for the GUI. GUI is the graphical part of the debugger. It is built on top of Qt and it -provides the user interaction, the dump window (not yet implemented), the -disassembly, the register window, the memory map view, the log view etc. +provides the user interaction, the dump window, the disassembly, +the register window, the memory map view, the log view etc. Bridge is the communication library for the DBG and GUI part (and maybe in the future more parts). The bridge can be used to work on new features, -without having to update the code of the other parts. +without having to update the code of the other parts. It also ensures +low-level code stays (partially separated from the high level GUI code). >Features: - variables (with regard to the upcoming script feature) @@ -34,13 +35,15 @@ without having to update the code of the other parts. - rtr (return from function) - memory allocation/deallocation in the debuggee - quickly accessing API addresses (GetProcAddress->76E13620) -- highlighting (not yet customizable, but really helpful) +- fully customizable GUI colors and instruction highlighting +- IDA-like sidebar with jump arrows +- IDA-like instruction token highlighting (hold 'Z' in disassembly) - memory map - basic module labeling -- import reconstruction (plugin using Scylla) +- import reconstruction (using Scylla) - drag&drop files - goto window -- register/flags view with editing support +- register/flags view with editing support and change highlighting - quite fast working in really big code pages (tested up to 5GB) - GUI hotkeys - dynamic jump arrow (just like OllyDbg) @@ -49,9 +52,9 @@ without having to update the code of the other parts. - plugin support - (manual) function analysis - easily follow calls/jumps/ret (press ENTER when selecting) -- (buggy) dynamic commenting +- (buggy) dynamic commenting (strings) - scripting support (using the debugger commands)! -- simple dump +- simple dump window with various data modes - symbols (+ exports) view with search - simple stack view - programmable reference view @@ -67,6 +70,8 @@ Disassembly powered by BeaEngine (http://beaengine.org/). The icon is taken from VisualPharm (http://www.visualpharm.com/) +Licensed under GLPv3 + >Special thanks: - acidflash - Ahmadmansoor @@ -79,6 +84,7 @@ The icon is taken from VisualPharm (http://www.visualpharm.com/) - Artic - Sorry if I forgot you! ->Lead developers: +>Developers: - Mr. eXoDia -- Sigma \ No newline at end of file +- Sigma +- tr4ceflow \ No newline at end of file From 42b5e38f4b5f84974eb64a0ffd074c81dcd6557a Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Sun, 15 Jun 2014 21:45:15 +0200 Subject: [PATCH 106/676] DBG: some modifications --- x64_dbg_dbg/_global.h | 1 + x64_dbg_dbg/addrinfo.cpp | 11 +++++++++++ x64_dbg_dbg/addrinfo.h | 1 - x64_dbg_dbg/breakpoint.h | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index 24912c3c..43456574 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "..\x64_dbg_bridge\bridgemain.h" #include "sqlite\sqlite3.h" diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 3f524053..97d8cc19 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -60,8 +60,19 @@ bool dbsave() return sqlloadsavedb(userdb, dbpath, true); } +void readcache() +{ + +} + +void writecache() +{ + +} + void dbclose() { + writecache(); //write db structures to sqlite database //NOTE: remove breakpoints without module if(!sqlexec(userdb, "DELETE FROM breakpoints WHERE mod IS NULL")) dprintf("SQL Error: %s\n", sqllasterror()); diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 4d1e5375..29fce57a 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -2,7 +2,6 @@ #define _ADDRINFO_H #include "_global.h" -#include //superglobal variables extern sqlite3* userdb; diff --git a/x64_dbg_dbg/breakpoint.h b/x64_dbg_dbg/breakpoint.h index 95ec0503..641c0bca 100644 --- a/x64_dbg_dbg/breakpoint.h +++ b/x64_dbg_dbg/breakpoint.h @@ -28,6 +28,7 @@ struct BREAKPOINT //typedefs typedef bool (*BPENUMCALLBACK)(const BREAKPOINT* bp); +typedef std::map BreakpointsMap; //functions int bpgetlist(BREAKPOINT** list); From 176947afb0de4c164b14108ffc2bda5344a8be8c Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 14:01:44 +0200 Subject: [PATCH 107/676] GUI: toggle highlighting mode in CPUDisassembly --- .../Project/Src/BasicView/Disassembly.cpp | 16 --------------- .../Project/Src/BasicView/Disassembly.h | 3 +-- .../Project/Src/Gui/CPUDisassembly.cpp | 20 +++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 2 ++ 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 16d4e9c0..5c14fd68 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -37,8 +37,6 @@ Disassembly::Disassembly(QWidget *parent) : AbstractTableView(parent) backgroundColor=ConfigColor("DisassemblyBackgroundColor"); - connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); - connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(reloadData())); } @@ -608,24 +606,10 @@ void Disassembly::keyPressEvent(QKeyEvent* event) QString cmd="disasm "+QString("%1").arg(dest, sizeof(int_t)*2, 16, QChar('0')).toUpper(); DbgCmdExec(cmd.toUtf8().constData()); } - else if(!event->isAutoRepeat() && key == Qt::Key_Z) - { - mHighlightingMode=true; - reloadData(); - } else AbstractTableView::keyPressEvent(event); } -void Disassembly::keyReleaseEvent(QKeyEvent* event) -{ - if(!event->isAutoRepeat() && event->key() == Qt::Key_Z) - { - mHighlightingMode=false; - reloadData(); - } -} - /************************************************************************************ ScrollBar Management ***********************************************************************************/ diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h index e885c0e4..90d7e103 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.h +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.h @@ -27,7 +27,6 @@ public: // Keyboard Management void keyPressEvent(QKeyEvent* event); - void keyReleaseEvent(QKeyEvent* event); // ScrollBar Management int_t sliderMovedHook(int type, int_t value, int_t delta); @@ -136,12 +135,12 @@ private: int mCurrentVa; int mCharWidth; BeaTokenizer::BeaSingleToken mHighlightToken; - bool mHighlightingMode; protected: bool mRvaDisplayEnabled; uint_t mRvaDisplayBase; int_t mRvaDisplayPageBase; + bool mHighlightingMode; }; #endif // DISASSEMBLY_H diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index e9172a78..a38d20b1 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -5,6 +5,8 @@ CPUDisassembly::CPUDisassembly(QWidget *parent) : Disassembly(parent) // Create the action list for the right click context menu setupRightClickContextMenu(); + connect(Bridge::getBridge(), SIGNAL(disassembleAt(int_t, int_t)), this, SLOT(disassembleAt(int_t, int_t))); + connect(Bridge::getBridge(), SIGNAL(dbgStateChanged(DBGSTATE)), this, SLOT(debugStateChangedSlot(DBGSTATE))); connect(Bridge::getBridge(), SIGNAL(selectionDisasmGet(SELECTIONDATA*)), this, SLOT(selectionGet(SELECTIONDATA*))); connect(Bridge::getBridge(), SIGNAL(selectionDisasmSet(const SELECTIONDATA*)), this, SLOT(selectionSet(const SELECTIONDATA*))); @@ -201,6 +203,9 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) mReferencesMenu->addAction(mReferenceSelectedAddress); wMenu->addMenu(mReferencesMenu); + wMenu->addSeparator(); + wMenu->addAction(mToggleHighlightingMode); + QAction* wAction = wMenu->exec(event->globalPos()); } } @@ -348,6 +353,12 @@ void CPUDisassembly::setupRightClickContextMenu() // String References mSearchStrings = new QAction("&String references", this); connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings())); + + // Highlighting mode + mToggleHighlightingMode = new QAction("Toggle &highlighting mode", this); + mToggleHighlightingMode->setShortcutContext(Qt::WidgetShortcut); + mToggleHighlightingMode->setShortcut(QKeySequence("ctrl+h")); + connect(mToggleHighlightingMode, SIGNAL(triggered()), this, SLOT(toggleHighlightingMode())); } void CPUDisassembly::gotoOrigin() @@ -715,3 +726,12 @@ void CPUDisassembly::selectionSet(const SELECTIONDATA* selection) reloadData(); Bridge::getBridge()->BridgeSetResult(1); } + +void CPUDisassembly::toggleHighlightingMode() +{ + if(mHighlightingMode) + mHighlightingMode=false; + else + mHighlightingMode=true; + reloadData(); +} diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 2315195a..119d0f0e 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -56,6 +56,7 @@ public slots: void findStrings(); void selectionGet(SELECTIONDATA* selection); void selectionSet(const SELECTIONDATA* selection); + void toggleHighlightingMode(); private: @@ -87,6 +88,7 @@ private: QAction* mReferenceSelectedAddress; QAction* mSearchConstant; QAction* mSearchStrings; + QAction* mToggleHighlightingMode; GotoDialog* mGoto; }; From f6d04a90a825509caf972c26e5cc6652a9cec088 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 19:45:59 +0200 Subject: [PATCH 108/676] DBG: removed sqlite --- bin/x32/sqlite.dll | Bin 493568 -> 0 bytes bin/x64/sqlite.dll | Bin 763392 -> 0 bytes x64_dbg_dbg/_exports.cpp | 2 +- x64_dbg_dbg/_global.h | 1 - x64_dbg_dbg/addrinfo.cpp | 466 +- x64_dbg_dbg/addrinfo.h | 12 +- x64_dbg_dbg/breakpoint.cpp | 315 +- x64_dbg_dbg/breakpoint.h | 6 +- x64_dbg_dbg/debugger.cpp | 60 +- x64_dbg_dbg/sqlhelper.cpp | 183 - x64_dbg_dbg/sqlhelper.h | 15 - x64_dbg_dbg/sqlite/libsqlite32.a | Bin 131400 -> 0 bytes x64_dbg_dbg/sqlite/libsqlite64.a | Bin 132208 -> 0 bytes x64_dbg_dbg/sqlite/sqlite.def | 207 - x64_dbg_dbg/sqlite/sqlite3.h | 7315 ----------------------- x64_dbg_dbg/sqlite/sqlite32.lib | Bin 48100 -> 0 bytes x64_dbg_dbg/sqlite/sqlite64.lib | Bin 47100 -> 0 bytes x64_dbg_dbg/x64_dbg_dbg.vcxproj | 7 +- x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 12 - 19 files changed, 147 insertions(+), 8454 deletions(-) delete mode 100644 bin/x32/sqlite.dll delete mode 100644 bin/x64/sqlite.dll delete mode 100644 x64_dbg_dbg/sqlhelper.cpp delete mode 100644 x64_dbg_dbg/sqlhelper.h delete mode 100644 x64_dbg_dbg/sqlite/libsqlite32.a delete mode 100644 x64_dbg_dbg/sqlite/libsqlite64.a delete mode 100644 x64_dbg_dbg/sqlite/sqlite.def delete mode 100644 x64_dbg_dbg/sqlite/sqlite3.h delete mode 100644 x64_dbg_dbg/sqlite/sqlite32.lib delete mode 100644 x64_dbg_dbg/sqlite/sqlite64.lib diff --git a/bin/x32/sqlite.dll b/bin/x32/sqlite.dll deleted file mode 100644 index 6f4c5022fedd9ff820e54d8ccafc93f9ab9c2d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493568 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 z
    vF;Z0o%aqq97v_jeNrq5N%1L9L= z>7ekYPMsm2R}2L%lb`+ZPRjP|m7~>}#F{-)Fj<{pOT}^EZPsh;0?4(A-{#U8JbCo|Vsy|w z^kJu09N7XJt!p0@d|;myr@M=%AbpYSbYJqmYt9`>HWe5L+W_UGncsCndF6WAtZFxh zTLa}7c`v@wvq@neW1SRd#m}J|(X}ohdHl!iV2nV8{-lCv^z1QSz4qQ0xSvJ-T+xPu9v;b(t)7%_hO_a?NtDxs9vc&m+Hp)9GH9OBVCs(f^8+>@e$mq*(WQ z&5cDoI0A9SmwGnHvFc^=%0W$tfb}QIoH#csij42z6<7ta9M1MIACsRqtn#eF8?xpf zGBMJ*f%9qbL*XqeTVtLL6n2$`yGI0nYiVuDZ_zgxmwT*;s`6~+V7%9C(lv^{z;}sy zRX9IuzAXxU?{HwCK6y?|u~tfvs9F4lx&zNxs>^k7z}@D<8)c|88HiXbWoXoyr=Q}3 zc-0NlsCYm{56#IFY_sa5pwfPbT3Ns#a0f*vI2|4Q#eR_w4!V?B^>|qOkrA(~TQKCsP)o zztU%qcN7RJUq!#b?pFYaL`mqoR>`Z6X&nfwVk_<;j(>=*ruz+(9S*)6tglqseib{u zi9oS(+czs)`oDutN5zhUirqDZRrzvRj?@VsvP;GRp`q1YwjU@d6-n8v#DRKf$!J&b#{v&5A(VnA6$^^s9# zfC&t=rW4+5Qn<@iwbBYd%<#;9u`)S=xe`|Rq-)W#FQlq)b⪼MODXp$96&AZ?S&g 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�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

    7(EArY6rgFVBj)&+%r1XkyNa`n4Re{f{@V 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ݣ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�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 diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index 9d7ca5a1..a4033ea4 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -558,7 +558,7 @@ extern "C" DLL_EXPORT int _dbg_getbplist(BPXTYPE type, BPMAP* bpmap) { if(!bpmap) return 0; - BREAKPOINT* list; + std::vector list; int bpcount=bpgetlist(&list); if(bpcount==0) { diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index 43456574..732b9553 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -18,7 +18,6 @@ #include #include #include "..\x64_dbg_bridge\bridgemain.h" -#include "sqlite\sqlite3.h" #ifdef __GNUC__ #include "dbghelp\dbghelp.h" diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 97d8cc19..bda06362 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -2,12 +2,10 @@ #include "debugger.h" #include "console.h" #include "memory.h" -#include "sqlhelper.h" #include "breakpoint.h" #include "threading.h" #include "symbolinfo.h" -sqlite3* userdb; static ModulesInfo modinfo; static CommentsInfo comments; static LabelsInfo labels; @@ -18,73 +16,33 @@ static LoopsInfo loops; ///basic database functions void dbinit() { - //initialize user database - lock(WAITID_USERDB); - if(sqlite3_open(":memory:", &userdb)) - { - unlock(WAITID_USERDB); - dputs("failed to open database!"); - return; - } - unlock(WAITID_USERDB); - sqlloadsavedb(userdb, dbpath, false); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)")) - dprintf("SQL Error: %s\n", sqllasterror()); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS comments (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL, text TEXT NOT NULL)")) - dprintf("SQL Error: %s\n", sqllasterror()); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS bookmarks (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, addr INT64 NOT NULL)")) - dprintf("SQL Error: %s\n", sqllasterror()); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS breakpoints (id INTEGER PRIMARY KEY AUTOINCREMENT, addr INT64 NOT NULL, enabled INT NOT NULL, singleshoot INT NOT NULL, oldbytes INT NOT NULL, type INT NOT NULL, titantype INT NOT NULL, mod TEXT, name TEXT)")) - dprintf("SQL Error: %s\n", sqllasterror()); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS functions (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, start INT64 NOT NULL, end INT64 NOT NULL, manual BOOL NOT NULL)")) - dprintf("SQL Error: %s\n", sqllasterror()); - if(!sqlexec(userdb, "CREATE TABLE IF NOT EXISTS loops (id INTEGER PRIMARY KEY AUTOINCREMENT, mod TEXT, start INT64 NOT NULL, end INT64 NOT NULL, parent INT, depth INT NOT NULL, manual BOOL NOT NULL)")) - dprintf("SQL Error: %s\n", sqllasterror()); - bpenumall(0); //update breakpoint list - GuiUpdateBreakpointsView(); + dbreadcache(); } bool dbload() { - if(!FileExists(dbpath)) - { - dbinit(); - return true; - } - return sqlloadsavedb(userdb, dbpath, false); + return true; } bool dbsave() { CreateDirectoryA(sqlitedb_basedir, 0); //create database directory - return sqlloadsavedb(userdb, dbpath, true); + return true; } -void readcache() +void dbreadcache() { } -void writecache() +void dbwritecache() { } void dbclose() { - writecache(); //write db structures to sqlite database - //NOTE: remove breakpoints without module - if(!sqlexec(userdb, "DELETE FROM breakpoints WHERE mod IS NULL")) - dprintf("SQL Error: %s\n", sqllasterror()); - //NOTE: remove singleshoot breakpoints (mostly temporary breakpoints) - if(!sqlexec(userdb, "DELETE FROM breakpoints WHERE singleshoot=1 AND type=0")) - dprintf("SQL Error: %s\n", sqllasterror()); - dbsave(); - wait(WAITID_USERDB); //wait for the SQLite operation to complete before closing - lock(WAITID_USERDB); - sqlite3_db_release_memory(userdb); - sqlite3_close(userdb); //close user database - unlock(WAITID_USERDB); + dbwritecache(); } ///module functions @@ -279,7 +237,7 @@ bool commentset(uint addr, const char* text) if(!*text) //NOTE: delete when there is no text return commentdel(addr); COMMENTSINFO info; - sqlstringescape(text, info.text); + strcpy(info.text, text); modnamefromaddr(addr, info.mod, true); info.addr=addr-modbasefromaddr(addr); if(comments.count(addr)) //contains addr @@ -287,40 +245,6 @@ bool commentset(uint addr, const char* text) else comments.insert(std::make_pair(addr, info)); return true; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1) - return false; - if(!*text) //NOTE: delete when there is no text - return commentdel(addr); - char commenttext[MAX_COMMENT_SIZE]=""; - sqlstringescape(text, commenttext); - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //comments without module - { - sprintf(sql, "SELECT text FROM comments WHERE mod IS NULL AND addr=%"fext"d", addr); - if(sqlhasresult(userdb, sql)) //there is a comment already - sprintf(sql, "UPDATE comments SET text='%s' WHERE mod IS NULL AND addr=%"fext"d", commenttext, addr); - else //insert - sprintf(sql, "INSERT INTO comments (addr,text) VALUES (%"fext"d,'%s')", addr, commenttext); - } - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT text FROM comments WHERE mod='%s' AND addr=%"fext"d", modname, rva); - if(sqlhasresult(userdb, sql)) //there is a comment already - sprintf(sql, "UPDATE comments SET text='%s' WHERE mod='%s' AND addr=%"fext"d", commenttext, modname, rva); - else //insert - sprintf(sql, "INSERT INTO comments (mod,addr,text) VALUES ('%s',%"fext"d,'%s')", modname, rva, commenttext); - } - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } bool commentget(uint addr, char* text) @@ -333,17 +257,6 @@ bool commentget(uint addr, char* text) return true; } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //comments without module - sprintf(sql, "SELECT text FROM comments WHERE mod IS NULL AND addr=%"fext"d", addr); - else - sprintf(sql, "SELECT text FROM comments WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr)); - return sqlgettext(userdb, sql, text); - */ } bool commentdel(uint addr) @@ -356,30 +269,6 @@ bool commentdel(uint addr) return true; } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //comments without module - sprintf(sql, "SELECT id FROM comments WHERE mod IS NULL AND addr=%"fext"d", addr); - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT id FROM comments WHERE mod='%s' AND addr=%"fext"d", modname, rva); - } - int del_id=0; - if(!sqlgetint(userdb, sql, &del_id)) - return false; - sprintf(sql, "DELETE FROM comments WHERE id=%d", del_id); - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } ///label functions @@ -390,7 +279,7 @@ bool labelset(uint addr, const char* text) if(!*text) //NOTE: delete when there is no text return labeldel(addr); LABELSINFO label; - sqlstringescape(text, label.text); + strcpy(label.text, text); modnamefromaddr(addr, label.mod, true); label.addr=addr-modbasefromaddr(addr); if(labels.count(addr)) //contains @@ -398,43 +287,15 @@ bool labelset(uint addr, const char* text) else labels.insert(std::make_pair(addr, label)); return true; - /* - if(!modnamefromaddr(addr, modname, true)) //labels without module - { - sprintf(sql, "SELECT text FROM labels WHERE mod IS NULL AND addr=%"fext"d", addr); - if(sqlhasresult(userdb, sql)) //there is a label already - sprintf(sql, "UPDATE labels SET text='%s' WHERE mod IS NULL AND addr=%"fext"d", labeltext, addr); - else //insert - sprintf(sql, "INSERT INTO labels (addr,text) VALUES (%"fext"d,'%s')", addr, labeltext); - } - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT text FROM labels WHERE mod='%s' AND addr=%"fext"d", modname, rva); - if(sqlhasresult(userdb, sql)) //there is a label already - sprintf(sql, "UPDATE labels SET text='%s' WHERE mod='%s' AND addr=%"fext"d", labeltext, modname, rva); - else //insert - sprintf(sql, "INSERT INTO labels (mod,addr,text) VALUES ('%s',%"fext"d,'%s')", modname, rva, labeltext); - } - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } bool labelfromstring(const char* text, uint* addr) { if(!DbgIsDebugging()) return false; - char labeltext[MAX_LABEL_SIZE]=""; - sqlstringescape(text, labeltext); for(LabelsInfo::iterator i=labels.begin(); i!=labels.end(); ++i) { - if(!strcmp(i->second.text, labeltext)) + if(!strcmp(i->second.text, text)) { if(addr) *addr=i->first; @@ -442,45 +303,6 @@ bool labelfromstring(const char* text, uint* addr) } } return false; - /* - if(!text or !strlen(text) or !addr) - return 0; - char labeltext[MAX_LABEL_SIZE]=""; - sqlstringescape(text, labeltext); - char sql[deflen]=""; - sprintf(sql, "SELECT addr,mod FROM labels WHERE text='%s'", labeltext); - sqlite3_stmt* stmt; - lock(WAITID_USERDB); - if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } -#ifdef _WIN64 - *addr=sqlite3_column_int64(stmt, 0); //addr -#else - *addr=sqlite3_column_int(stmt, 0); //addr -#endif // _WIN64 - const char* modname=(const char*)sqlite3_column_text(stmt, 1); //mod - if(!modname) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; - } - //TODO: fix this - *addr+=modbasefromname(modname); - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; - */ } bool labelget(uint addr, char* text) @@ -493,17 +315,6 @@ bool labelget(uint addr, char* text) return true; } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or !text) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //labels without module - sprintf(sql, "SELECT text FROM labels WHERE mod IS NULL AND addr=%"fext"d", addr); - else - sprintf(sql, "SELECT text FROM labels WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr)); - return sqlgettext(userdb, sql, text); - */ } bool labeldel(uint addr) @@ -516,30 +327,6 @@ bool labeldel(uint addr) return true; } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //labels without module - sprintf(sql, "SELECT id FROM labels WHERE mod IS NULL AND addr=%"fext"d", addr); - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT id FROM labels WHERE mod='%s' AND addr=%"fext"d", modname, rva); - } - int del_id=0; - if(!sqlgetint(userdb, sql, &del_id)) - return false; - sprintf(sql, "DELETE FROM labels WHERE id=%d", del_id); - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } ///bookmark functions @@ -552,34 +339,6 @@ bool bookmarkset(uint addr) bookmark.addr=addr-modbasefromaddr(addr); bookmarks.insert(std::make_pair(addr, bookmark)); return true; - /* - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //bookmarks without module - { - sprintf(sql, "SELECT * FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr); - if(sqlhasresult(userdb, sql)) //there is a bookmark already - return true; - else //insert - sprintf(sql, "INSERT INTO bookmarks (addr) VALUES (%"fext"d)", addr); - } - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT * FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, rva); - if(sqlhasresult(userdb, sql)) //there is a bookmark already - return true; - else //insert - sprintf(sql, "INSERT INTO bookmarks (mod,addr) VALUES ('%s',%"fext"d)", modname, rva); - } - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } bool bookmarkget(uint addr) @@ -589,17 +348,6 @@ bool bookmarkget(uint addr) if(bookmarks.count(addr)) return true; return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //bookmarks without module - sprintf(sql, "SELECT * FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr); - else - sprintf(sql, "SELECT * FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, addr-modbasefromaddr(addr)); - return sqlhasresult(userdb, sql); - */ } bool bookmarkdel(uint addr) @@ -612,30 +360,6 @@ bool bookmarkdel(uint addr) return true; } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //bookmarks without module - sprintf(sql, "SELECT id FROM bookmarks WHERE mod IS NULL AND addr=%"fext"d", addr); - else - { - uint modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT id FROM bookmarks WHERE mod='%s' AND addr=%"fext"d", modname, rva); - } - int del_id=0; - if(!sqlgetint(userdb, sql, &del_id)) - return false; - sprintf(sql, "DELETE FROM bookmarks WHERE id=%d", del_id); - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } ///function database @@ -656,49 +380,6 @@ bool functionget(uint addr, uint* start, uint* end) } } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - uint modbase=0; - if(!modnamefromaddr(addr, modname, true)) - sprintf(sql, "SELECT start,end FROM functions WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d", addr, addr); - else - { - modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT start,end FROM functions WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d", modname, rva, rva); - } - sqlite3_stmt* stmt; - lock(WAITID_USERDB); - if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } -#ifdef _WIN64 - uint dbstart=sqlite3_column_int64(stmt, 0)+modbase; //start - uint dbend=sqlite3_column_int64(stmt, 1)+modbase; //end -#else - uint dbstart=sqlite3_column_int(stmt, 0)+modbase; //addr - uint dbend=sqlite3_column_int(stmt, 1)+modbase; //end -#endif // _WIN64 - sqlite3_finalize(stmt); - if(start) - *start=dbstart; - if(end) - *end=dbend; - unlock(WAITID_USERDB); - return true; - */ } bool functionoverlaps(uint start, uint end) @@ -713,21 +394,6 @@ bool functionoverlaps(uint start, uint end) return true; } return false; - /* - char sql[deflen]=""; - char modname[MAX_MODULE_SIZE]=""; - //check for function overlaps - if(!modnamefromaddr(start, modname, true)) - sprintf(sql, "SELECT manual FROM functions WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d", end, start); - else - { - uint modbase=modbasefromaddr(start); - sprintf(sql, "SELECT manual FROM functions WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d", modname, end-modbase, start-modbase); - } - if(sqlhasresult(userdb, sql)) //functions overlap - return true; - return false; - */ } bool functionadd(uint start, uint end, bool manual) @@ -744,31 +410,6 @@ bool functionadd(uint start, uint end, bool manual) function.manual=manual; functions.push_back(function); return true; - /* - char sql[deflen]=""; - char modname[MAX_MODULE_SIZE]=""; - uint modbase=0; - //check for function overlaps - if(!modnamefromaddr(start, modname, true)) - sprintf(sql, "SELECT manual FROM functions WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d", end, start); - else - { - modbase=modbasefromaddr(start); - sprintf(sql, "SELECT manual FROM functions WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d", modname, end-modbase, start-modbase); - } - if(sqlhasresult(userdb, sql)) //functions overlap - return false; - if(modbase) - sprintf(sql, "INSERT INTO functions (mod,start,end,manual) VALUES('%s',%"fext"d,%"fext"d,%d)", modname, start-modbase, end-modbase, manual); - else - sprintf(sql, "INSERT INTO functions (start,end,manual) VALUES(%"fext"d,%"fext"d,%d)", start, end, manual); - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } bool functiondel(uint addr) @@ -785,23 +426,6 @@ bool functiondel(uint addr) } } return false; - /* - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) - sprintf(sql, "DELETE FROM functions WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d", addr, addr); - else - { - uint rva=addr-modbasefromaddr(addr); - sprintf(sql, "DELETE FROM functions WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d", modname, rva, rva); - } - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - return true; - */ } bool loopget(int depth, uint addr, uint* start, uint* end) @@ -821,49 +445,6 @@ bool loopget(int depth, uint addr, uint* start, uint* end) } } return false; - /* - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) - return false; - char modname[MAX_MODULE_SIZE]=""; - char sql[deflen]=""; - uint modbase=0; - if(!modnamefromaddr(addr, modname, true)) - sprintf(sql, "SELECT start,end FROM loops WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", addr, addr, depth); - else - { - modbase=modbasefromaddr(addr); - uint rva=addr-modbase; - sprintf(sql, "SELECT start,end FROM loops WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", modname, rva, rva, depth); - } - sqlite3_stmt* stmt; - lock(WAITID_USERDB); - if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } -#ifdef _WIN64 - uint dbstart=sqlite3_column_int64(stmt, 0)+modbase; //start - uint dbend=sqlite3_column_int64(stmt, 1)+modbase; //end -#else - uint dbstart=sqlite3_column_int(stmt, 0)+modbase; //addr - uint dbend=sqlite3_column_int(stmt, 1)+modbase; //end -#endif // _WIN64 - sqlite3_finalize(stmt); - if(start) - *start=dbstart; - if(end) - *end=dbend; - unlock(WAITID_USERDB); - return true; - */ } bool loopadd(uint start, uint end, bool manual) @@ -913,35 +494,6 @@ bool loopoverlaps(int depth, uint start, uint end, int* finaldepth) return true; } return false; - /* - char sql[deflen]=""; - char modname[MAX_MODULE_SIZE]=""; - - //check if the new loop fits in the old loop - if(!modnamefromaddr(start, modname, true)) - sprintf(sql, "SELECT manual FROM loops WHERE mod IS NULL AND start<%"fext"d AND end>%"fext"d AND depth=%d", start, end, depth); - else - { - uint modbase=modbasefromaddr(start); - sprintf(sql, "SELECT manual FROM loops WHERE mod='%s' AND start<%"fext"d AND end>%"fext"d AND depth=%d", modname, start-modbase, end-modbase, depth); - } - if(sqlhasresult(userdb, sql)) //new loop fits in the old loop - return loopoverlaps(depth+1, start, end); //check the next depth - - //check for loop overlaps - if(!modnamefromaddr(start, modname, true)) - sprintf(sql, "SELECT manual FROM loops WHERE mod IS NULL AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", end, start, depth); - else - { - uint modbase=modbasefromaddr(start); - sprintf(sql, "SELECT manual FROM loops WHERE mod='%s' AND start<=%"fext"d AND end>=%"fext"d AND depth=%d", modname, end-modbase, start-modbase, depth); - } - if(finaldepth) - *finaldepth=depth; - if(sqlhasresult(userdb, sql)) //loops overlap - return true; - return false; - */ } bool loopdel(int depth, uint addr) diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 29fce57a..857c4d06 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -3,9 +3,6 @@ #include "_global.h" -//superglobal variables -extern sqlite3* userdb; - //structures struct MODINFO { @@ -68,28 +65,37 @@ typedef std::vector LoopsInfo; void dbinit(); bool dbsave(); bool dbload(); +void dbreadcache(); +void dbwritecache(); void dbclose(); + bool modload(uint base, uint size, const char* fullpath); bool modunload(uint base); void modclear(); bool modnamefromaddr(uint addr, char* modname, bool extension); uint modbasefromaddr(uint addr); uint modbasefromname(const char* modname); + bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); + bool commentset(uint addr, const char* text); bool commentget(uint addr, char* text); bool commentdel(uint addr); + bool labelset(uint addr, const char* text); bool labelfromstring(const char* text, uint* addr); bool labelget(uint addr, char* text); bool labeldel(uint addr); + bool bookmarkset(uint addr); bool bookmarkget(uint addr); bool bookmarkdel(uint addr); + bool functionget(uint addr, uint* start, uint* end); bool functionoverlaps(uint start, uint end); bool functionadd(uint start, uint end, bool manual); bool functiondel(uint addr); + bool loopget(int depth, uint addr, uint* start, uint* end); bool loopoverlaps(int depth, uint start, uint end, int* finaldepth); bool loopadd(uint start, uint end, bool manual); diff --git a/x64_dbg_dbg/breakpoint.cpp b/x64_dbg_dbg/breakpoint.cpp index c1c14122..df256f75 100644 --- a/x64_dbg_dbg/breakpoint.cpp +++ b/x64_dbg_dbg/breakpoint.cpp @@ -1,281 +1,142 @@ #include "breakpoint.h" #include "debugger.h" #include "addrinfo.h" -#include "sqlhelper.h" #include "console.h" #include "memory.h" #include "threading.h" -static BREAKPOINT bpall[1000]; //TODO: fix this size -static int bpcount=0; +static BreakpointsMap breakpoints; -int bpgetlist(BREAKPOINT** list) +int bpgetlist(std::vector* list) { - if(list) - *list=bpall; - return bpcount; + if(!DbgIsDebugging()) + return false; + BREAKPOINT curBp; + int count=0; + for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + { + curBp=i->second; + curBp.addr+=curBp.modbase; + curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); + count++; + if(list) + list->push_back(curBp); + } + return count; } bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE type, DWORD titantype, const char* name) { - if(bpget(addr, type, name, 0)) //breakpoint found + if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr) or bpget(addr, type, name, 0)) return false; - char modname[256]=""; - char sql[deflen]=""; - char bpname[MAX_BREAKPOINT_SIZE]=""; - if(modnamefromaddr(addr, modname, true)) //no module - { - uint modbase=modbasefromaddr(addr); - if(name and *name) - { - sqlstringescape(name, bpname); - sprintf(sql, "INSERT INTO breakpoints (addr,enabled,singleshoot,oldbytes,type,titantype,mod,name) VALUES (%"fext"d,%d,%d,%d,%d,%d,'%s','%s')", addr-modbase, enabled, singleshoot, oldbytes, type, titantype, modname, bpname); - } - else - sprintf(sql, "INSERT INTO breakpoints (addr,enabled,singleshoot,oldbytes,type,titantype,mod) VALUES (%"fext"d,%d,%d,%d,%d,%d,'%s')", addr-modbase, enabled, singleshoot, oldbytes, type, titantype, modname); - } + BREAKPOINT bp; + modnamefromaddr(addr, bp.mod, true); + bp.modbase=modbasefromaddr(addr); + bp.active=true; + bp.addr=addr-bp.modbase; + bp.enabled=enabled; + if(name and *name) + strcpy(bp.name, name); else - { - if(name and *name) - { - sqlstringescape(name, bpname); - sprintf(sql, "INSERT INTO breakpoints (addr,enabled,singleshoot,oldbytes,type,titantype,name) VALUES (%"fext"d,%d,%d,%d,%d,%d,'%s')", addr, enabled, singleshoot, oldbytes, type, titantype, bpname); - } - else - sprintf(sql, "INSERT INTO breakpoints (addr,enabled,singleshoot,oldbytes,type,titantype) VALUES (%"fext"d,%d,%d,%d,%d,%d)", addr, enabled, singleshoot, oldbytes, type, titantype); - } - if(!sqlexec(userdb, sql)) - { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; - } - bpenumall(0); //update breakpoint list - GuiUpdateBreakpointsView(); + *bp.name='\0'; + bp.oldbytes=oldbytes; + bp.singleshoot=singleshoot; + bp.titantype=titantype; + bp.type=type; + breakpoints.insert(std::make_pair(std::make_pair(addr, type), bp)); return true; } bool bpget(uint addr, BP_TYPE type, const char* name, BREAKPOINT* bp) { - char sql[deflen]=""; - char modname[256]=""; - char bpname[MAX_BREAKPOINT_SIZE]=""; - uint modbase=0; - if(!modnamefromaddr(addr, modname, true)) //no module + if(!DbgIsDebugging()) + return false; + BREAKPOINT curBp; + for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { - if(bp) - *bp->mod=0; + curBp=i->second; + curBp.addr+=curBp.modbase; + curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); if(name and *name) { - sqlstringescape(name, bpname); - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints WHERE (addr=%"fext"d AND type=%d AND mod IS NULL) OR name='%s'", addr, type, bpname); + if(i->first==std::make_pair(addr, type) or !strcmp(name, curBp.name)) + { + if(bp) + *bp=curBp; + return true; + } } - else - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints WHERE (addr=%"fext"d AND type=%d AND mod IS NULL)", addr, type); - } - else - { - if(bp) - strcpy(bp->mod, modname); - modbase=modbasefromaddr(addr); - if(name and *name) + else if(i->first==std::make_pair(addr, type)) { - sqlstringescape(name, bpname); - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints WHERE (addr=%"fext"d AND type=%d AND mod='%s') OR name='%s'", addr-modbase, type, modname, bpname); + if(bp) + *bp=curBp; + return true; } - else - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints WHERE (addr=%"fext"d AND type=%d AND mod='%s')", addr-modbase, type, modname); } - sqlite3_stmt* stmt; - lock(WAITID_USERDB); - if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(!bp) //just check if a breakpoint exists - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; - } - memset(bp, 0, sizeof(BREAKPOINT)); - if(!modbase) - { - const char* mod=(const char*)sqlite3_column_text(stmt, 6); //mod - if(mod) - modbase=modbasefromname(mod); - } -#ifdef _WIN64 - bp->addr=sqlite3_column_int64(stmt, 0)+modbase; //addr -#else - bp->addr=sqlite3_column_int(stmt, 0)+modbase; //addr -#endif // _WIN64 - if(sqlite3_column_int(stmt, 1)) //enabled - bp->enabled=true; - else - bp->enabled=false; - if(sqlite3_column_int(stmt, 2)) //singleshoot - bp->singleshoot=true; - else - bp->singleshoot=false; - bp->oldbytes=(short)(sqlite3_column_int(stmt, 3)&0xFFFF); //oldbytes - bp->type=(BP_TYPE)sqlite3_column_int(stmt, 4); //type - bp->titantype=sqlite3_column_int(stmt, 5); //titantype - const char* bpname_=(const char*)sqlite3_column_text(stmt, 7); //name - if(bpname_) - strcpy(bp->name, bpname_); - else - *bp->name=0; - //TODO: fix this - if(memisvalidreadptr(fdProcessInfo->hProcess, bp->addr)) - bp->active=true; - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; + return false; } bool bpdel(uint addr, BP_TYPE type) { - BREAKPOINT found; - if(!bpget(addr, type, 0, &found)) + if(!DbgIsDebugging()) return false; - char modname[256]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //no module - sprintf(sql, "DELETE FROM breakpoints WHERE addr=%"fext"d AND mod IS NULL AND type=%d", addr, type); - else - sprintf(sql, "DELETE FROM breakpoints WHERE addr=%"fext"d AND mod='%s' AND type=%d", addr-modbasefromaddr(addr), modname, type); - if(!sqlexec(userdb, sql)) + if(breakpoints.count(std::make_pair(addr, type))) { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; + breakpoints.erase(std::make_pair(addr, type)); + return true; } - bpenumall(0); //update breakpoint list - GuiUpdateBreakpointsView(); - return true; + return false; } bool bpenable(uint addr, BP_TYPE type, bool enable) { - BREAKPOINT found; - if(!bpget(addr, type, 0, &found)) + if(!DbgIsDebugging()) return false; - char modname[256]=""; - char sql[deflen]=""; - if(!modnamefromaddr(addr, modname, true)) //no module - sprintf(sql, "UPDATE breakpoints SET enabled=%d WHERE addr=%"fext"d AND mod IS NULL AND type=%d", enable, addr, type); - else - sprintf(sql, "UPDATE breakpoints SET enabled=%d WHERE addr=%"fext"d AND mod='%s' AND type=%d", enable, addr-modbasefromaddr(addr), modname, type); - if(!sqlexec(userdb, sql)) + if(breakpoints.count(std::make_pair(addr, type))) { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; + breakpoints[std::make_pair(addr, type)].enabled=true; + return true; } - bpenumall(0); //update breakpoint list - GuiUpdateBreakpointsView(); - return true; + return false; } bool bpsetname(uint addr, BP_TYPE type, const char* name) { - if(!name) + if(!DbgIsDebugging() or !name or !*name) return false; - char modname[256]=""; - char sql[deflen]=""; - char bpname[MAX_BREAKPOINT_SIZE]=""; - sqlstringescape(name, bpname); - if(!modnamefromaddr(addr, modname, true)) //no module - sprintf(sql, "UPDATE breakpoints SET name='%s' WHERE addr=%"fext"d AND mod IS NULL AND type=%d", bpname, addr, type); - else - sprintf(sql, "UPDATE breakpoints SET name='%s' WHERE addr=%"fext"d AND mod='%s' AND type=%d", bpname, addr-modbasefromaddr(addr), modname, type); - if(!sqlexec(userdb, sql)) + if(breakpoints.count(std::make_pair(addr, type))) { - dprintf("SQL Error: %s\nSQL Query: %s\n", sqllasterror(), sql); - return false; + strcpy(breakpoints[std::make_pair(addr, type)].name, name); + return true; } - bpenumall(0); //update breakpoint list - GuiUpdateBreakpointsView(); - return true; + return false; } bool bpenumall(BPENUMCALLBACK cbEnum, const char* module) { + if(!DbgIsDebugging()) + return false; bool retval=true; - if(!cbEnum) - bpcount=0; - char sql[deflen]=""; - if(!module) - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints"); - else - sprintf(sql, "SELECT addr,enabled,singleshoot,oldbytes,type,titantype,mod,name FROM breakpoints WHERE mod='%s'", module); - sqlite3_stmt* stmt; - lock(WAITID_USERDB); - if(sqlite3_prepare_v2(userdb, sql, -1, &stmt, 0)!=SQLITE_OK) + BREAKPOINT curBp; + for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - BREAKPOINT curbp; - do - { -#ifdef _WIN64 - uint rva=sqlite3_column_int64(stmt, 0); //addr -#else - uint rva=sqlite3_column_int(stmt, 0); //addr -#endif // _WIN64 - if(sqlite3_column_int(stmt, 1)) //enabled - curbp.enabled=true; - else - curbp.enabled=false; - if(sqlite3_column_int(stmt, 2)) //singleshoot - curbp.singleshoot=true; - else - curbp.singleshoot=false; - curbp.oldbytes=(short)(sqlite3_column_int(stmt, 3)&0xFFFF); //oldbytes - curbp.type=(BP_TYPE)sqlite3_column_int(stmt, 4); //type - curbp.titantype=sqlite3_column_int(stmt, 5); //titantype - const char* modname=(const char*)sqlite3_column_text(stmt, 6); //mod - if(modname) - strcpy(curbp.mod, modname); - else - *curbp.mod=0; - const char* bpname=(const char*)sqlite3_column_text(stmt, 7); //name - if(bpname) - strcpy(curbp.name, bpname); - else - *curbp.name=0; - uint modbase=modbasefromname(modname); - if(!modbase) //module not loaded - *curbp.mod=0; - curbp.addr=modbase+rva; - if(cbEnum) + curBp=i->second; + curBp.addr+=curBp.modbase; //RVA to VA + curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); //TODO: wtf am I doing? + if(module and *module) { - if(!cbEnum(&curbp)) + if(!strcmp(curBp.mod, module)) + { + if(!cbEnum(&curBp)) + retval=false; + } + } + else + { + if(!cbEnum(&curBp)) retval=false; - } - else if(bpcount<1000) - { - memcpy(&bpall[bpcount], &curbp, sizeof(BREAKPOINT)); - bpcount++; - } + } } - while(sqlite3_step(stmt)==SQLITE_ROW); - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); return retval; } @@ -286,9 +147,13 @@ bool bpenumall(BPENUMCALLBACK cbEnum) int bpgetcount(BP_TYPE type) { - char sql[deflen]=""; - sprintf(sql, "SELECT * FROM breakpoints WHERE type=%d", type); - return sqlrowcount(userdb, sql); + int count=0; + for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + { + if(i->first.first==type) + count++; + } + return count; } void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge) @@ -315,4 +180,4 @@ void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge) default: bridge->type=bp_none; } -} \ No newline at end of file +} diff --git a/x64_dbg_dbg/breakpoint.h b/x64_dbg_dbg/breakpoint.h index 641c0bca..06421902 100644 --- a/x64_dbg_dbg/breakpoint.h +++ b/x64_dbg_dbg/breakpoint.h @@ -15,6 +15,7 @@ enum BP_TYPE //structs struct BREAKPOINT { + uint modbase; uint addr; bool enabled; bool singleshoot; @@ -28,10 +29,11 @@ struct BREAKPOINT //typedefs typedef bool (*BPENUMCALLBACK)(const BREAKPOINT* bp); -typedef std::map BreakpointsMap; + +typedef std::map, BREAKPOINT> BreakpointsMap; //functions -int bpgetlist(BREAKPOINT** list); +int bpgetlist(std::vector* list); bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE type, DWORD titantype, const char* name); bool bpget(uint addr, BP_TYPE type, const char* name, BREAKPOINT* bp); bool bpdel(uint addr, BP_TYPE type); diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 5cadf44e..11e294cb 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -46,7 +46,7 @@ static void cbUserBreakpoint(); void dbgdisablebpx() { - BREAKPOINT* list; + std::vector list; int bpcount=bpgetlist(&list); for(int i=0; i list; int bpcount=bpgetlist(&list); for(int i=0; ienabled) + return true; switch(bp->type) { case BPNORMAL: - if(bp->enabled) - { - if(!SetBPX(bp->addr, bp->titantype, (void*)cbUserBreakpoint)) - dprintf("could not set breakpoint "fhex"!\n", bp->addr); - } - break; + { + if(!SetBPX(bp->addr, bp->titantype, (void*)cbUserBreakpoint)) + dprintf("could not set breakpoint "fhex"!\n", bp->addr); + } + break; + case BPMEMORY: - if(bp->enabled) - { - uint size=0; - memfindbaseaddr(fdProcessInfo->hProcess, bp->addr, &size); - bool restore=false; - if(!bp->singleshoot) - restore=true; - if(!SetMemoryBPXEx(bp->addr, size, bp->titantype, restore, (void*)cbMemoryBreakpoint)) - dprintf("could not set memory breakpoint "fhex"!\n", bp->addr); - } - break; + { + uint size=0; + memfindbaseaddr(fdProcessInfo->hProcess, bp->addr, &size); + bool restore=false; + if(!bp->singleshoot) + restore=true; + if(!SetMemoryBPXEx(bp->addr, size, bp->titantype, restore, (void*)cbMemoryBreakpoint)) + dprintf("could not set memory breakpoint "fhex"!\n", bp->addr); + } + break; + case BPHARDWARE: - if(bp->enabled) - { - if(!SetHardwareBreakPoint(bp->addr, (bp->titantype>>8)&0xF, (bp->titantype>>4)&0xF, bp->titantype&0xF, (void*)cbHardwareBreakpoint)) - dprintf("could not set hardware breakpoint "fhex"!\n", bp->addr); - } - break; + { + if(!SetHardwareBreakPoint(bp->addr, (bp->titantype>>8)&0xF, (bp->titantype>>4)&0xF, bp->titantype&0xF, (void*)cbHardwareBreakpoint)) + dprintf("could not set hardware breakpoint "fhex"!\n", bp->addr); + } + break; + default: break; } @@ -528,10 +529,11 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo) modInfo.SizeOfStruct=sizeof(modInfo); if(SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) modload((uint)base, modInfo.ImageSize, modInfo.ImageName); - bpenumall(0); //update breakpoint list + //bpenumall(0); //update breakpoint list char modname[256]=""; if(modnamefromaddr((uint)base, modname, true)) bpenumall(cbSetModuleBreakpoints, modname); + GuiUpdateBreakpointsView(); if(!bFileIsDll and !bIsAttached) //Set entry breakpoint { pDebuggedBase=(uint)CreateProcessInfo->lpBaseOfImage; //debugged base = executable @@ -692,10 +694,11 @@ static void cbLoadDll(LOAD_DLL_DEBUG_INFO* LoadDll) modInfo.SizeOfStruct=sizeof(IMAGEHLP_MODULE64); if(SymGetModuleInfo64(fdProcessInfo->hProcess, (DWORD64)base, &modInfo)) modload((uint)base, modInfo.ImageSize, modInfo.ImageName); - bpenumall(0); //update breakpoint list + //bpenumall(0); //update breakpoint list char modname[256]=""; if(modnamefromaddr((uint)base, modname, true)) bpenumall(cbSetModuleBreakpoints, modname); + GuiUpdateBreakpointsView(); bool bAlreadySetEntry=false; if(bFileIsDll and !_stricmp(DLLDebugFileName, szFileName) and !bIsAttached) //Set entry breakpoint { @@ -756,6 +759,7 @@ static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll) char modname[256]="???"; if(modnamefromaddr((uint)base, modname, true)) bpenumall(cbRemoveModuleBreakpoints, modname); + GuiUpdateBreakpointsView(); SymUnloadModule64(fdProcessInfo->hProcess, (DWORD64)base); dprintf("DLL Unloaded: "fhex" %s\n", base, modname); diff --git a/x64_dbg_dbg/sqlhelper.cpp b/x64_dbg_dbg/sqlhelper.cpp deleted file mode 100644 index 5ad51220..00000000 --- a/x64_dbg_dbg/sqlhelper.cpp +++ /dev/null @@ -1,183 +0,0 @@ -#include "sqlhelper.h" -#include "console.h" -#include "threading.h" - -static char lasterror[deflen]=""; - -const char* sqllasterror() -{ - return lasterror; -} - -bool sqlexec(sqlite3* db, const char* query) -{ - lock(WAITID_USERDB); - char* errorText=0; - if(sqlite3_exec(db, query, 0, 0, &errorText)!=SQLITE_OK) //error - { - if(errorText) - strcpy(lasterror, errorText); - sqlite3_free(errorText); - unlock(WAITID_USERDB); - return false; - } - *lasterror=0; - unlock(WAITID_USERDB); - return true; -} - -bool sqlhasresult(sqlite3* db, const char* query) -{ - lock(WAITID_USERDB); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(db, query, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; -} - -bool sqlgettext(sqlite3* db, const char* query, char* result) -{ - if(!result) - return false; - lock(WAITID_USERDB); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(db, query, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - strcpy(result, (const char*)sqlite3_column_text(stmt, 0)); - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; -} - -bool sqlgetint(sqlite3* db, const char* query, int* result) -{ - if(!result) - return false; - lock(WAITID_USERDB); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(db, query, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - *result=sqlite3_column_int(stmt, 0); - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; -} - -bool sqlgetuint(sqlite3* db, const char* query, uint* result) -{ - if(!result) - return false; - lock(WAITID_USERDB); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(db, query, -1, &stmt, 0)!=SQLITE_OK) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } - if(sqlite3_step(stmt)!=SQLITE_ROW) - { - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return false; - } -#ifdef _WIN64 - *result=sqlite3_column_int64(stmt, 0); -#else - *result=sqlite3_column_int(stmt, 0); -#endif // _WIN64 - sqlite3_finalize(stmt); - unlock(WAITID_USERDB); - return true; -} - -void sqlstringescape(const char* string, char* escaped_string) -{ - if(!string or !escaped_string) - return; - int len=strlen(string); - *escaped_string=0; - for(int i=0,j=0; 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 NxHX3-W#AL_e*t@5in;&* diff --git a/x64_dbg_dbg/sqlite/libsqlite64.a b/x64_dbg_dbg/sqlite/libsqlite64.a deleted file mode 100644 index 23c739109bec46a43f8a33acde738ffc65d2aeb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132208 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 GT>W3_{2!+P diff --git a/x64_dbg_dbg/sqlite/sqlite.def b/x64_dbg_dbg/sqlite/sqlite.def deleted file mode 100644 index f3867f32..00000000 --- a/x64_dbg_dbg/sqlite/sqlite.def +++ /dev/null @@ -1,207 +0,0 @@ -LIBRARY "sqlite.dll" -EXPORTS -sqlite3_aggregate_context -sqlite3_aggregate_count -sqlite3_auto_extension -sqlite3_backup_finish -sqlite3_backup_init -sqlite3_backup_pagecount -sqlite3_backup_remaining -sqlite3_backup_step -sqlite3_bind_blob -sqlite3_bind_double -sqlite3_bind_int -sqlite3_bind_int64 -sqlite3_bind_null -sqlite3_bind_parameter_count -sqlite3_bind_parameter_index -sqlite3_bind_parameter_name -sqlite3_bind_text -sqlite3_bind_text16 -sqlite3_bind_value -sqlite3_bind_zeroblob -sqlite3_blob_bytes -sqlite3_blob_close -sqlite3_blob_open -sqlite3_blob_read -sqlite3_blob_reopen -sqlite3_blob_write -sqlite3_busy_handler -sqlite3_busy_timeout -sqlite3_cancel_auto_extension -sqlite3_changes -sqlite3_clear_bindings -sqlite3_close -sqlite3_close_v2 -sqlite3_collation_needed -sqlite3_collation_needed16 -sqlite3_column_blob -sqlite3_column_bytes -sqlite3_column_bytes16 -sqlite3_column_count -sqlite3_column_decltype -sqlite3_column_decltype16 -sqlite3_column_double -sqlite3_column_int -sqlite3_column_int64 -sqlite3_column_name -sqlite3_column_name16 -sqlite3_column_text -sqlite3_column_text16 -sqlite3_column_type -sqlite3_column_value -sqlite3_commit_hook -sqlite3_compileoption_get -sqlite3_compileoption_used -sqlite3_complete -sqlite3_complete16 -sqlite3_config -sqlite3_context_db_handle -sqlite3_create_collation -sqlite3_create_collation16 -sqlite3_create_collation_v2 -sqlite3_create_function -sqlite3_create_function16 -sqlite3_create_function_v2 -sqlite3_create_module -sqlite3_create_module_v2 -sqlite3_data_count -sqlite3_data_directory DATA -sqlite3_db_config -sqlite3_db_filename -sqlite3_db_handle -sqlite3_db_mutex -sqlite3_db_readonly -sqlite3_db_release_memory -sqlite3_db_status -sqlite3_declare_vtab -sqlite3_enable_load_extension -sqlite3_enable_shared_cache -sqlite3_errcode -sqlite3_errmsg -sqlite3_errmsg16 -sqlite3_errstr -sqlite3_exec -sqlite3_expired -sqlite3_extended_errcode -sqlite3_extended_result_codes -sqlite3_file_control -sqlite3_finalize -sqlite3_free -sqlite3_free_table -sqlite3_get_autocommit -sqlite3_get_auxdata -sqlite3_get_table -sqlite3_global_recover -sqlite3_initialize -sqlite3_interrupt -sqlite3_last_insert_rowid -sqlite3_libversion -sqlite3_libversion_number -sqlite3_limit -sqlite3_load_extension -sqlite3_log -sqlite3_malloc -sqlite3_memory_alarm -sqlite3_memory_highwater -sqlite3_memory_used -sqlite3_mprintf -sqlite3_mutex_alloc -sqlite3_mutex_enter -sqlite3_mutex_free -sqlite3_mutex_leave -sqlite3_mutex_try -sqlite3_next_stmt -sqlite3_open -sqlite3_open16 -sqlite3_open_v2 -sqlite3_os_end -sqlite3_os_init -sqlite3_overload_function -sqlite3_prepare -sqlite3_prepare16 -sqlite3_prepare16_v2 -sqlite3_prepare_v2 -sqlite3_profile -sqlite3_progress_handler -sqlite3_randomness -sqlite3_realloc -sqlite3_release_memory -sqlite3_reset -sqlite3_reset_auto_extension -sqlite3_result_blob -sqlite3_result_double -sqlite3_result_error -sqlite3_result_error16 -sqlite3_result_error_code -sqlite3_result_error_nomem -sqlite3_result_error_toobig -sqlite3_result_int -sqlite3_result_int64 -sqlite3_result_null -sqlite3_result_text -sqlite3_result_text16 -sqlite3_result_text16be -sqlite3_result_text16le -sqlite3_result_value -sqlite3_result_zeroblob -sqlite3_rollback_hook -sqlite3_set_authorizer -sqlite3_set_auxdata -sqlite3_shutdown -sqlite3_sleep -sqlite3_snprintf -sqlite3_soft_heap_limit -sqlite3_soft_heap_limit64 -sqlite3_sourceid -sqlite3_sql -sqlite3_status -sqlite3_step -sqlite3_stmt_busy -sqlite3_stmt_readonly -sqlite3_stmt_status -sqlite3_strglob -sqlite3_stricmp -sqlite3_strnicmp -sqlite3_temp_directory DATA -sqlite3_test_control -sqlite3_thread_cleanup -sqlite3_threadsafe -sqlite3_total_changes -sqlite3_trace -sqlite3_transfer_bindings -sqlite3_update_hook -sqlite3_uri_boolean -sqlite3_uri_int64 -sqlite3_uri_parameter -sqlite3_user_data -sqlite3_value_blob -sqlite3_value_bytes -sqlite3_value_bytes16 -sqlite3_value_double -sqlite3_value_int -sqlite3_value_int64 -sqlite3_value_numeric_type -sqlite3_value_text -sqlite3_value_text16 -sqlite3_value_text16be -sqlite3_value_text16le -sqlite3_value_type -sqlite3_version DATA -sqlite3_vfs_find -sqlite3_vfs_register -sqlite3_vfs_unregister -sqlite3_vmprintf -sqlite3_vsnprintf -sqlite3_vtab_config -sqlite3_vtab_on_conflict -sqlite3_wal_autocheckpoint -sqlite3_wal_checkpoint -sqlite3_wal_checkpoint_v2 -sqlite3_wal_hook -sqlite3_win32_mbcs_to_utf8 -sqlite3_win32_set_directory -sqlite3_win32_sleep -sqlite3_win32_utf8_to_mbcs -sqlite3_win32_write_debug -winSysInfo DATA diff --git a/x64_dbg_dbg/sqlite/sqlite3.h b/x64_dbg_dbg/sqlite/sqlite3.h deleted file mode 100644 index a52d55c3..00000000 --- a/x64_dbg_dbg/sqlite/sqlite3.h +++ /dev/null @@ -1,7315 +0,0 @@ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the SQLite library -** presents to client programs. If a C-function, structure, datatype, -** or constant definition does not appear in this file, then it is -** not a published API of SQLite, is subject to change without -** notice, and should not be referenced by programs that use SQLite. -** -** Some of the definitions that are in this file are marked as -** "experimental". Experimental interfaces are normally new -** features recently added to SQLite. We do not anticipate changes -** to experimental interfaces but reserve the right to make minor changes -** if experience from use "in the wild" suggest such changes are prudent. -** -** The official C-language API documentation for SQLite is derived -** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. -** -** The name of this file under configuration management is "sqlite.h.in". -** The makefile makes some minor changes to this file (such as inserting -** the version number) and changes its name to "sqlite3.h" as -** part of the build process. -*/ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ -#include /* Needed for the definition of va_list */ - -/* -** Make sure we can call this stuff from C++. -*/ -#ifdef __cplusplus -extern "C" { -#endif - - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -#ifndef SQLITE_API -# define SQLITE_API -#endif - - -/* -** These no-op macros are used in front of interfaces to mark those -** interfaces as either deprecated or experimental. New applications -** should not use deprecated interfaces - they are support for backwards -** compatibility only. Application writers should be aware that -** experimental interfaces are subject to change in point releases. -** -** These macros used to resolve to various kinds of compiler magic that -** would generate warning messages when they were used. But that -** compiler magic ended up generating such a flurry of bug reports -** that we have taken it all out and gone back to using simple -** noop macros. -*/ -#define SQLITE_DEPRECATED -#define SQLITE_EXPERIMENTAL - -/* -** Ensure these symbols were not defined by some previous header file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers -** -** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header -** evaluates to a string literal that is the SQLite version in the -** format "X.Y.Z" where X is the major version number (always 3 for -** SQLite3) and Y is the minor version number and Z is the release number.)^ -** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer -** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same -** numbers used in [SQLITE_VERSION].)^ -** The SQLITE_VERSION_NUMBER for any given release of SQLite will also -** be larger than the release from which it is derived. Either Y will -** be held constant and Z will be incremented or else Y will be incremented -** and Z will be reset to zero. -** -** Since version 3.6.18, SQLite source code has been stored in the -** Fossil configuration management -** system. ^The SQLITE_SOURCE_ID macro evaluates to -** a string which identifies a particular check-in of SQLite -** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. -** -** See also: [sqlite3_libversion()], -** [sqlite3_libversion_number()], [sqlite3_sourceid()], -** [sqlite_version()] and [sqlite_source_id()]. -*/ -#define SQLITE_VERSION "3.8.1" -#define SQLITE_VERSION_NUMBER 3008001 -#define SQLITE_SOURCE_ID "2013-10-17 12:57:35 c78be6d786c19073b3a6730dfe3fb1be54f5657a" - -/* -** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid -** -** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros -** but are associated with the library instead of the header file. ^(Cautious -** programmers might include assert() statements in their application to -** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is -** compiled with matching library and header files. -** -**

    -** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
    -** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
    -** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
    -** 
    )^ -** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() -** function is provided for use in DLLs since DLL users usually do not have -** direct access to string constants within the DLL. ^The -** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns -** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. -** -** See also: [sqlite_version()] and [sqlite_source_id()]. -*/ -SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; -SQLITE_API const char *sqlite3_libversion(void); -SQLITE_API const char *sqlite3_sourceid(void); -SQLITE_API int sqlite3_libversion_number(void); - -/* -** CAPI3REF: Run-Time Library Compilation Options Diagnostics -** -** ^The sqlite3_compileoption_used() function returns 0 or 1 -** indicating whether the specified option was defined at -** compile time. ^The SQLITE_ prefix may be omitted from the -** option name passed to sqlite3_compileoption_used(). -** -** ^The sqlite3_compileoption_get() function allows iterating -** over the list of options that were defined at compile time by -** returning the N-th compile time option string. ^If N is out of range, -** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ -** prefix is omitted from any strings returned by -** sqlite3_compileoption_get(). -** -** ^Support for the diagnostic functions sqlite3_compileoption_used() -** and sqlite3_compileoption_get() may be omitted by specifying the -** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. -** -** See also: SQL functions [sqlite_compileoption_used()] and -** [sqlite_compileoption_get()] and the [compile_options pragma]. -*/ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS -SQLITE_API int sqlite3_compileoption_used(const char *zOptName); -SQLITE_API const char *sqlite3_compileoption_get(int N); -#endif - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe -** -** ^The sqlite3_threadsafe() function returns zero if and only if -** SQLite was compiled with mutexing code omitted due to the -** [SQLITE_THREADSAFE] compile-time option being set to 0. -** -** SQLite can be compiled with or without mutexes. When -** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes -** are enabled and SQLite is threadsafe. When the -** [SQLITE_THREADSAFE] macro is 0, -** the mutexes are omitted. Without the mutexes, it is not safe -** to use SQLite concurrently from more than one thread. -** -** Enabling mutexes incurs a measurable performance penalty. -** So if speed is of utmost importance, it makes sense to disable -** the mutexes. But for maximum safety, mutexes should be enabled. -** ^The default behavior is for mutexes to be enabled. -** -** This interface can be used by an application to make sure that the -** version of SQLite that it is linking against was compiled with -** the desired setting of the [SQLITE_THREADSAFE] macro. -** -** This interface only reports on the compile-time mutex setting -** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but -** can be fully or partially disabled using a call to [sqlite3_config()] -** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the -** sqlite3_threadsafe() function shows only the compile-time setting of -** thread safety, not any run-time changes to that setting made by -** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() -** is unchanged by calls to sqlite3_config().)^ -** -** See the [threading mode] documentation for additional information. -*/ -SQLITE_API int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle -** KEYWORDS: {database connection} {database connections} -** -** Each open SQLite database is represented by a pointer to an instance of -** the opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] -** and [sqlite3_close_v2()] are its destructors. There are many other -** interfaces (such as -** [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on an -** sqlite3 object. -*/ -typedef struct sqlite3 sqlite3; - -/* -** CAPI3REF: 64-Bit Integer Types -** KEYWORDS: sqlite_int64 sqlite_uint64 -** -** Because there is no cross-platform way to specify 64-bit integer types -** SQLite includes typedefs for 64-bit signed and unsigned integers. -** -** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. -** The sqlite_int64 and sqlite_uint64 types are supported for backwards -** compatibility only. -** -** ^The sqlite3_int64 and sqlite_int64 types can store integer values -** between -9223372036854775808 and +9223372036854775807 inclusive. ^The -** sqlite3_uint64 and sqlite_uint64 types can store integer values -** between 0 and +18446744073709551615 inclusive. -*/ -#ifdef SQLITE_INT64_TYPE -typedef SQLITE_INT64_TYPE sqlite_int64; -typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 sqlite_int64; -typedef unsigned __int64 sqlite_uint64; -#else -typedef long long int sqlite_int64; -typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection -** -** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors -** for the [sqlite3] object. -** ^Calls to sqlite3_close() and sqlite3_close_v2() return SQLITE_OK if -** the [sqlite3] object is successfully destroyed and all associated -** resources are deallocated. -** -** ^If the database connection is associated with unfinalized prepared -** statements or unfinished sqlite3_backup objects then sqlite3_close() -** will leave the database connection open and return [SQLITE_BUSY]. -** ^If sqlite3_close_v2() is called with unfinalized prepared statements -** and unfinished sqlite3_backups, then the database connection becomes -** an unusable "zombie" which will automatically be deallocated when the -** last prepared statement is finalized or the last sqlite3_backup is -** finished. The sqlite3_close_v2() interface is intended for use with -** host languages that are garbage collected, and where the order in which -** destructors are called is arbitrary. -** -** Applications should [sqlite3_finalize | finalize] all [prepared statements], -** [sqlite3_blob_close | close] all [BLOB handles], and -** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated -** with the [sqlite3] object prior to attempting to close the object. ^If -** sqlite3_close_v2() is called on a [database connection] that still has -** outstanding [prepared statements], [BLOB handles], and/or -** [sqlite3_backup] objects then it returns SQLITE_OK but the deallocation -** of resources is deferred until all [prepared statements], [BLOB handles], -** and [sqlite3_backup] objects are also destroyed. -** -** ^If an [sqlite3] object is destroyed while a transaction is open, -** the transaction is automatically rolled back. -** -** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] -** must be either a NULL -** pointer or an [sqlite3] object pointer obtained -** from [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()], and not previously closed. -** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer -** argument is a harmless no-op. -*/ -SQLITE_API int sqlite3_close(sqlite3*); -SQLITE_API int sqlite3_close_v2(sqlite3*); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface -** -** The sqlite3_exec() interface is a convenience wrapper around -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], -** that allows an application to run multiple statements of SQL -** without having to use a lot of C code. -** -** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, -** in the context of the [database connection] passed in as its 1st -** argument. ^If the callback function of the 3rd argument to -** sqlite3_exec() is not NULL, then it is invoked for each result row -** coming out of the evaluated SQL statements. ^The 4th argument to -** sqlite3_exec() is relayed through to the 1st argument of each -** callback invocation. ^If the callback pointer to sqlite3_exec() -** is NULL, then no callback is ever invoked and result rows are -** ignored. -** -** ^If an error occurs while evaluating the SQL statements passed into -** sqlite3_exec(), then execution of the current statement stops and -** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() -** is not NULL then any error message is written into memory obtained -** from [sqlite3_malloc()] and passed back through the 5th parameter. -** To avoid memory leaks, the application should invoke [sqlite3_free()] -** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. -** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors -** occur, then sqlite3_exec() sets the pointer in its 5th parameter to -** NULL before returning. -** -** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() -** routine returns SQLITE_ABORT without invoking the callback again and -** without running any subsequent SQL statements. -** -** ^The 2nd argument to the sqlite3_exec() callback function is the -** number of columns in the result. ^The 3rd argument to the sqlite3_exec() -** callback is an array of pointers to strings obtained as if from -** [sqlite3_column_text()], one for each column. ^If an element of a -** result row is NULL then the corresponding string pointer for the -** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the -** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained -** from [sqlite3_column_name()]. -** -** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer -** to an empty string, or a pointer that contains only whitespace and/or -** SQL comments, then no SQL statements are evaluated and the database -** is not changed. -** -** Restrictions: -** -**
      -**
    • The application must insure that the 1st parameter to sqlite3_exec() -** is a valid and open [database connection]. -**
    • The application must not close [database connection] specified by -** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. -**
    • The application must not modify the SQL statement text passed into -** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. -**
    -*/ -SQLITE_API int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluated */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes -** KEYWORDS: SQLITE_OK {error code} {error codes} -** KEYWORDS: {result code} {result codes} -** -** Many SQLite functions return an integer result code from the set shown -** here in order to indicate success or failure. -** -** New error codes may be added in future versions of SQLite. -** -** See also: [SQLITE_IOERR_READ | extended result codes], -** [sqlite3_vtab_on_conflict()] [SQLITE_ROLLBACK | result codes]. -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ -#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes -** KEYWORDS: {extended error code} {extended error codes} -** KEYWORDS: {extended result code} {extended result codes} -** -** In its default configuration, SQLite API routines return one of 26 integer -** [SQLITE_OK | result codes]. However, experience has shown that many of -** these result codes are too coarse-grained. They do not provide as -** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. The extended result codes are enabled or disabled -** on a per database connection basis using the -** [sqlite3_extended_result_codes()] API. -** -** Some of the available extended result codes are listed here. -** One may expect the number of extended result codes will be expand -** over time. Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) -#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) -#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) -#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) -#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) -#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) -#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) -#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) -#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) -#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) -#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) -#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) -#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) -#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) -#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) -#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) -#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) -#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) -#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) -#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) -#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) -#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) -#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) -#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) -#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) -#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) -#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) -#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) -#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) -#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) -#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) -#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) -#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) -#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) -#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) -#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) -#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) -#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) -#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) - -/* -** CAPI3REF: Flags For File Open Operations -** -** These bit values are intended for use in the -** 3rd parameter to the [sqlite3_open_v2()] interface and -** in the 4th parameter to the [sqlite3_vfs.xOpen] method. -*/ -#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ -#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ -#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ -#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ -#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ - -/* Reserved: 0x00F00000 */ - -/* -** CAPI3REF: Device Characteristics -** -** The xDeviceCharacteristics method of the [sqlite3_io_methods] -** object returns an integer which is a vector of these -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that -** after reboot following a crash or power loss, the only bytes in a -** file that were written at the application level might have changed -** and that adjacent bytes, even bytes within the same sector are -** guaranteed to be unchanged. -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 -#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 -#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 - -/* -** CAPI3REF: File Locking Levels -** -** SQLite uses one of these integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags -** -** When SQLite invokes the xSync() method of an -** [sqlite3_io_methods] object it uses a combination of -** these integer values as the second argument. -** -** When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. If the lower four bits of the flag -** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. -** If the lower four bits equal SQLITE_SYNC_FULL, that means -** to use Mac OS X style fullsync instead of fsync(). -** -** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags -** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL -** settings. The [synchronous pragma] determines when calls to the -** xSync VFS method occur and applies uniformly across all platforms. -** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how -** energetic or rigorous or forceful the sync operations are and -** only make a difference on Mac OSX for the default SQLite code. -** (Third-party VFS implementations might also make the distinction -** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the -** operating systems natively supported by SQLite, only Mac OSX -** cares about the difference.) -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - -/* -** CAPI3REF: OS Interface Open File Handle -** -** An [sqlite3_file] object represents an open file in the -** [sqlite3_vfs | OS interface layer]. Individual OS interface -** implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file -{ - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object -** -** Every file opened by the [sqlite3_vfs.xOpen] method populates an -** [sqlite3_file] object (or, more commonly, a subclass of the -** [sqlite3_file] object) with a pointer to an instance of this object. -** This object defines the methods used to perform various operations -** against the open file represented by the [sqlite3_file] object. -** -** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element -** to a non-NULL pointer, then the sqlite3_io_methods.xClose method -** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The -** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] -** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element -** to NULL. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] -** flag may be ORed in to indicate that only the data of the file -** and not its inode needs to be synced. -** -** The integer values to xLock() and xUnlock() are one of -**
      -**
    • [SQLITE_LOCK_NONE], -**
    • [SQLITE_LOCK_SHARED], -**
    • [SQLITE_LOCK_RESERVED], -**
    • [SQLITE_LOCK_PENDING], or -**
    • [SQLITE_LOCK_EXCLUSIVE]. -**
    -** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method checks whether any database connection, -** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument is an -** integer opcode. The third argument is a generic pointer intended to -** point to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves all opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. VFS implementations should -** return [SQLITE_NOTFOUND] for file control opcodes that they do not -** recognize. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
      -**
    • [SQLITE_IOCAP_ATOMIC] -**
    • [SQLITE_IOCAP_ATOMIC512] -**
    • [SQLITE_IOCAP_ATOMIC1K] -**
    • [SQLITE_IOCAP_ATOMIC2K] -**
    • [SQLITE_IOCAP_ATOMIC4K] -**
    • [SQLITE_IOCAP_ATOMIC8K] -**
    • [SQLITE_IOCAP_ATOMIC16K] -**
    • [SQLITE_IOCAP_ATOMIC32K] -**
    • [SQLITE_IOCAP_ATOMIC64K] -**
    • [SQLITE_IOCAP_SAFE_APPEND] -**
    • [SQLITE_IOCAP_SEQUENTIAL] -**
    -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -** -** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill -** in the unread portions of the buffer with zeros. A VFS that -** fails to zero-fill short reads might seem to work. However, -** failure to zero-fill short reads will eventually lead to -** database corruption. -*/ -typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods -{ - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); - /* Methods above are valid for version 1 */ - int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); - int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); - void (*xShmBarrier)(sqlite3_file*); - int (*xShmUnmap)(sqlite3_file*, int deleteFlag); - /* Methods above are valid for version 2 */ - int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); - int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); - /* Methods above are valid for version 3 */ - /* Additional methods may be added in future releases */ -}; - -/* -** CAPI3REF: Standard File Control Opcodes -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] -** interface. -** -** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode causes the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -**
      -**
    • [[SQLITE_FCNTL_SIZE_HINT]] -** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS -** layer a hint of how large the database file will grow to be during the -** current transaction. This hint is not guaranteed to be accurate but it -** is often close. The underlying VFS might choose to preallocate database -** file space based on this hint in order to help writes to the database -** file run faster. -** -**
    • [[SQLITE_FCNTL_CHUNK_SIZE]] -** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS -** extends and truncates the database file in chunks of a size specified -** by the user. The fourth argument to [sqlite3_file_control()] should -** point to an integer (type int) containing the new chunk-size to use -** for the nominated database. Allocating database file space in large -** chunks (say 1MB at a time), may reduce file-system fragmentation and -** improve performance on some systems. -** -**
    • [[SQLITE_FCNTL_FILE_POINTER]] -** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer -** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. -** -**
    • [[SQLITE_FCNTL_SYNC_OMITTED]] -** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by -** SQLite and sent to all VFSes in place of a call to the xSync method -** when the database connection has [PRAGMA synchronous] set to OFF.)^ -** Some specialized VFSes need this signal in order to operate correctly -** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most -** VFSes do not need this signal and should silently ignore this opcode. -** Applications should not call [sqlite3_file_control()] with this -** opcode as doing so may disrupt the operation of the specialized VFSes -** that do require it. -** -**
    • [[SQLITE_FCNTL_WIN32_AV_RETRY]] -** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic -** retry counts and intervals for certain disk I/O operations for the -** windows [VFS] in order to provide robustness in the presence of -** anti-virus programs. By default, the windows VFS will retry file read, -** file write, and file delete operations up to 10 times, with a delay -** of 25 milliseconds before the first retry and with the delay increasing -** by an additional 25 milliseconds with each subsequent retry. This -** opcode allows these two values (10 retries and 25 milliseconds of delay) -** to be adjusted. The values are changed for all database connections -** within the same process. The argument is a pointer to an array of two -** integers where the first integer i the new retry count and the second -** integer is the delay. If either integer is negative, then the setting -** is not changed but instead the prior value of that setting is written -** into the array entry, allowing the current retry settings to be -** interrogated. The zDbName parameter is ignored. -** -**
    • [[SQLITE_FCNTL_PERSIST_WAL]] -** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the -** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary -** write ahead log and shared memory files used for transaction control -** are automatically deleted when the latest connection to the database -** closes. Setting persistent WAL mode causes those files to persist after -** close. Persisting the files is useful when other processes that do not -** have write permission on the directory containing the database file want -** to read the database file, as the WAL and shared memory files must exist -** in order for the database to be readable. The fourth parameter to -** [sqlite3_file_control()] for this opcode should be a pointer to an integer. -** That integer is 0 to disable persistent WAL mode or 1 to enable persistent -** WAL mode. If the integer is -1, then it is overwritten with the current -** WAL persistence setting. -** -**
    • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] -** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the -** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting -** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the -** xDeviceCharacteristics methods. The fourth parameter to -** [sqlite3_file_control()] for this opcode should be a pointer to an integer. -** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage -** mode. If the integer is -1, then it is overwritten with the current -** zero-damage mode setting. -** -**
    • [[SQLITE_FCNTL_OVERWRITE]] -** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening -** a write transaction to indicate that, unless it is rolled back for some -** reason, the entire database file will be overwritten by the current -** transaction. This is used by VACUUM operations. -** -**
    • [[SQLITE_FCNTL_VFSNAME]] -** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of -** all [VFSes] in the VFS stack. The names are of all VFS shims and the -** final bottom-level VFS are written into memory obtained from -** [sqlite3_malloc()] and the result is stored in the char* variable -** that the fourth parameter of [sqlite3_file_control()] points to. -** The caller is responsible for freeing the memory when done. As with -** all file-control actions, there is no guarantee that this will actually -** do anything. Callers should initialize the char* variable to a NULL -** pointer in case this file-control is not implemented. This file-control -** is intended for diagnostic use only. -** -**
    • [[SQLITE_FCNTL_PRAGMA]] -** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] -** file control is sent to the open [sqlite3_file] object corresponding -** to the database file to which the pragma statement refers. ^The argument -** to the [SQLITE_FCNTL_PRAGMA] file control is an array of -** pointers to strings (char**) in which the second element of the array -** is the name of the pragma and the third element is the argument to the -** pragma or NULL if the pragma has no argument. ^The handler for an -** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element -** of the char** argument point to a string obtained from [sqlite3_mprintf()] -** or the equivalent and that string will become the result of the pragma or -** the error message if the pragma fails. ^If the -** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal -** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] -** file control returns [SQLITE_OK], then the parser assumes that the -** VFS has handled the PRAGMA itself and the parser generates a no-op -** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns -** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means -** that the VFS encountered an error while handling the [PRAGMA] and the -** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] -** file control occurs at the beginning of pragma statement analysis and so -** it is able to override built-in [PRAGMA] statements. -** -**
    • [[SQLITE_FCNTL_BUSYHANDLER]] -** ^The [SQLITE_FCNTL_BUSYHANDLER] -** file-control may be invoked by SQLite on the database file handle -** shortly after it is opened in order to provide a custom VFS with access -** to the connections busy-handler callback. The argument is of type (void **) -** - an array of two (void *) values. The first (void *) actually points -** to a function of type (int (*)(void *)). In order to invoke the connections -** busy-handler, this function should be invoked with the second (void *) in -** the array as the only argument. If it returns non-zero, then the operation -** should be retried. If it returns zero, the custom VFS should abandon the -** current operation. -** -**
    • [[SQLITE_FCNTL_TEMPFILENAME]] -** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control -** to have SQLite generate a -** temporary filename using the same algorithm that is followed to generate -** temporary filenames for TEMP tables and other internal uses. The -** argument should be a char** which will be filled with the filename -** written into memory obtained from [sqlite3_malloc()]. The caller should -** invoke [sqlite3_free()] on the result to avoid a memory leak. -** -**
    • [[SQLITE_FCNTL_MMAP_SIZE]] -** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the -** maximum number of bytes that will be used for memory-mapped I/O. -** The argument is a pointer to a value of type sqlite3_int64 that -** is an advisory maximum number of bytes in the file to memory map. The -** pointer is overwritten with the old value. The limit is not changed if -** the value originally pointed to is negative, and so the current limit -** can be queried by passing in a pointer to a negative number. This -** file-control is used internally to implement [PRAGMA mmap_size]. -** -**
    -*/ -#define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 -#define SQLITE_FCNTL_SIZE_HINT 5 -#define SQLITE_FCNTL_CHUNK_SIZE 6 -#define SQLITE_FCNTL_FILE_POINTER 7 -#define SQLITE_FCNTL_SYNC_OMITTED 8 -#define SQLITE_FCNTL_WIN32_AV_RETRY 9 -#define SQLITE_FCNTL_PERSIST_WAL 10 -#define SQLITE_FCNTL_OVERWRITE 11 -#define SQLITE_FCNTL_VFSNAME 12 -#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 -#define SQLITE_FCNTL_PRAGMA 14 -#define SQLITE_FCNTL_BUSYHANDLER 15 -#define SQLITE_FCNTL_TEMPFILENAME 16 -#define SQLITE_FCNTL_MMAP_SIZE 18 - -/* -** CAPI3REF: Mutex Handle -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object -** -** An instance of the sqlite3_vfs object defines the interface between -** the SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". See -** the [VFS | VFS documentation] for further information. -** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered sqlite3_vfs objects are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. Neither the application code nor the VFS -** implementation should use the pNext pointer. -** -** The pNext field is the only field in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** [[sqlite3_vfs.xOpen]] -** ^SQLite guarantees that the zFilename parameter to xOpen -** is either a NULL pointer or string obtained -** from xFullPathname() with an optional suffix added. -** ^If a suffix is added to the zFilename parameter, it will -** consist of a single "-" character followed by no more than -** 11 alphanumeric and/or "-" characters. -** ^SQLite further guarantees that -** the string will be valid and unchanged until xClose() is -** called. Because of the previous sentence, -** the [sqlite3_file] can safely store a pointer to the -** filename if it needs to remember the filename for some reason. -** If the zFilename parameter to xOpen is a NULL pointer then xOpen -** must invent its own temporary name for the file. ^Whenever the -** xFilename parameter is NULL it will also be the case that the -** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. -** -** The flags argument to xOpen() includes all bits set in -** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] -** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. -** -** ^(SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
      -**
    • [SQLITE_OPEN_MAIN_DB] -**
    • [SQLITE_OPEN_MAIN_JOURNAL] -**
    • [SQLITE_OPEN_TEMP_DB] -**
    • [SQLITE_OPEN_TEMP_JOURNAL] -**
    • [SQLITE_OPEN_TRANSIENT_DB] -**
    • [SQLITE_OPEN_SUBJOURNAL] -**
    • [SQLITE_OPEN_MASTER_JOURNAL] -**
    • [SQLITE_OPEN_WAL] -**
    )^ -** -** The file I/O implementation can use the object type flags to -** change the way it deals with files. For example, an application -** that does not care about crash recovery or rollback might make -** the open of a journal file a no-op. Writes to this journal would -** also be no-ops, and any attempt to read the journal would return -** SQLITE_IOERR. Or the implementation might recognize that a database -** file will be doing page-aligned sector reads and writes in a random -** order and set up its I/O subsystem accordingly. -** -** SQLite might also add one of the following flags to the xOpen method: -** -**
      -**
    • [SQLITE_OPEN_DELETEONCLOSE] -**
    • [SQLITE_OPEN_EXCLUSIVE] -**
    -** -** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] -** will be set for TEMP databases and their journals, transient -** databases, and subjournals. -** -** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction -** with the [SQLITE_OPEN_CREATE] flag, which are both directly -** analogous to the O_EXCL and O_CREAT flags of the POSIX open() -** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the -** SQLITE_OPEN_CREATE, is used to indicate that file should always -** be created, and that it is an error if it already exists. -** It is not used to indicate the file should be opened -** for exclusive access. -** -** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third -** argument to xOpen. The xOpen method does not have to -** allocate the structure; it should just fill it in. Note that -** the xOpen method must set the sqlite3_file.pMethods to either -** a valid [sqlite3_io_methods] object or to NULL. xOpen must do -** this even if the open fails. SQLite expects that the sqlite3_file.pMethods -** element will be valid after xOpen returns regardless of the success -** or failure of the xOpen call. -** -** [[sqlite3_vfs.xAccess]] -** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to -** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. -** -** ^SQLite will always allocate at least mxPathname+1 bytes for the -** output buffer xFullPathname. The exact size of the output buffer -** is also passed as a parameter to both methods. If the output buffer -** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is -** handled as a fatal error by SQLite, vfs implementations should endeavor -** to prevent this by setting mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() -** interfaces are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. -** The xSleep() method causes the calling thread to sleep for at -** least the number of microseconds given. ^The xCurrentTime() -** method returns a Julian Day Number for the current date and time as -** a floating point value. -** ^The xCurrentTimeInt64() method returns, as an integer, the Julian -** Day Number multiplied by 86400000 (the number of milliseconds in -** a 24-hour day). -** ^SQLite will use the xCurrentTimeInt64() method to get the current -** date and time if that method is available (if iVersion is 2 or -** greater and the function pointer is not NULL) and will fall back -** to xCurrentTime() if xCurrentTimeInt64() is unavailable. -** -** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces -** are not used by the SQLite core. These optional interfaces are provided -** by some VFSes to facilitate testing of the VFS code. By overriding -** system calls with functions under its control, a test program can -** simulate faults and error conditions that would otherwise be difficult -** or impossible to induce. The set of system calls that can be overridden -** varies from one VFS to another, and from one version of the same VFS to the -** next. Applications that use these interfaces must be prepared for any -** or all of these interfaces to be NULL or for their behavior to change -** from one release to the next. Applications must not attempt to access -** any of these methods if the iVersion of the VFS is less than 3. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -typedef void (*sqlite3_syscall_ptr)(void); -struct sqlite3_vfs -{ - int iVersion; /* Structure version number (currently 3) */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ - int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*); - int (*xGetLastError)(sqlite3_vfs*, int, char *); - /* - ** The methods above are in version 1 of the sqlite_vfs object - ** definition. Those that follow are added in version 2 or later - */ - int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); - /* - ** The methods above are in versions 1 and 2 of the sqlite_vfs object. - ** Those below are for version 3 and greater. - */ - int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); - sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); - const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); - /* - ** The methods above are in versions 1 through 3 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. - */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method -** -** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. They determine -** what kind of permissions the xAccess method is looking for. -** With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks whether the file exists. -** With SQLITE_ACCESS_READWRITE, the xAccess method -** checks whether the named directory is both readable and writable -** (in other words, if files can be added, removed, and renamed within -** the directory). -** The SQLITE_ACCESS_READWRITE constant is currently used only by the -** [temp_store_directory pragma], though this could change in a future -** release of SQLite. -** With SQLITE_ACCESS_READ, the xAccess method -** checks whether the file is readable. The SQLITE_ACCESS_READ constant is -** currently unused, though it might be used in a future release of -** SQLite. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ -#define SQLITE_ACCESS_READ 2 /* Unused */ - -/* -** CAPI3REF: Flags for the xShmLock VFS method -** -** These integer constants define the various locking operations -** allowed by the xShmLock method of [sqlite3_io_methods]. The -** following are the only legal combinations of flags to the -** xShmLock method: -** -**
      -**
    • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED -**
    • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE -**
    • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED -**
    • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE -**
    -** -** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as -** was given no the corresponding lock. -** -** The xShmLock method can transition between unlocked and SHARED or -** between unlocked and EXCLUSIVE. It cannot transition between SHARED -** and EXCLUSIVE. -*/ -#define SQLITE_SHM_UNLOCK 1 -#define SQLITE_SHM_LOCK 2 -#define SQLITE_SHM_SHARED 4 -#define SQLITE_SHM_EXCLUSIVE 8 - -/* -** CAPI3REF: Maximum xShmLock index -** -** The xShmLock method on [sqlite3_io_methods] may use values -** between 0 and this upper bound as its "offset" argument. -** The SQLite core will never attempt to acquire or release a -** lock outside of this range -*/ -#define SQLITE_SHM_NLOCK 8 - - -/* -** CAPI3REF: Initialize The SQLite Library -** -** ^The sqlite3_initialize() routine initializes the -** SQLite library. ^The sqlite3_shutdown() routine -** deallocates any resources that were allocated by sqlite3_initialize(). -** These routines are designed to aid in process initialization and -** shutdown on embedded systems. Workstation applications using -** SQLite normally do not need to invoke either of these routines. -** -** A call to sqlite3_initialize() is an "effective" call if it is -** the first time sqlite3_initialize() is invoked during the lifetime of -** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). ^(Only an effective call -** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops.)^ -** -** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only -** an effective call to sqlite3_shutdown() does any deinitialization. -** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ -** -** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() -** is not. The sqlite3_shutdown() interface must only be called from a -** single thread. All open [database connections] must be closed and all -** other SQLite resources must be deallocated prior to invoking -** sqlite3_shutdown(). -** -** Among other things, ^sqlite3_initialize() will invoke -** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() -** will invoke sqlite3_os_end(). -** -** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** ^If for some reason, sqlite3_initialize() is unable to initialize -** the library (perhaps it is unable to allocate a needed resource such -** as a mutex) it returns an [error code] other than [SQLITE_OK]. -** -** ^The sqlite3_initialize() routine is called internally by many other -** SQLite interfaces so that an application usually does not need to -** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] -** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized -** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] -** compile-time option, then the automatic calls to sqlite3_initialize() -** are omitted and the application must call sqlite3_initialize() directly -** prior to using any other SQLite interface. For maximum portability, -** it is recommended that applications always invoke sqlite3_initialize() -** directly prior to using any other SQLite interface. Future releases -** of SQLite may require this. In other words, the behavior exhibited -** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the -** default behavior in some future release of SQLite. -** -** The sqlite3_os_init() routine does operating-system specific -** initialization of the SQLite library. The sqlite3_os_end() -** routine undoes the effect of sqlite3_os_init(). Typical tasks -** performed by these routines include allocation or deallocation -** of static resources, initialization of global variables, -** setting up a default [sqlite3_vfs] module, or setting up -** a default configuration using [sqlite3_config()]. -** -** The application should never invoke either sqlite3_os_init() -** or sqlite3_os_end() directly. The application should only invoke -** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() -** interface is called automatically by sqlite3_initialize() and -** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate -** implementations for sqlite3_os_init() and sqlite3_os_end() -** are built into SQLite when it is compiled for Unix, Windows, or OS/2. -** When [custom builds | built for other platforms] -** (using the [SQLITE_OS_OTHER=1] compile-time -** option) the application must supply a suitable implementation for -** sqlite3_os_init() and sqlite3_os_end(). An application-supplied -** implementation of sqlite3_os_init() or sqlite3_os_end() -** must return [SQLITE_OK] on success and some other [error code] upon -** failure. -*/ -SQLITE_API int sqlite3_initialize(void); -SQLITE_API int sqlite3_shutdown(void); -SQLITE_API int sqlite3_os_init(void); -SQLITE_API int sqlite3_os_end(void); - -/* -** CAPI3REF: Configuring The SQLite Library -** -** The sqlite3_config() interface is used to make global configuration -** changes to SQLite in order to tune SQLite to the specific needs of -** the application. The default configuration is recommended for most -** applications and so this routine is usually not necessary. It is -** provided to support rare applications with unusual needs. -** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** -** The first argument to sqlite3_config() is an integer -** [configuration option] that determines -** what property of SQLite is to be configured. Subsequent arguments -** vary depending on the [configuration option] -** in the first argument. -** -** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** ^If the option is unknown or SQLite is unable to set the option -** then this routine returns a non-zero [error code]. -*/ -SQLITE_API int sqlite3_config(int, ...); - -/* -** CAPI3REF: Configure database connections -** -** The sqlite3_db_config() interface is used to make configuration -** changes to a [database connection]. The interface is similar to -** [sqlite3_config()] except that the changes apply to a single -** [database connection] (specified in the first argument). -** -** The second argument to sqlite3_db_config(D,V,...) is the -** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code -** that indicates what aspect of the [database connection] is being configured. -** Subsequent arguments vary depending on the configuration verb. -** -** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if -** the call is considered successful. -*/ -SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Memory Allocation Routines -** -** An instance of this object defines the interface between SQLite -** and low-level memory allocation routines. -** -** This object is used in only one place in the SQLite interface. -** A pointer to an instance of this object is the argument to -** [sqlite3_config()] when the configuration option is -** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. -** By creating an instance of this object -** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) -** during configuration, an application can specify an alternative -** memory allocation subsystem for SQLite to use for all of its -** dynamic memory needs. -** -** Note that SQLite comes with several [built-in memory allocators] -** that are perfectly adequate for the overwhelming majority of applications -** and that this object is only useful to a tiny minority of applications -** with specialized memory allocation requirements. This object is -** also used during testing of SQLite in order to specify an alternative -** memory allocator that simulates memory out-of-memory conditions in -** order to verify that SQLite recovers gracefully from such -** conditions. -** -** The xMalloc, xRealloc, and xFree methods must work like the -** malloc(), realloc() and free() functions from the standard C library. -** ^SQLite guarantees that the second argument to -** xRealloc is always a value returned by a prior call to xRoundup. -** -** xSize should return the allocated size of a memory allocation -** previously obtained from xMalloc or xRealloc. The allocated size -** is always at least as big as the requested size but may be larger. -** -** The xRoundup method returns what would be the allocated size of -** a memory allocation given a particular requested size. Most memory -** allocators round up memory allocations at least to the next multiple -** of 8. Some allocators round up to a larger multiple or to a power of 2. -** Every memory allocation request coming in through [sqlite3_malloc()] -** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, -** that causes the corresponding memory allocation to fail. -** -** The xInit method initializes the memory allocator. (For example, -** it might allocate any require mutexes or initialize internal data -** structures. The xShutdown method is invoked (indirectly) by -** [sqlite3_shutdown()] and should deallocate any resources acquired -** by xInit. The pAppData pointer is used as the only parameter to -** xInit and xShutdown. -** -** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. For all other methods, SQLite -** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the -** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which -** it is by default) and so the methods are automatically serialized. -** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other -** methods must be threadsafe or else make their own arrangements for -** serialization. -** -** SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -*/ -typedef struct sqlite3_mem_methods sqlite3_mem_methods; -struct sqlite3_mem_methods -{ - void *(*xMalloc)(int); /* Memory allocation function */ - void (*xFree)(void*); /* Free a prior allocation */ - void *(*xRealloc)(void*,int); /* Resize an allocation */ - int (*xSize)(void*); /* Return the size of an allocation */ - int (*xRoundup)(int); /* Round up request size to allocation size */ - int (*xInit)(void*); /* Initialize the memory allocator */ - void (*xShutdown)(void*); /* Deinitialize the memory allocator */ - void *pAppData; /* Argument to xInit() and xShutdown() */ -}; - -/* -** CAPI3REF: Configuration Options -** KEYWORDS: {configuration option} -** -** These constants are the available integer configuration options that -** can be passed as the first argument to the [sqlite3_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_config()] to make sure that -** the call worked. The [sqlite3_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
    -** [[SQLITE_CONFIG_SINGLETHREAD]]
    SQLITE_CONFIG_SINGLETHREAD
    -**
    There are no arguments to this option. ^This option sets the -** [threading mode] to Single-thread. In other words, it disables -** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to change the [threading mode] from its default -** value of Single-thread and so [sqlite3_config()] will return -** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD -** configuration option.
    -** -** [[SQLITE_CONFIG_MULTITHREAD]]
    SQLITE_CONFIG_MULTITHREAD
    -**
    There are no arguments to this option. ^This option sets the -** [threading mode] to Multi-thread. In other words, it disables -** mutexing on [database connection] and [prepared statement] objects. -** The application is responsible for serializing access to -** [database connections] and [prepared statements]. But other mutexes -** are enabled so that SQLite will be safe to use in a multi-threaded -** environment as long as no two threads attempt to use the same -** [database connection] at the same time. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Multi-thread [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_MULTITHREAD configuration option.
    -** -** [[SQLITE_CONFIG_SERIALIZED]]
    SQLITE_CONFIG_SERIALIZED
    -**
    There are no arguments to this option. ^This option sets the -** [threading mode] to Serialized. In other words, this option enables -** all mutexes including the recursive -** mutexes on [database connection] and [prepared statement] objects. -** In this mode (which is the default when SQLite is compiled with -** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access -** to [database connections] and [prepared statements] so that the -** application is free to use the same [database connection] or the -** same [prepared statement] in different threads at the same time. -** ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Serialized [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_SERIALIZED configuration option.
    -** -** [[SQLITE_CONFIG_MALLOC]]
    SQLITE_CONFIG_MALLOC
    -**
    ^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The argument specifies -** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.)^ ^SQLite makes -** its own private copy of the content of the [sqlite3_mem_methods] structure -** before the [sqlite3_config()] call returns.
    -** -** [[SQLITE_CONFIG_GETMALLOC]]
    SQLITE_CONFIG_GETMALLOC
    -**
    ^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines.)^ -** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
    -** -** [[SQLITE_CONFIG_MEMSTATUS]]
    SQLITE_CONFIG_MEMSTATUS
    -**
    ^This option takes single argument of type int, interpreted as a -** boolean, which enables or disables the collection of memory allocation -** statistics. ^(When memory allocation statistics are disabled, the -** following SQLite interfaces become non-operational: -**
      -**
    • [sqlite3_memory_used()] -**
    • [sqlite3_memory_highwater()] -**
    • [sqlite3_soft_heap_limit64()] -**
    • [sqlite3_status()] -**
    )^ -** ^Memory allocation statistics are enabled by default unless SQLite is -** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory -** allocation statistics are disabled by default. -**
    -** -** [[SQLITE_CONFIG_SCRATCH]]
    SQLITE_CONFIG_SCRATCH
    -**
    ^This option specifies a static memory buffer that SQLite can use for -** scratch memory. There are three arguments: A pointer an 8-byte -** aligned memory buffer from which the scratch allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N). The sz -** argument must be a multiple of 16. -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will use no more than two scratch buffers per thread. So -** N should be set to twice the expected maximum number of threads. -** ^SQLite will never require a scratch buffer that is more than 6 -** times the database page size. ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.
    -** -** [[SQLITE_CONFIG_PAGECACHE]]
    SQLITE_CONFIG_PAGECACHE
    -**
    ^This option specifies a static memory buffer that SQLite can use for -** the database page cache with the default page cache implementation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option. -** There are three arguments to this option: A pointer to 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). -** The sz argument should be the size of the largest database page -** (a power of two between 512 and 32768) plus a little extra for each -** page header. ^The page header size is 20 to 40 bytes depending on -** the host architecture. ^It is harmless, apart from the wasted memory, -** to make sz a little too large. The first -** argument should point to an allocation of at least sz*N bytes of memory. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The pointer in the first argument must -** be aligned to an 8-byte boundary or subsequent behavior of SQLite -** will be undefined.
    -** -** [[SQLITE_CONFIG_HEAP]]
    SQLITE_CONFIG_HEAP
    -**
    ^This option specifies a static memory buffer that SQLite will use -** for all of its dynamic memory allocation needs beyond those provided -** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. -** There are three arguments: An 8-byte aligned pointer to the memory, -** the number of bytes in the memory buffer, and the minimum allocation size. -** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts -** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the -** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or -** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory -** allocator is engaged to handle all of SQLites memory allocation needs. -** The first pointer (the memory pointer) must be aligned to an 8-byte -** boundary or subsequent behavior of SQLite will be undefined. -** The minimum allocation size is capped at 2**12. Reasonable values -** for the minimum allocation size are 2**5 through 2**8.
    -** -** [[SQLITE_CONFIG_MUTEX]]
    SQLITE_CONFIG_MUTEX
    -**
    ^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The argument specifies -** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the -** content of the [sqlite3_mutex_methods] structure before the call to -** [sqlite3_config()] returns. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will -** return [SQLITE_ERROR].
    -** -** [[SQLITE_CONFIG_GETMUTEX]]
    SQLITE_CONFIG_GETMUTEX
    -**
    ^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The -** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines.)^ -** This option can be used to overload the default mutex allocation -** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will -** return [SQLITE_ERROR].
    -** -** [[SQLITE_CONFIG_LOOKASIDE]]
    SQLITE_CONFIG_LOOKASIDE
    -**
    ^(This option takes two arguments that determine the default -** memory allocation for the lookaside memory allocator on each -** [database connection]. The first argument is the -** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection.)^ ^(This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] -** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.)^
    -** -** [[SQLITE_CONFIG_PCACHE2]]
    SQLITE_CONFIG_PCACHE2
    -**
    ^(This option takes a single argument which is a pointer to -** an [sqlite3_pcache_methods2] object. This object specifies the interface -** to a custom page cache implementation.)^ ^SQLite makes a copy of the -** object and uses it for page cache memory allocations.
    -** -** [[SQLITE_CONFIG_GETPCACHE2]]
    SQLITE_CONFIG_GETPCACHE2
    -**
    ^(This option takes a single argument which is a pointer to an -** [sqlite3_pcache_methods2] object. SQLite copies of the current -** page cache implementation into that object.)^
    -** -** [[SQLITE_CONFIG_LOG]]
    SQLITE_CONFIG_LOG
    -**
    The SQLITE_CONFIG_LOG option is used to configure the SQLite -** global [error log]. -** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a -** function with a call signature of void(*)(void*,int,const char*), -** and a pointer to void. ^If the function pointer is not NULL, it is -** invoked by [sqlite3_log()] to process each logging event. ^If the -** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. -** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is -** passed through as the first parameter to the application-defined logger -** function whenever that function is invoked. ^The second parameter to -** the logger function is a copy of the first parameter to the corresponding -** [sqlite3_log()] call and is intended to be a [result code] or an -** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. -** The SQLite logging interface is not reentrant; the logger function -** supplied by the application must not invoke any SQLite interface. -** In a multi-threaded application, the application-defined logger -** function must be threadsafe.
    -** -** [[SQLITE_CONFIG_URI]]
    SQLITE_CONFIG_URI -**
    ^(This option takes a single argument of type int. If non-zero, then -** URI handling is globally enabled. If the parameter is zero, then URI handling -** is globally disabled.)^ ^If URI handling is globally enabled, all filenames -** passed to [sqlite3_open()], [sqlite3_open_v2()], [sqlite3_open16()] or -** specified as part of [ATTACH] commands are interpreted as URIs, regardless -** of whether or not the [SQLITE_OPEN_URI] flag is set when the database -** connection is opened. ^If it is globally disabled, filenames are -** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the -** database connection is opened. ^(By default, URI handling is globally -** disabled. The default value may be changed by compiling with the -** [SQLITE_USE_URI] symbol defined.)^ -** -** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
    SQLITE_CONFIG_COVERING_INDEX_SCAN -**
    ^This option takes a single integer argument which is interpreted as -** a boolean in order to enable or disable the use of covering indices for -** full table scans in the query optimizer. ^The default setting is determined -** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" -** if that compile-time option is omitted. -** The ability to disable the use of covering indices for full table scans -** is because some incorrectly coded legacy applications might malfunction -** when the optimization is enabled. Providing the ability to -** disable the optimization allows the older, buggy application code to work -** without change even with newer versions of SQLite. -** -** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] -**
    SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE -**
    These options are obsolete and should not be used by new code. -** They are retained for backwards compatibility but are now no-ops. -**
    -** -** [[SQLITE_CONFIG_SQLLOG]] -**
    SQLITE_CONFIG_SQLLOG -**
    This option is only available if sqlite is compiled with the -** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should -** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). -** The second should be of type (void*). The callback is invoked by the library -** in three separate circumstances, identified by the value passed as the -** fourth parameter. If the fourth parameter is 0, then the database connection -** passed as the second argument has just been opened. The third argument -** points to a buffer containing the name of the main database file. If the -** fourth parameter is 1, then the SQL statement that the third parameter -** points to has just been executed. Or, if the fourth parameter is 2, then -** the connection being passed as the second parameter is being closed. The -** third parameter is passed NULL In this case. An example of using this -** configuration option can be seen in the "test_sqllog.c" source file in -** the canonical SQLite source tree.
    -** -** [[SQLITE_CONFIG_MMAP_SIZE]] -**
    SQLITE_CONFIG_MMAP_SIZE -**
    ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values -** that are the default mmap size limit (the default setting for -** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. -** ^The default setting can be overridden by each database connection using -** either the [PRAGMA mmap_size] command, or by using the -** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size -** cannot be changed at run-time. Nor may the maximum allowed mmap size -** exceed the compile-time maximum mmap size set by the -** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ -** ^If either argument to this option is negative, then that argument is -** changed to its compile-time default. -**
    -*/ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* no-op */ -#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ -#define SQLITE_CONFIG_URI 17 /* int */ -#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ -#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ -#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ - -/* -** CAPI3REF: Database Connection Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. ^The [sqlite3_db_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
    -**
    SQLITE_DBCONFIG_LOOKASIDE
    -**
    ^This option takes three additional arguments that determine the -** [lookaside memory allocator] configuration for the [database connection]. -** ^The first argument (the third parameter to [sqlite3_db_config()] is a -** pointer to a memory buffer to use for lookaside memory. -** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb -** may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the -** size of each lookaside buffer slot. ^The third argument is the number of -** slots. The size of the buffer in the first argument must be greater than -** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. ^If the second argument to -** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally -** rounded down to the next smaller multiple of 8. ^(The lookaside memory -** configuration for a database connection can only be changed when that -** connection is not currently using lookaside memory, or in other words -** when the "current value" returned by -** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. -** Any attempt to change the lookaside memory configuration when lookaside -** memory is in use leaves the configuration unchanged and returns -** [SQLITE_BUSY].)^
    -** -**
    SQLITE_DBCONFIG_ENABLE_FKEY
    -**
    ^This option is used to enable or disable the enforcement of -** [foreign key constraints]. There should be two additional arguments. -** The first argument is an integer which is 0 to disable FK enforcement, -** positive to enable FK enforcement or negative to leave FK enforcement -** unchanged. The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether FK enforcement is off or on -** following this call. The second parameter may be a NULL pointer, in -** which case the FK enforcement setting is not reported back.
    -** -**
    SQLITE_DBCONFIG_ENABLE_TRIGGER
    -**
    ^This option is used to enable or disable [CREATE TRIGGER | triggers]. -** There should be two additional arguments. -** The first argument is an integer which is 0 to disable triggers, -** positive to enable triggers or negative to leave the setting unchanged. -** The second parameter is a pointer to an integer into which -** is written 0 or 1 to indicate whether triggers are disabled or enabled -** following this call. The second parameter may be a NULL pointer, in -** which case the trigger setting is not reported back.
    -** -**
    -*/ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ -#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ -#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ - - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes -** -** ^The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. ^The extended result -** codes are disabled by default for historical compatibility. -*/ -SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid -** -** ^Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. ^The rowid is always available -** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. ^If -** the table has a column of type [INTEGER PRIMARY KEY] then that column -** is another alias for the rowid. -** -** ^This routine returns the [rowid] of the most recent -** successful [INSERT] into the database from the [database connection] -** in the first argument. ^As of SQLite version 3.7.7, this routines -** records the last insert rowid of both ordinary tables and [virtual tables]. -** ^If no successful [INSERT]s -** have ever occurred on that database connection, zero is returned. -** -** ^(If an [INSERT] occurs within a trigger or within a [virtual table] -** method, then this routine will return the [rowid] of the inserted -** row as long as the trigger or virtual table method is running. -** But once the trigger or virtual table method ends, the value returned -** by this routine reverts to what it was before the trigger or virtual -** table method began.)^ -** -** ^An [INSERT] that fails due to a constraint violation is not a -** successful [INSERT] and does not change the value returned by this -** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, -** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. ^(When INSERT OR REPLACE -** encounters a constraint violation, it does not fail. The -** INSERT continues to completion after deleting rows that caused -** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface.)^ -** -** ^For the purposes of this routine, an [INSERT] is considered to -** be successful even if it is subsequently rolled back. -** -** This function is accessible to SQL statements via the -** [last_insert_rowid() SQL function]. -** -** If a separate thread performs a new [INSERT] on the same -** database connection while the [sqlite3_last_insert_rowid()] -** function is running and thus changes the last insert [rowid], -** then the value returned by [sqlite3_last_insert_rowid()] is -** unpredictable and might not equal either the old or the new -** last insert [rowid]. -*/ -SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified -** -** ^This function returns the number of database rows that were changed -** or inserted or deleted by the most recently completed SQL statement -** on the [database connection] specified by the first parameter. -** ^(Only changes that are directly specified by the [INSERT], [UPDATE], -** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted.)^ Use the -** [sqlite3_total_changes()] function to find the total number of changes -** including changes caused by triggers and foreign key actions. -** -** ^Changes to a view that are simulated by an [INSTEAD OF trigger] -** are not counted. Only real table changes are counted. -** -** ^(A "row change" is a change to a single row of a single table -** caused by an INSERT, DELETE, or UPDATE statement. Rows that -** are changed as side effects of [REPLACE] constraint resolution, -** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes.)^ -** -** A "trigger context" is a scope of execution that begins and -** ends with the script of a [CREATE TRIGGER | trigger]. -** Most SQL statements are -** evaluated outside of any trigger. This is the "top level" -** trigger context. If a trigger fires from the top level, a -** new trigger context is entered for the duration of that one -** trigger. Subtriggers create subcontexts for their duration. -** -** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does -** not create a new trigger context. -** -** ^This function returns the number of direct row changes in the -** most recent INSERT, UPDATE, or DELETE statement within the same -** trigger context. -** -** ^Thus, when called from the top level, this function returns the -** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. ^(Within the body of a trigger, -** the sqlite3_changes() interface can be called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the same trigger. -** However, the number returned does not include changes -** caused by subtriggers since those have their own context.)^ -** -** See also the [sqlite3_total_changes()] interface, the -** [count_changes pragma], and the [changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_changes()] is running then the value returned -** is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified -** -** ^This function returns the number of row changes caused by [INSERT], -** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** ^(The count returned by sqlite3_total_changes() includes all changes -** from all [CREATE TRIGGER | trigger] contexts and changes made by -** [foreign key actions]. However, -** the count does not include changes used to implement [REPLACE] constraints, -** do rollbacks or ABORT processing, or [DROP TABLE] processing. The -** count does not include rows of views that fire an [INSTEAD OF trigger], -** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted.)^ -** ^The sqlite3_total_changes() function counts the changes as soon as -** the statement that makes them is completed (when the statement handle -** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface, the -** [count_changes pragma], and the [total_changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_total_changes()] is running then the value -** returned is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query -** -** ^This function causes any pending database operation to abort and -** return at its earliest opportunity. This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** ^It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. But it -** is not safe to call this routine with a [database connection] that -** is closed or might close before sqlite3_interrupt() returns. -** -** ^If an SQL operation is very nearly finished at the time when -** sqlite3_interrupt() is called, then it might not have an opportunity -** to be interrupted and might continue to completion. -** -** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE -** that is inside an explicit transaction, then the entire transaction -** will be rolled back automatically. -** -** ^The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. ^Any new SQL statements -** that are started after the sqlite3_interrupt() call and before the -** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. ^New SQL statements -** that are started after the running statement count reaches zero are -** not effected by the sqlite3_interrupt(). -** ^A call to sqlite3_interrupt(D) that occurs when there are no running -** SQL statements is a no-op and has no effect on SQL statements -** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. -*/ -SQLITE_API void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete -** -** These routines are useful during command-line input to determine if the -** currently entered text seems to form a complete SQL statement or -** if additional input is needed before sending the text into -** SQLite for parsing. ^These routines return 1 if the input string -** appears to be a complete SQL statement. ^A statement is judged to be -** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within -** string literals or quoted identifier names or comments are not -** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. ^Whitespace -** and comments that follow the final semicolon are ignored. -** -** ^These routines return 0 if the statement is incomplete. ^If a -** memory allocation fails, then SQLITE_NOMEM is returned. -** -** ^These routines do not parse the SQL statements thus -** will not detect syntactically incorrect SQL. -** -** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior -** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked -** automatically by sqlite3_complete16(). If that initialization fails, -** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete.)^ -** -** The input to [sqlite3_complete()] must be a zero-terminated -** UTF-8 string. -** -** The input to [sqlite3_complete16()] must be a zero-terminated -** UTF-16 string in native byte order. -*/ -SQLITE_API int sqlite3_complete(const char *sql); -SQLITE_API int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors -** -** ^This routine sets a callback function that might be invoked whenever -** an attempt is made to open a database table that another thread -** or process has locked. -** -** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. ^If the busy callback -** is not NULL, then the callback might be invoked with two arguments. -** -** ^The first argument to the busy handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). ^The second argument to -** the busy handler callback is the number of times that the busy handler has -** been invoked for this locking event. ^If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** ^If the callback returns non-zero, then another attempt -** is made to open the database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. ^If SQLite determines that invoking the busy -** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] -** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** ^The default busy callback is NULL. -** -** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] -** when SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. ^If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion -** forces an automatic rollback of the changes. See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** ^(There can only be a single busy handler defined for each -** [database connection]. Setting a new busy handler clears any -** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] -** will also set or clear the busy handler. -** -** The busy callback should not take any actions which modify the -** database connection that invoked the busy handler. Any such actions -** result in undefined behavior. -** -** A busy handler must not close the database connection -** or [prepared statement] that invoked the busy handler. -*/ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout -** -** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. ^The handler -** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. ^After at least "ms" milliseconds of sleeping, -** the handler returns 0 which causes [sqlite3_step()] to return -** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** ^Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** ^(There can only be a single busy handler for a particular -** [database connection] any any given moment. If another busy handler -** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared.)^ -*/ -SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries -** -** This is a legacy interface that is preserved for backwards compatibility. -** Use of this interface is not recommended. -** -** Definition: A result table is memory data structure created by the -** [sqlite3_get_table()] interface. A result table records the -** complete query results from one or more queries. -** -** The table conceptually has a number of rows and columns. But -** these numbers are not part of the result table itself. These -** numbers are obtained separately. Let N be the number of rows -** and M be the number of columns. -** -** A result table is an array of pointers to zero-terminated UTF-8 strings. -** There are (N+1)*M elements in the array. The first M pointers point -** to zero-terminated strings that contain the names of the columns. -** The remaining entries all point to query results. NULL values result -** in NULL pointers. All other values are in their UTF-8 zero-terminated -** string representation as returned by [sqlite3_column_text()]. -** -** A result table might consist of one or more memory allocations. -** It is not safe to pass a result table directly to [sqlite3_free()]. -** A result table should be deallocated using [sqlite3_free_table()]. -** -** ^(As an example of the result table format, suppose a query result -** is as follows: -** -**
    -**        Name        | Age
    -**        -----------------------
    -**        Alice       | 43
    -**        Bob         | 28
    -**        Cindy       | 21
    -** 
    -** -** There are two column (M==2) and three rows (N==3). Thus the -** result table has 8 entries. Suppose the result table is stored -** in an array names azResult. Then azResult holds this content: -** -**
    -**        azResult[0] = "Name";
    -**        azResult[1] = "Age";
    -**        azResult[2] = "Alice";
    -**        azResult[3] = "43";
    -**        azResult[4] = "Bob";
    -**        azResult[5] = "28";
    -**        azResult[6] = "Cindy";
    -**        azResult[7] = "21";
    -** 
    )^ -** -** ^The sqlite3_get_table() function evaluates one or more -** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter and returns a result table to the -** pointer given in its 3rd parameter. -** -** After the application has finished with the result from sqlite3_get_table(), -** it must pass the result table pointer to sqlite3_free_table() in order to -** release the memory that was malloced. Because of the way the -** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling -** function must not try to call [sqlite3_free()] directly. Only -** [sqlite3_free_table()] is able to release the memory properly and safely. -** -** The sqlite3_get_table() interface is implemented as a wrapper around -** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access -** to any internal data structures of SQLite. It uses only the public -** interface defined here. As a consequence, errors that occur in the -** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or -** [sqlite3_errmsg()]. -*/ -SQLITE_API int sqlite3_get_table( - sqlite3 *db, /* An open database */ - const char *zSql, /* SQL to be evaluated */ - char ***pazResult, /* Results of the query */ - int *pnRow, /* Number of result rows written here */ - int *pnColumn, /* Number of result columns written here */ - char **pzErrmsg /* Error msg written here */ -); -SQLITE_API void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions -** -** These routines are work-alikes of the "printf()" family of functions -** from the standard C library. -** -** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** The strings returned by these two routines should be -** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf().)^ This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. ^(Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer.)^ We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** ^As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. ^The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. So the longest string that can be completely -** written will be n-1 characters. -** -** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a nul-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -**
    -**  char *zText = "It's a happy day!";
    -** 
    -** -** One can use this text in an SQL statement as follows: -** -**
    -**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
    -**  sqlite3_exec(db, zSQL, 0, 0, 0);
    -**  sqlite3_free(zSQL);
    -** 
    -** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
    -**  INSERT INTO table1 VALUES('It''s a happy day!')
    -** 
    -** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
    -**  INSERT INTO table1 VALUES('It's a happy day!');
    -** 
    -** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -**
    -**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
    -**  sqlite3_exec(db, zSQL, 0, 0, 0);
    -**  sqlite3_free(zSQL);
    -** 
    -** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ -*/ -SQLITE_API char *sqlite3_mprintf(const char*,...); -SQLITE_API char *sqlite3_vmprintf(const char*, va_list); -SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); -SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); - -/* -** CAPI3REF: Memory Allocation Subsystem -** -** The SQLite core uses these three routines for all of its own -** internal memory allocation needs. "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The -** Windows VFS uses native malloc() and free() for some operations. -** -** ^The sqlite3_malloc() routine returns a pointer to a block -** of memory at least N bytes in length, where N is the parameter. -** ^If sqlite3_malloc() is unable to obtain sufficient free -** memory, it returns a NULL pointer. ^If the parameter N to -** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns -** a NULL pointer. -** -** ^Calling sqlite3_free() with a pointer previously returned -** by sqlite3_malloc() or sqlite3_realloc() releases that memory so -** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer -** to sqlite3_free() is harmless. After being freed, memory -** should neither be read nor written. Even reading previously freed -** memory might result in a segmentation fault or other severe error. -** Memory corruption, a segmentation fault, or other severe error -** might result if sqlite3_free() is called with a non-NULL pointer that -** was not obtained from sqlite3_malloc() or sqlite3_realloc(). -** -** ^(The sqlite3_realloc() interface attempts to resize a -** prior memory allocation to be at least N bytes, where N is the -** second parameter. The memory allocation to be resized is the first -** parameter.)^ ^ If the first parameter to sqlite3_realloc() -** is a NULL pointer then its behavior is identical to calling -** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). -** ^If the second parameter to sqlite3_realloc() is zero or -** negative then the behavior is exactly the same as calling -** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). -** ^sqlite3_realloc() returns a pointer to a memory allocation -** of at least N bytes in size or NULL if sufficient memory is unavailable. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned -** by sqlite3_realloc() and the prior allocation is freed. -** ^If sqlite3_realloc() returns NULL, then the prior allocation -** is not freed. -** -** ^The memory returned by sqlite3_malloc() and sqlite3_realloc() -** is always aligned to at least an 8 byte boundary, or to a -** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time -** option is used. -** -** In SQLite version 3.5.0 and 3.5.1, it was possible to define -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in -** implementation of these routines to be omitted. That capability -** is no longer provided. Only built-in memory allocators can be used. -** -** Prior to SQLite version 3.7.10, the Windows OS interface layer called -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular Windows -** installation. Memory allocation errors were detected, but -** they were reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -** -** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] -** must be either NULL or else pointers obtained from a prior -** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have -** not yet been released. -** -** The application must not read or write any part of -** a block of memory after it has been released using -** [sqlite3_free()] or [sqlite3_realloc()]. -*/ -SQLITE_API void *sqlite3_malloc(int); -SQLITE_API void *sqlite3_realloc(void*, int); -SQLITE_API void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics -** -** SQLite provides these two interfaces for reporting on the status -** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] -** routines, which form the built-in memory allocation subsystem. -** -** ^The [sqlite3_memory_used()] routine returns the number of bytes -** of memory currently outstanding (malloced but not freed). -** ^The [sqlite3_memory_highwater()] routine returns the maximum -** value of [sqlite3_memory_used()] since the high-water mark -** was last reset. ^The values returned by [sqlite3_memory_used()] and -** [sqlite3_memory_highwater()] include any overhead -** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library -** routines that [sqlite3_malloc()] may call. -** -** ^The memory high-water mark is reset to the current value of -** [sqlite3_memory_used()] if and only if the parameter to -** [sqlite3_memory_highwater()] is true. ^The value returned -** by [sqlite3_memory_highwater(1)] is the high-water mark -** prior to the reset. -*/ -SQLITE_API sqlite3_int64 sqlite3_memory_used(void); -SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Pseudo-Random Number Generator -** -** SQLite contains a high-quality pseudo-random number generator (PRNG) used to -** select random [ROWID | ROWIDs] when inserting new records into a table that -** already uses the largest possible [ROWID]. The PRNG is also used for -** the build-in random() and randomblob() SQL functions. This interface allows -** applications to access the same PRNG for other purposes. -** -** ^A call to this routine stores N bytes of randomness into buffer P. -** -** ^The first time this routine is invoked (either internally or by -** the application) the PRNG is seeded using randomness obtained -** from the xRandomness method of the default [sqlite3_vfs] object. -** ^On all subsequent invocations, the pseudo-randomness is generated -** internally and without recourse to the [sqlite3_vfs] xRandomness -** method. -*/ -SQLITE_API void sqlite3_randomness(int N, void *P); - -/* -** CAPI3REF: Compile-Time Authorization Callbacks -** -** ^This routine registers an authorizer callback with a particular -** [database connection], supplied in the first argument. -** ^The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. ^The authorizer callback should -** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. ^If the authorizer callback returns -** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] -** then the [sqlite3_prepare_v2()] or equivalent call that triggered -** the authorizer will fail with an error message. -** -** When the callback returns [SQLITE_OK], that means the operation -** requested is ok. ^When the callback returns [SQLITE_DENY], the -** [sqlite3_prepare_v2()] or equivalent call that triggered the -** authorizer will fail with an error message explaining that -** access is denied. -** -** ^The first parameter to the authorizer callback is a copy of the third -** parameter to the sqlite3_set_authorizer() interface. ^The second parameter -** to the callback is an integer [SQLITE_COPY | action code] that specifies -** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. -** -** ^If the action code is [SQLITE_READ] -** and the callback returns [SQLITE_IGNORE] then the -** [prepared statement] statement is constructed to substitute -** a NULL value in place of the table column that would have -** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] -** return can be used to deny an untrusted user access to individual -** columns of a table. -** ^If the action code is [SQLITE_DELETE] and the callback returns -** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the -** [truncate optimization] is disabled and all rows are deleted individually. -** -** An authorizer is used when [sqlite3_prepare | preparing] -** SQL statements from an untrusted source, to ensure that the SQL statements -** do not try to access data they are not allowed to see, or that they do not -** try to execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being [sqlite3_prepare | prepared] that -** disallows everything except [SELECT] statements. -** -** Applications that need to process SQL from untrusted sources -** might also consider lowering resource limits using [sqlite3_limit()] -** and limiting database size using the [max_page_count] [PRAGMA] -** in addition to using an authorizer. -** -** ^(Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call.)^ ^Disable the authorizer by installing a NULL callback. -** The authorizer is disabled by default. -** -** The authorizer callback must not do anything that will modify -** the database connection that invoked the authorizer callback. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the -** statement might be re-prepared during [sqlite3_step()] due to a -** schema change. Hence, the application should ensure that the -** correct authorizer callback remains in place during the [sqlite3_step()]. -** -** ^Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. Authorization is not -** performed during statement evaluation in [sqlite3_step()], unless -** as stated in the previous paragraph, sqlite3_step() invokes -** sqlite3_prepare_v2() to reprepare a statement after a schema change. -*/ -SQLITE_API int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -** -** Note that SQLITE_IGNORE is also used as a [SQLITE_ROLLBACK | return code] -** from the [sqlite3_vtab_on_conflict()] interface. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorize certain SQL statement actions. The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. -** -** These action code values signify what kind of operation is to be -** authorized. The 3rd and 4th parameters to the authorization -** callback function will be parameters or NULL depending on which of these -** codes is used as the second parameter. ^(The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* Operation NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* NULL Function Name */ -#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** -** ^The callback function registered by sqlite3_trace() is invoked at -** various times when an SQL statement is being run by [sqlite3_step()]. -** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the -** SQL statement text as the statement first begins executing. -** ^(Additional sqlite3_trace() callbacks might occur -** as each triggered subprogram is entered. The callbacks for triggers -** contain a UTF-8 SQL comment that identifies the trigger.)^ -** -** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit -** the length of [bound parameter] expansion in the output of sqlite3_trace(). -** -** ^The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes. ^The profile callback contains -** the original statement text and an estimate of wall-clock time -** of how long that statement took to run. ^The profile callback -** time is in units of nanoseconds, however the current implementation -** is only capable of millisecond resolution so the six least significant -** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. -*/ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks -** -** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback -** function X to be invoked periodically during long running calls to -** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for -** database connection D. An example use for this -** interface is to keep a GUI updated during a large query. -** -** ^The parameter P is passed through as the only parameter to the -** callback function X. ^The parameter N is the approximate number of -** [virtual machine instructions] that are evaluated between successive -** invocations of the callback X. ^If N is less than one then the progress -** handler is disabled. -** -** ^Only a single progress handler may be defined at one time per -** [database connection]; setting a new progress handler cancels the -** old one. ^Setting parameter X to NULL disables the progress handler. -** ^The progress handler is also disabled by setting N to a value less -** than 1. -** -** ^If the progress callback returns non-zero, the operation is -** interrupted. This feature can be used to implement a -** "Cancel" button on a GUI progress dialog box. -** -** The progress handler callback must not do anything that will modify -** the database connection that invoked the progress handler. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -*/ -SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection -** -** ^These routines open an SQLite database file as specified by the -** filename argument. ^The filename argument is interpreted as UTF-8 for -** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte -** order for sqlite3_open16(). ^(A [database connection] handle is usually -** returned in *ppDb, even if an error occurs. The only exception is that -** if SQLite is unable to allocate memory to hold the [sqlite3] object, -** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] -** object.)^ ^(If the database is opened (and/or created) successfully, then -** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error following a failure of any -** of the sqlite3_open() routines. -** -** ^The default encoding for the database will be UTF-8 if -** sqlite3_open() or sqlite3_open_v2() is called and -** UTF-16 in the native byte order if sqlite3_open16() is used. -** -** Whether or not an error occurs when it is opened, resources -** associated with the [database connection] handle should be released by -** passing it to [sqlite3_close()] when it is no longer required. -** -** The sqlite3_open_v2() interface works like sqlite3_open() -** except that it accepts two additional parameters for additional control -** over the new database connection. ^(The flags parameter to -** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ -** -**
    -** ^(
    [SQLITE_OPEN_READONLY]
    -**
    The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
    )^ -** -** ^(
    [SQLITE_OPEN_READWRITE]
    -**
    The database is opened for reading and writing if possible, or reading -** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
    )^ -** -** ^(
    [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
    -**
    The database is opened for reading and writing, and is created if -** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
    )^ -**
    -** -** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above optionally combined with other -** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] -** then the behavior is undefined. -** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** -** ^The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. ^If the fourth parameter is -** a NULL pointer then the default [sqlite3_vfs] object is used. -** -** ^If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. ^This in-memory database will vanish when -** the database connection is closed. Future versions of SQLite might -** make use of additional special filenames that begin with the ":" character. -** It is recommended that when a database filename actually does begin with -** a ":" character you should prefix the filename with a pathname such as -** "./" to avoid ambiguity. -** -** ^If the filename is an empty string, then a private, temporary -** on-disk database will be created. ^This private database will be -** automatically deleted as soon as the database connection is closed. -** -** [[URI filenames in sqlite3_open()]]

    URI Filenames

    -** -** ^If [URI filename] interpretation is enabled, and the filename argument -** begins with "file:", then the filename is interpreted as a URI. ^URI -** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is -** set in the fourth argument to sqlite3_open_v2(), or if it has -** been enabled globally using the [SQLITE_CONFIG_URI] option with the -** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. -** As of SQLite version 3.7.7, URI filename interpretation is turned off -** by default, but future releases of SQLite might enable URI filename -** interpretation by default. See "[URI filenames]" for additional -** information. -** -** URI filenames are parsed according to RFC 3986. ^If the URI contains an -** authority, then it must be either an empty string or the string -** "localhost". ^If the authority is not an empty string or "localhost", an -** error is returned to the caller. ^The fragment component of a URI, if -** present, is ignored. -** -** ^SQLite uses the path component of the URI as the name of the disk file -** which contains the database. ^If the path begins with a '/' character, -** then it is interpreted as an absolute path. ^If the path does not begin -** with a '/' (meaning that the authority section is omitted from the URI) -** then the path is interpreted as a relative path. -** ^On windows, the first component of an absolute path -** is a drive specification (e.g. "C:"). -** -** [[core URI query parameters]] -** The query component of a URI may contain parameters that are interpreted -** either by SQLite itself, or by a [VFS | custom VFS implementation]. -** SQLite interprets the following three query parameters: -** -**
      -**
    • vfs: ^The "vfs" parameter may be used to specify the name of -** a VFS object that provides the operating system interface that should -** be used to access the database file on disk. ^If this option is set to -** an empty string the default VFS object is used. ^Specifying an unknown -** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is -** present, then the VFS specified by the option takes precedence over -** the value passed as the fourth parameter to sqlite3_open_v2(). -** -**
    • mode: ^(The mode parameter may be set to either "ro", "rw", -** "rwc", or "memory". Attempting to set it to any other value is -** an error)^. -** ^If "ro" is specified, then the database is opened for read-only -** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the -** third argument to sqlite3_open_v2(). ^If the mode option is set to -** "rw", then the database is opened for read-write (but not create) -** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had -** been set. ^Value "rwc" is equivalent to setting both -** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is -** set to "memory" then a pure [in-memory database] that never reads -** or writes from disk is used. ^It is an error to specify a value for -** the mode parameter that is less restrictive than that specified by -** the flags passed in the third parameter to sqlite3_open_v2(). -** -**
    • cache: ^The cache parameter may be set to either "shared" or -** "private". ^Setting it to "shared" is equivalent to setting the -** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to -** sqlite3_open_v2(). ^Setting the cache parameter to "private" is -** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. -** ^If sqlite3_open_v2() is used and the "cache" parameter is present in -** a URI filename, its value overrides any behavior requested by setting -** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. -**
    -** -** ^Specifying an unknown parameter in the query component of a URI is not an -** error. Future versions of SQLite might understand additional query -** parameters. See "[query parameters with special meaning to SQLite]" for -** additional information. -** -** [[URI filename examples]]

    URI filename examples

    -** -** -**
    URI filenames Results -**
    file:data.db -** Open the file "data.db" in the current directory. -**
    file:/home/fred/data.db
    -** file:///home/fred/data.db
    -** file://localhost/home/fred/data.db
    -** Open the database file "/home/fred/data.db". -**
    file://darkstar/home/fred/data.db -** An error. "darkstar" is not a recognized authority. -**
    -** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db -** Windows only: Open the file "data.db" on fred's desktop on drive -** C:. Note that the %20 escaping in this example is not strictly -** necessary - space characters can be used literally -** in URI filenames. -**
    file:data.db?mode=ro&cache=private -** Open file "data.db" in the current directory for read-only access. -** Regardless of whether or not shared-cache mode is enabled by -** default, use a private cache. -**
    file:/home/fred/data.db?vfs=unix-nolock -** Open file "/home/fred/data.db". Use the special VFS "unix-nolock". -**
    file:data.db?mode=readonly -** An error. "readonly" is not a valid option for the "mode" parameter. -**
    -** -** ^URI hexadecimal escape sequences (%HH) are supported within the path and -** query components of a URI. A hexadecimal escape sequence consists of a -** percent sign - "%" - followed by exactly two hexadecimal digits -** specifying an octet value. ^Before the path or query components of a -** URI filename are interpreted, they are encoded using UTF-8 and all -** hexadecimal escape sequences replaced by a single byte containing the -** corresponding octet. If this process generates an invalid UTF-8 encoding, -** the results are undefined. -** -** Note to Windows users: The encoding used for the filename argument -** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** sqlite3_open() or sqlite3_open_v2(). -** -** Note to Windows Runtime users: The temporary directory must be set -** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various -** features that require the use of temporary files may fail. -** -** See also: [sqlite3_temp_directory] -*/ -SQLITE_API int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Obtain Values For URI Parameters -** -** These are utility routines, useful to VFS implementations, that check -** to see if a database file was a URI that contained a specific query -** parameter, and if so obtains the value of that query parameter. -** -** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation when the flags parameter to xOpen() has one or -** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and -** P is the name of the query parameter, then -** sqlite3_uri_parameter(F,P) returns the value of the P -** parameter if it exists or a NULL pointer if P does not appear as a -** query parameter on F. If P is a query parameter of F -** has no explicit value, then sqlite3_uri_parameter(F,P) returns -** a pointer to an empty string. -** -** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean -** parameter and returns true (1) or false (0) according to the value -** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the -** value of query parameter P is one of "yes", "true", or "on" in any -** case or if the value begins with a non-zero number. The -** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of -** query parameter P is one of "no", "false", or "off" in any case or -** if the value begins with a numeric zero. If P is not a query -** parameter on F or if the value of P is does not match any of the -** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). -** -** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a -** 64-bit signed integer and returns that integer, or D if P does not -** exist. If the value of P is something other than an integer, then -** zero is returned. -** -** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and -** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and -** is not a database file pathname pointer that SQLite passed into the xOpen -** VFS method, then the behavior of this routine is undefined and probably -** undesirable. -*/ -SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); -SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); -SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); - - -/* -** CAPI3REF: Error Codes And Messages -** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() -** interface is the same except that it always returns the -** [extended result code] even when extended result codes are -** disabled. -** -** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. -** ^(Memory to hold the error message string is managed internally. -** The application does not need to worry about freeing the result. -** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions.)^ -** -** ^The sqlite3_errstr() interface returns the English-language text -** that describes the [result code], as UTF-8. -** ^(Memory to hold the error message string is managed internally -** and must not be freed by the application)^. -** -** When the serialized [threading mode] is in use, it might be the -** case that a second error occurs on a separate thread in between -** the time of the first error and the call to these interfaces. -** When that happens, the second error will be reported since these -** interfaces always report the most recent result. To avoid -** this, each thread can obtain exclusive use of the [database connection] D -** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning -** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after -** all calls to the interfaces listed here are completed. -** -** If an interface fails with SQLITE_MISUSE, that means the interface -** was invoked incorrectly by the application. In that case, the -** error code and message may or may not be set. -*/ -SQLITE_API int sqlite3_errcode(sqlite3 *db); -SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); -SQLITE_API const char *sqlite3_errmsg(sqlite3*); -SQLITE_API const void *sqlite3_errmsg16(sqlite3*); -SQLITE_API const char *sqlite3_errstr(int); - -/* -** CAPI3REF: SQL Statement Object -** KEYWORDS: {prepared statement} {prepared statements} -** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
      -**
    1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
    2. Bind values to [host parameters] using the sqlite3_bind_*() -** interfaces. -**
    3. Run the SQL by calling [sqlite3_step()] one or more times. -**
    4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
    5. Destroy the object using [sqlite3_finalize()]. -**
    -** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Run-time Limits -** -** ^(This interface allows the size of various constructs to be limited -** on a connection by connection basis. The first parameter is the -** [database connection] whose limit is to be set or queried. The -** second parameter is one of the [limit categories] that define a -** class of constructs to be size limited. The third parameter is the -** new limit for that construct.)^ -** -** ^If the new limit is a negative number, the limit is unchanged. -** ^(For each limit category SQLITE_LIMIT_NAME there is a -** [limits | hard upper bound] -** set at compile-time by a C preprocessor macro called -** [limits | SQLITE_MAX_NAME]. -** (The "_LIMIT_" in the name is changed to "_MAX_".))^ -** ^Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper bound. -** -** ^Regardless of whether or not the limit was changed, the -** [sqlite3_limit()] interface returns the prior value of the limit. -** ^Hence, to find the current value of a limit without changing it, -** simply invoke this interface with the third parameter set to -1. -** -** Run-time limits are intended for use in applications that manage -** both their own internal database and also databases that are controlled -** by untrusted external sources. An example application might be a -** web browser that has its own databases for storing history and -** separate databases controlled by JavaScript applications downloaded -** off the Internet. The internal databases can be given the -** large, default limits. Databases managed by external sources can -** be given much smaller limits designed to prevent a denial of service -** attack. Developers might also want to use the [sqlite3_set_authorizer()] -** interface to further control untrusted SQL. The size of the database -** created by an untrusted script can be contained using the -** [max_page_count] [PRAGMA]. -** -** New run-time limit categories may be added in future releases. -*/ -SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); - -/* -** CAPI3REF: Run-Time Limit Categories -** KEYWORDS: {limit category} {*limit categories} -** -** These constants define various performance limits -** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. -** -**
    -** [[SQLITE_LIMIT_LENGTH]] ^(
    SQLITE_LIMIT_LENGTH
    -**
    The maximum size of any string or BLOB or table row, in bytes.
    )^ -** -** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
    SQLITE_LIMIT_SQL_LENGTH
    -**
    The maximum length of an SQL statement, in bytes.
    )^ -** -** [[SQLITE_LIMIT_COLUMN]] ^(
    SQLITE_LIMIT_COLUMN
    -**
    The maximum number of columns in a table definition or in the -** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
    )^ -** -** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
    SQLITE_LIMIT_EXPR_DEPTH
    -**
    The maximum depth of the parse tree on any expression.
    )^ -** -** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
    SQLITE_LIMIT_COMPOUND_SELECT
    -**
    The maximum number of terms in a compound SELECT statement.
    )^ -** -** [[SQLITE_LIMIT_VDBE_OP]] ^(
    SQLITE_LIMIT_VDBE_OP
    -**
    The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.
    )^ -** -** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
    SQLITE_LIMIT_FUNCTION_ARG
    -**
    The maximum number of arguments on a function.
    )^ -** -** [[SQLITE_LIMIT_ATTACHED]] ^(
    SQLITE_LIMIT_ATTACHED
    -**
    The maximum number of [ATTACH | attached databases].)^
    -** -** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] -** ^(
    SQLITE_LIMIT_LIKE_PATTERN_LENGTH
    -**
    The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
    )^ -** -** [[SQLITE_LIMIT_VARIABLE_NUMBER]] -** ^(
    SQLITE_LIMIT_VARIABLE_NUMBER
    -**
    The maximum index number of any [parameter] in an SQL statement.)^ -** -** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
    SQLITE_LIMIT_TRIGGER_DEPTH
    -**
    The maximum depth of recursion for triggers.
    )^ -**
    -*/ -#define SQLITE_LIMIT_LENGTH 0 -#define SQLITE_LIMIT_SQL_LENGTH 1 -#define SQLITE_LIMIT_COLUMN 2 -#define SQLITE_LIMIT_EXPR_DEPTH 3 -#define SQLITE_LIMIT_COMPOUND_SELECT 4 -#define SQLITE_LIMIT_VDBE_OP 5 -#define SQLITE_LIMIT_FUNCTION_ARG 6 -#define SQLITE_LIMIT_ATTACHED 7 -#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 -#define SQLITE_LIMIT_VARIABLE_NUMBER 9 -#define SQLITE_LIMIT_TRIGGER_DEPTH 10 - -/* -** CAPI3REF: Compiling An SQL Statement -** KEYWORDS: {SQL statement compiler} -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** The first argument, "db", is a [database connection] obtained from a -** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or -** [sqlite3_open16()]. The database connection must not have been closed. -** -** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. -** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string including -** the nul-terminator bytes as this saves SQLite from having to -** make a copy of the input string. -** -** ^If pzTail is not NULL then *pzTail is made to point to the first byte -** past the end of the first SQL statement in zSql. These routines only -** compile the first statement in zSql, so *pzTail is left pointing to -** what remains uncompiled. -** -** ^*ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set -** to NULL. ^If the input text contains no SQL (if the input is an empty -** string or a comment) then *ppStmt is set to NULL. -** The calling procedure is responsible for deleting the compiled -** SQL statement using [sqlite3_finalize()] after it has finished with it. -** ppStmt may not be NULL. -** -** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; -** otherwise an [error code] is returned. -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. This causes the [sqlite3_step()] interface to -** behave differently in three ways: -** -**
      -**
    1. -** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. As many as [SQLITE_MAX_SCHEMA_RETRY] -** retries will occur before sqlite3_step() gives up and returns an error. -**
    2. -** -**
    3. -** ^When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. ^The legacy behavior was that -** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and the application would have to make a second call to [sqlite3_reset()] -** in order to find the underlying cause of the problem. With the "v2" prepare -** interfaces, the underlying reason for the error is returned immediately. -**
    4. -** -**
    5. -** ^If the specific value bound to [parameter | host parameter] in the -** WHERE clause might influence the choice of query plan for a statement, -** then the statement will be automatically recompiled, as if there had been -** a schema change, on the first [sqlite3_step()] call following any change -** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the -** choice of query plan if the parameter is the left-hand side of a [LIKE] -** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. -** the -**
    6. -**
    -*/ -SQLITE_API int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPI3REF: Retrieving Statement SQL -** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -*/ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If An SQL Statement Writes The Database -** -** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if -** and only if the [prepared statement] X makes no direct changes to -** the content of the database file. -** -** Note that [application-defined SQL functions] or -** [virtual tables] might change the database indirectly as a side effect. -** ^(For example, if an application defines a function "eval()" that -** calls [sqlite3_exec()], then the following SQL statement would -** change the database file through side-effects: -** -**
    -**    SELECT eval('DELETE FROM t1') FROM t2;
    -** 
    -** -** But because the [SELECT] statement does not change the database file -** directly, sqlite3_stmt_readonly() would still return true.)^ -** -** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], -** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, -** since the statements themselves do not actually modify the database but -** rather they control the timing of when other statements modify the -** database. ^The [ATTACH] and [DETACH] statements also cause -** sqlite3_stmt_readonly() to return true since, while those statements -** change the configuration of a database connection, they do not make -** changes to the content of the database files on disk. -*/ -SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If A Prepared Statement Has Been Reset -** -** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the -** [prepared statement] S has been stepped at least once using -** [sqlite3_step(S)] but has not run to completion and/or has not -** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) -** interface returns false if S is a NULL pointer. If S is not a -** NULL pointer and is not a pointer to a valid [prepared statement] -** object, then the behavior is undefined and probably undesirable. -** -** This interface can be used in combination [sqlite3_next_stmt()] -** to locate all prepared statements associated with a database -** connection that are in need of being reset. This can be used, -** for example, in diagnostic routines to search for prepared -** statements that are holding a transaction open. -*/ -SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); - -/* -** CAPI3REF: Dynamically Typed Value Object -** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} -** -** SQLite uses the sqlite3_value object to represent all values -** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. ^Values stored in sqlite3_value objects -** can be integers, floating point values, strings, BLOBs, or NULL. -** -** An sqlite3_value object may be either "protected" or "unprotected". -** Some interfaces require a protected sqlite3_value. Other interfaces -** will accept either a protected or an unprotected sqlite3_value. -** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. -** -** The terms "protected" and "unprotected" refer to whether or not -** a mutex is held. An internal mutex is held for a protected -** sqlite3_value object but no mutex is held for an unprotected -** sqlite3_value object. If SQLite is compiled to be single-threaded -** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) -** or if SQLite is run in one of reduced mutex modes -** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] -** then there is no distinction between protected and unprotected -** sqlite3_value objects and they can be used interchangeably. However, -** for maximum code portability it is recommended that applications -** still make the distinction between protected and unprotected -** sqlite3_value objects even when not strictly required. -** -** ^The sqlite3_value objects that are passed as parameters into the -** implementation of [application-defined SQL functions] are protected. -** ^The sqlite3_value object returned by -** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. -** The [sqlite3_value_blob | sqlite3_value_type()] family of -** interfaces require protected sqlite3_value objects. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. -** The application-defined SQL function implementation will pass this -** pointer through into calls to [sqlite3_result_int | sqlite3_result()], -** [sqlite3_aggregate_context()], [sqlite3_user_data()], -** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], -** and/or [sqlite3_set_auxdata()]. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements -** KEYWORDS: {host parameter} {host parameters} {host parameter name} -** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} -** -** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following -** templates: -** -**
      -**
    • ? -**
    • ?NNN -**
    • :VVV -**
    • @VVV -**
    • $VVV -**
    -** -** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifier.)^ ^The values of these -** parameters (also called "host parameter names" or "SQL parameters") -** can be set using the sqlite3_bind_*() routines defined here. -** -** ^The first argument to the sqlite3_bind_*() routines is always -** a pointer to the [sqlite3_stmt] object returned from -** [sqlite3_prepare_v2()] or its variants. -** -** ^The second argument is the index of the SQL parameter to be set. -** ^The leftmost SQL parameter has an index of 1. ^When the same named -** SQL parameter is used more than once, second and subsequent -** occurrences have the same index as the first occurrence. -** ^The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. ^The index -** for "?NNN" parameters is the value of NNN. -** ^The NNN value must be between 1 and the [sqlite3_limit()] -** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). -** -** ^The third argument is the value to bind to the parameter. -** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() -** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter -** is ignored and the end result is the same as sqlite3_bind_null(). -** -** ^(In those routines that have a fourth argument, its value is the -** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters.)^ -** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() -** is negative, then the length of the string is -** the number of bytes up to the first zero terminator. -** If the fourth parameter to sqlite3_bind_blob() is negative, then -** the behavior is undefined. -** If a non-negative fourth parameter is provided to sqlite3_bind_text() -** or sqlite3_bind_text16() then that parameter must be the byte offset -** where the NUL terminator would occur assuming the string were NUL -** terminated. If any NUL characters occur at byte offsets less than -** the value of the fourth parameter then the resulting string value will -** contain embedded NULs. The result of expressions involving strings -** with embedded NULs is undefined. -** -** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), -** sqlite3_bind_text(), or sqlite3_bind_text16() fails. -** ^If the fifth argument is -** the special value [SQLITE_STATIC], then SQLite assumes that the -** information is in static, unmanaged space and does not need to be freed. -** ^If the fifth argument has the value [SQLITE_TRANSIENT], then -** SQLite makes its own private copy of the data immediately, before -** the sqlite3_bind_*() routine returns. -** -** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. ^A zeroblob uses a fixed amount of memory -** (just an integer to hold its size) while it is being processed. -** Zeroblobs are intended to serve as placeholders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | incremental BLOB I/O] routines. -** ^A negative value for the zeroblob results in a zero-length BLOB. -** -** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer -** for the [prepared statement] or with a prepared statement for which -** [sqlite3_step()] has been called more recently than [sqlite3_reset()], -** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() -** routine is passed a [prepared statement] that has been finalized, the -** result is undefined and probably harmful. -** -** ^Bindings are not cleared by the [sqlite3_reset()] routine. -** ^Unbound parameters are interpreted as NULL. -** -** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an -** [error code] if anything goes wrong. -** ^[SQLITE_RANGE] is returned if the parameter -** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. -** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); -SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); -SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); -SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of SQL Parameters -** -** ^This routine can be used to find the number of [SQL parameters] -** in a [prepared statement]. SQL parameters are tokens of the -** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as -** placeholders for values that are [sqlite3_bind_blob | bound] -** to the parameters at a later time. -** -** ^(This routine actually returns the index of the largest (rightmost) -** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN form are used, -** there may be gaps in the list.)^ -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_name()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter -** -** ^The sqlite3_bind_parameter_name(P,N) interface returns -** the name of the N-th [SQL parameter] in the [prepared statement] P. -** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" -** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" -** respectively. -** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name.)^ -** ^Parameters of the form "?" without a following integer have no name -** and are referred to as "nameless" or "anonymous parameters". -** -** ^The first host parameter has an index of 1, not 0. -** -** ^If the value N is out of range or if the N-th parameter is -** nameless, then NULL is returned. ^The returned string is -** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name -** -** ^Return the index of an SQL parameter given its name. ^The -** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero -** is returned if no matching parameter is found. ^The parameter -** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement -** -** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset -** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** ^Use this routine to reset all host parameters to NULL. -*/ -SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set -** -** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). -** -** See also: [sqlite3_data_count()] -*/ -SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set -** -** ^These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. ^The sqlite3_column_name() -** interface returns a pointer to a zero-terminated UTF-8 string -** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. ^The first parameter is the [prepared statement] -** that implements the [SELECT] statement. ^The second parameter is the -** column number. ^The leftmost column is number 0. -** -** ^The returned string pointer is valid until either the [prepared statement] -** is destroyed by [sqlite3_finalize()] or until the statement is automatically -** reprepared by the first call to [sqlite3_step()] for a particular run -** or until the next call to -** sqlite3_column_name() or sqlite3_column_name16() on the same column. -** -** ^If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -** -** ^The name of a result column is the value of the "AS" clause for -** that column, if there is an AS clause. If there is no AS clause -** then the name of the column is unspecified and may change from -** one release of SQLite to the next. -*/ -SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); -SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result -** -** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in -** [SELECT] statement. -** ^The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. ^The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. -** ^The returned string is valid until the [prepared statement] is destroyed -** using [sqlite3_finalize()] or until the statement is automatically -** reprepared by the first call to [sqlite3_step()] for a particular run -** or until the same information is requested -** again in a different encoding. -** -** ^The names returned are the original un-aliased names of the -** database, table, and column. -** -** ^The first argument to these interfaces is a [prepared statement]. -** ^These functions return information about the Nth result column returned by -** the statement, where N is the second function argument. -** ^The left-most column is column 0 for these routines. -** -** ^If the Nth column returned by the statement is an expression or -** subquery and is not a column value, then all of these functions return -** NULL. ^These routine might also return NULL if a memory allocation error -** occurs. ^Otherwise, they return the name of the attached database, table, -** or column that query result column was extracted from. -** -** ^As with all other SQLite APIs, those whose names end with "16" return -** UTF-16 encoded strings and the other functions return UTF-8. -** -** ^These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. -** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -** -** If two or more threads call one or more -** [sqlite3_column_database_name | column metadata interfaces] -** for the same [prepared statement] and result column -** at the same time then the results are undefined. -*/ -SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result -** -** ^(The first parameter is a [prepared statement]. -** If this statement is a [SELECT] statement and the Nth column of the -** returned result set of that [SELECT] is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned.)^ ^If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** ^The returned string is always UTF-8 encoded. -** -** ^(For example, given the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** and the following statement to be compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0).)^ -** -** ^SQLite uses dynamic run-time typing. ^So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. ^Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement -** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy -** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function -** must be called one or more times to evaluate the statement. -** -** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** ^In the legacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** ^With the "v2" interface, any of the other [result codes] or -** [extended result codes] might be returned as well. -** -** ^[SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. ^If the statement is a [COMMIT] -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a [COMMIT] and occurs within an -** explicit transaction then you should rollback the transaction before -** continuing. -** -** ^[SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] -** is returned each time a new row of data is ready for processing by the -** caller. The values may be accessed using the [column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** ^[SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** ^With the legacy interface, a more specific error code (for example, -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. ^In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** For all versions of SQLite up to and including 3.6.23.1, a call to -** [sqlite3_reset()] was required after sqlite3_step() returned anything -** other than [SQLITE_ROW] before any subsequent invocation of -** sqlite3_step(). Failure to reset the prepared statement using -** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began -** calling [sqlite3_reset()] automatically in this circumstance rather -** than returning [SQLITE_MISUSE]. This is not considered a compatibility -** break because any application that ever receives an SQLITE_MISUSE error -** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option -** can be used to restore the legacy behavior. -** -** Goofy Interface Alert: In the legacy interface, the sqlite3_step() -** API always returns a generic error code, [SQLITE_ERROR], following any -** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call -** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the -** specific [error codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, -** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -SQLITE_API int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: Number of columns in a result set -** -** ^The sqlite3_data_count(P) interface returns the number of columns in the -** current row of the result set of [prepared statement] P. -** ^If prepared statement P does not have results ready to return -** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of -** interfaces) then sqlite3_data_count(P) returns 0. -** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. -** ^The sqlite3_data_count(P) routine returns 0 if the previous call to -** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) -** will return non-zero if previous call to [sqlite3_step](P) returned -** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] -** where it always returns zero since each step of that multi-step -** pragma returns 0 columns of data. -** -** See also: [sqlite3_column_count()] -*/ -SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes -** KEYWORDS: SQLITE_TEXT -** -** ^(Every value in SQLite has one of five fundamental datatypes: -** -**
      -**
    • 64-bit signed integer -**
    • 64-bit IEEE floating point number -**
    • string -**
    • BLOB -**
    • NULL -**
    )^ -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Result Values From A Query -** KEYWORDS: {column access functions} -** -** These routines form the "result set" interface. -** -** ^These routines return information about a single column of the current -** result row of a query. ^In every case the first argument is a pointer -** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] -** that was returned from [sqlite3_prepare_v2()] or one of its variants) -** and the second argument is the index of the column for which information -** should be returned. ^The leftmost column of the result set has the index 0. -** ^The number of columns in the result can be determined using -** [sqlite3_column_count()]. -** -** If the SQL statement does not currently point to a valid row, or if the -** column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** ^The sqlite3_column_type() routine returns the -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes() returns zero. -** -** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts -** the string to UTF-16 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes16() uses -** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. -** -** ^The values returned by [sqlite3_column_bytes()] and -** [sqlite3_column_bytes16()] do not include the zero terminators at the end -** of the string. ^For clarity: the values returned by -** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of -** bytes in the string, not the number of characters. -** -** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero-terminated. ^The return -** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. -** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. -** If the [unprotected sqlite3_value] object returned by -** [sqlite3_column_value()] is used in any other way, including calls -** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. -** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. ^(The following table details the conversions -** that are applied: -** -**
    -** -**
    Internal
    Type
    Requested
    Type
    Conversion -** -**
    NULL INTEGER Result is 0 -**
    NULL FLOAT Result is 0.0 -**
    NULL TEXT Result is NULL pointer -**
    NULL BLOB Result is NULL pointer -**
    INTEGER FLOAT Convert from integer to float -**
    INTEGER TEXT ASCII rendering of the integer -**
    INTEGER BLOB Same as INTEGER->TEXT -**
    FLOAT INTEGER Convert from float to integer -**
    FLOAT TEXT ASCII rendering of the float -**
    FLOAT BLOB Same as FLOAT->TEXT -**
    TEXT INTEGER Use atoi() -**
    TEXT FLOAT Use atof() -**
    TEXT BLOB No change -**
    BLOB INTEGER Convert to TEXT then use atoi() -**
    BLOB FLOAT Convert to TEXT then use atof() -**
    BLOB TEXT Add a zero terminator if needed -**
    -**
    )^ -** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
      -**
    • The initial content is a BLOB and sqlite3_column_text() or -** sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.
    • -**
    • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.
    • -**
    • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.
    • -**
    -** -** ^Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer references will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometimes they -** are not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
      -**
    • sqlite3_column_text() followed by sqlite3_column_bytes()
    • -**
    • sqlite3_column_blob() followed by sqlite3_column_bytes()
    • -**
    • sqlite3_column_text16() followed by sqlite3_column_bytes16()
    • -**
    -** -** In other words, you should call sqlite3_column_text(), -** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result -** into the desired format, then invoke sqlite3_column_bytes() or -** sqlite3_column_bytes16() to find the size of the result. Do not mix calls -** to sqlite3_column_text() or sqlite3_column_blob() with calls to -** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() -** with calls to sqlite3_column_bytes(). -** -** ^The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** ^(If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM].)^ -*/ -SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object -** -** ^The sqlite3_finalize() function is called to delete a [prepared statement]. -** ^If the most recent evaluation of the statement encountered no errors -** or if the statement is never been evaluated, then sqlite3_finalize() returns -** SQLITE_OK. ^If the most recent evaluation of statement S failed, then -** sqlite3_finalize(S) returns the appropriate [error code] or -** [extended error code]. -** -** ^The sqlite3_finalize(S) routine can be called at any point during -** the life cycle of [prepared statement] S: -** before statement S is ever evaluated, after -** one or more calls to [sqlite3_reset()], or after any call -** to [sqlite3_step()] regardless of whether or not the statement has -** completed execution. -** -** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. -** -** The application must finalize every [prepared statement] in order to avoid -** resource leaks. It is a grievous error for the application to try to use -** a prepared statement after it has been finalized. Any use of a prepared -** statement after it has been finalized can result in undefined and -** undesirable behavior such as segfaults and heap corruption. -*/ -SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object -** -** The sqlite3_reset() function is called to reset a [prepared statement] -** object back to its initial state, ready to be re-executed. -** ^Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -** -** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. -** -** ^The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. -*/ -SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions -** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} -** -** ^These functions (collectively known as "function creation routines") -** are used to add SQL functions or aggregates or to redefine the behavior -** of existing SQL functions or aggregates. The only differences between -** these routines are the text encoding expected for -** the second parameter (the name of the function being created) -** and the presence or absence of a destructor callback for -** the application data pointer. -** -** ^The first parameter is the [database connection] to which the SQL -** function is to be added. ^If an application uses more than one database -** connection then application-defined SQL functions must be added -** to each database connection separately. -** -** ^The second parameter is the name of the SQL function to be created or -** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 -** representation, exclusive of the zero-terminator. ^Note that the name -** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. -** ^Any attempt to create a function with a longer name -** will result in [SQLITE_MISUSE] being returned. -** -** ^The third parameter (nArg) -** is the number of arguments that the SQL function or -** aggregate takes. ^If this parameter is -1, then the SQL function or -** aggregate may take any number of arguments between 0 and the limit -** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third -** parameter is less than -1 or greater than 127 then the behavior is -** undefined. -** -** ^The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Every SQL function implementation must be able to work -** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. ^An application may -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** ^When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what text -** encoding is used, then the fourth argument should be [SQLITE_ANY]. -** -** ^(The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()].)^ -** -** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL function or -** aggregate. ^A scalar SQL function requires an implementation of the xFunc -** callback only; NULL pointers must be passed as the xStep and xFinal -** parameters. ^An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing -** SQL function or aggregate, pass NULL pointers for all three function -** callbacks. -** -** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, -** then it is destructor for the application data pointer. -** The destructor is invoked when the function is deleted, either by being -** overloaded or when the database connection closes.)^ -** ^The destructor is also invoked if the call to -** sqlite3_create_function_v2() fails. -** ^When the destructor callback of the tenth parameter is invoked, it -** is passed a single argument which is a copy of the application data -** pointer which was the fifth parameter to sqlite3_create_function_v2(). -** -** ^It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. ^SQLite will use -** the implementation that most closely matches the way in which the -** SQL function is used. ^A function implementation with a non-negative -** nArg parameter is a better match than a function implementation with -** a negative nArg. ^A function where the preferred text encoding -** matches the database encoding is a better -** match than a function where the encoding is different. -** ^A function where the encoding difference is between UTF16le and UTF16be -** is a closer match than a function where the encoding difference is -** between UTF8 and UTF16. -** -** ^Built-in functions may be overloaded by new application-defined functions. -** -** ^An application-defined function is permitted to call other -** SQLite interfaces. However, such calls must not -** close the database connection nor finalize or reset the prepared -** statement in which the function is running. -*/ -SQLITE_API int sqlite3_create_function( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function16( - sqlite3 *db, - const void *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function_v2( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*), - void(*xDestroy)(void*) -); - -/* -** CAPI3REF: Text Encodings -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Deprecated Functions -** DEPRECATED -** -** These functions are [deprecated]. In order to maintain -** backwards compatibility with older code, these functions continue -** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. -*/ -#ifndef SQLITE_OMIT_DEPRECATED -SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); -SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); -SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), - void*,sqlite3_int64); -#endif - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work only with [protected sqlite3_value] objects. -** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. -** -** ^These routines work just like the corresponding [column access functions] -** except that these routines take a single [protected sqlite3_value] object -** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. -** -** ^The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. ^The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF-16 strings as big-endian and little-endian respectively. -** -** ^(The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in other -** words, if the value is a string that looks like a number) -** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ -** -** Please pay particular attention to the fact that the pointer returned -** from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the [sqlite3_value*] parameters. -*/ -SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); -SQLITE_API double sqlite3_value_double(sqlite3_value*); -SQLITE_API int sqlite3_value_int(sqlite3_value*); -SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); -SQLITE_API int sqlite3_value_type(sqlite3_value*); -SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context -** -** Implementations of aggregate SQL functions use this -** routine to allocate memory for storing their state. -** -** ^The first time the sqlite3_aggregate_context(C,N) routine is called -** for a particular aggregate function, SQLite -** allocates N of memory, zeroes out that memory, and returns a pointer -** to the new memory. ^On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function instance, -** the same buffer is returned. Sqlite3_aggregate_context() is normally -** called once for each invocation of the xStep callback and then one -** last time when the xFinal callback is invoked. ^(When no rows match -** an aggregate query, the xStep() callback of the aggregate function -** implementation is never called and xFinal() is called exactly once. -** In those cases, sqlite3_aggregate_context() might be called for the -** first time from within xFinal().)^ -** -** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer -** when first called if N is less than or equal to zero or if a memory -** allocate error occurs. -** -** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the -** value of N in subsequent call to sqlite3_aggregate_context() within -** the same aggregate function instance will not resize the memory -** allocation.)^ Within the xFinal callback, it is customary to set -** N=0 in calls to sqlite3_aggregate_context(C,N) so that no -** pointless memory allocations occur. -** -** ^SQLite automatically frees the memory allocated by -** sqlite3_aggregate_context() when the aggregate query concludes. -** -** The first parameter must be a copy of the -** [sqlite3_context | SQL function context] that is the first parameter -** to the xStep or xFinal callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions -** -** ^The sqlite3_user_data() interface returns a copy of -** the pointer that was the pUserData parameter (the 5th parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -** -** This routine must be called from the same thread in which -** the application-defined function is running. -*/ -SQLITE_API void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Database Connection For Functions -** -** ^The sqlite3_context_db_handle() interface returns a copy of -** the pointer to the [database connection] (the 1st parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -*/ -SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data -** -** These functions may be used by (non-aggregate) SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. An example -** of where this might be useful is in a regular-expression matching -** function. The compiled version of the regular expression can be stored as -** metadata associated with the pattern string. -** Then as long as the pattern string remains the same, -** the compiled regular expression can be reused on multiple -** invocations of the same function. -** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If there is no metadata -** associated with the function argument, this sqlite3_get_auxdata() interface -** returns a NULL pointer. -** -** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th -** argument of the application-defined function. ^Subsequent -** calls to sqlite3_get_auxdata(C,N) return P from the most recent -** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or -** NULL if the metadata has been discarded. -** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, -** SQLite will invoke the destructor function X with parameter P exactly -** once, when the metadata is discarded. -** SQLite is free to discard the metadata at any time, including:
      -**
    • when the corresponding function parameter changes, or -**
    • when [sqlite3_reset()] or [sqlite3_finalize()] is called for the -** SQL statement, or -**
    • when sqlite3_set_auxdata() is invoked again on the same parameter, or -**
    • during the original sqlite3_set_auxdata() call when a memory -** allocation error occurs.
    )^ -** -** Note the last bullet in particular. The destructor X in -** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the -** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() -** should be called near the end of the function implementation and the -** function implementation should not make any use of P after -** sqlite3_set_auxdata() has been called. -** -** ^(In practice, metadata is preserved between function calls for -** function parameters that are compile-time constants, including literal -** values and [parameters] and expressions composed from the same.)^ -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); -SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior -** -** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. ^If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. ^The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the [parameter binding] family of -** functions used to bind values to host parameters in prepared statements. -** Refer to the [SQL parameter] documentation for additional information. -** -** ^The sqlite3_result_blob() interface sets the result from -** an application-defined function to be the BLOB whose content is pointed -** to by the second parameter and which is N bytes long where N is the -** third parameter. -** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. -** -** ^The sqlite3_result_double() interface sets the result from -** an application-defined function to be a floating point value specified -** by its 2nd argument. -** -** ^The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. -** ^SQLite uses the string pointed to by the -** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. ^SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. ^SQLite -** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. ^If the third parameter to sqlite3_result_error() -** or sqlite3_result_error16() is negative then SQLite takes as the error -** message all text up through the first zero character. -** ^If the third parameter to sqlite3_result_error() or -** sqlite3_result_error16() is non-negative then SQLite takes that many -** bytes (not characters) from the 2nd parameter as the error message. -** ^The sqlite3_result_error() and sqlite3_result_error16() -** routines make a private copy of the error message text before -** they return. Hence, the calling function can deallocate or -** modify the text after they return without harm. -** ^The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. ^By default, -** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() -** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. -** -** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an -** error indicating that a string or BLOB is too long to represent. -** -** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an -** error indicating that a memory allocation failed. -** -** ^The sqlite3_result_int() interface sets the return value -** of the application-defined function to be the 32-bit signed integer -** value given in the 2nd argument. -** ^The sqlite3_result_int64() interface sets the return value -** of the application-defined function to be the 64-bit signed integer -** value given in the 2nd argument. -** -** ^The sqlite3_result_null() interface sets the return value -** of the application-defined function to be NULL. -** -** ^The sqlite3_result_text(), sqlite3_result_text16(), -** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces -** set the return value of the application-defined function to be -** a text string which is represented as UTF-8, UTF-16 native byte order, -** UTF-16 little endian, or UTF-16 big endian, respectively. -** ^SQLite takes the text result from the application from -** the 2nd parameter of the sqlite3_result_text* interfaces. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is negative, then SQLite takes result text from the 2nd parameter -** through the first zero character. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is non-negative, then as many bytes (not characters) of the text -** pointed to by the 2nd parameter are taken as the application-defined -** function result. If the 3rd parameter is non-negative, then it -** must be the byte offset into the string where the NUL terminator would -** appear if the string where NUL terminated. If any NUL characters occur -** in the string at a byte offset that is less than the value of the 3rd -** parameter, then the resulting string will contain embedded NULs and the -** result of expressions operating on strings with embedded NULs is undefined. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that -** function as the destructor on the text or BLOB result when it has -** finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces or to -** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite -** assumes that the text or BLOB result is in constant space and does not -** copy the content of the parameter nor call a destructor on the content -** when it has finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from -** from [sqlite3_malloc()] before it returns. -** -** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The -** sqlite3_result_value() interface makes a copy of the [sqlite3_value] -** so that the [sqlite3_value] specified in the parameter may change or -** be deallocated after sqlite3_result_value() returns without harm. -** ^A [protected sqlite3_value] object may always be used where an -** [unprotected sqlite3_value] object is required, so either -** kind of [sqlite3_value] object can be used with this interface. -** -** If these routines are called from within the different thread -** than the one containing the application-defined function that received -** the [sqlite3_context] pointer, the results are undefined. -*/ -SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_double(sqlite3_context*, double); -SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); -SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); -SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); -SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); -SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -SQLITE_API void sqlite3_result_null(sqlite3_context*); -SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences -** -** ^These functions add, remove, or modify a [collation] associated -** with the [database connection] specified as the first argument. -** -** ^The name of the collation is a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string in native byte order for sqlite3_create_collation16(). -** ^Collation names that compare equal according to [sqlite3_strnicmp()] are -** considered to be the same name. -** -** ^(The third argument (eTextRep) must be one of the constants: -**
      -**
    • [SQLITE_UTF8], -**
    • [SQLITE_UTF16LE], -**
    • [SQLITE_UTF16BE], -**
    • [SQLITE_UTF16], or -**
    • [SQLITE_UTF16_ALIGNED]. -**
    )^ -** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. -** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep -** force strings to be UTF16 with native byte order. -** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin -** on an even byte address. -** -** ^The fourth argument, pArg, is an application data pointer that is passed -** through as the first argument to the collating function callback. -** -** ^The fifth argument, xCallback, is a pointer to the collating function. -** ^Multiple collating functions can be registered using the same name but -** with different eTextRep parameters and SQLite will use whichever -** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is -** deleted. ^When all collating functions having the same name are deleted, -** that collation is no longer usable. -** -** ^The collating function callback is invoked with a copy of the pArg -** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive -** if the first string is less than, equal to, or greater than the second, -** respectively. A collating function must always return the same answer -** given the same inputs. If two or more collating functions are registered -** to the same collation name (using different eTextRep values) then all -** must give an equivalent answer when invoked with equivalent strings. -** The collating function must obey the following properties for all -** strings A, B, and C: -** -**
      -**
    1. If A==B then B==A. -**
    2. If A==B and B==C then A==C. -**
    3. If A<B THEN B>A. -**
    4. If A<B and B<C then A<C. -**
    -** -** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite -** is undefined. -** -** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** with the addition that the xDestroy callback is invoked on pArg when -** the collating function is deleted. -** ^Collating functions are deleted when they are overridden by later -** calls to the collation creation functions or when the -** [database connection] is closed using [sqlite3_close()]. -** -** ^The xDestroy callback is not called if the -** sqlite3_create_collation_v2() function fails. Applications that invoke -** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should -** check the return code and dispose of the application data pointer -** themselves rather than expecting SQLite to deal with it for them. -** This is different from every other SQLite interface. The inconsistency -** is unfortunate but cannot be changed without breaking backwards -** compatibility. -** -** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -*/ -SQLITE_API int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); -SQLITE_API int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -SQLITE_API int sqlite3_create_collation16( - sqlite3*, - const void *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks -** -** ^To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** [database connection] to be invoked whenever an undefined collation -** sequence is required. -** -** ^If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, -** the names are passed as UTF-16 in machine native byte order. -** ^A call to either function replaces the existing collation-needed callback. -** -** ^(When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). The second argument is the database -** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], -** or [SQLITE_UTF16LE], indicating the most desirable form of the collation -** sequence function required. The fourth parameter is the name of the -** required collation sequence.)^ -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -SQLITE_API int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -SQLITE_API int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -#ifdef SQLITE_HAS_CODEC -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); -SQLITE_API int sqlite3_key_v2( - sqlite3 *db, /* Database to be rekeyed */ - const char *zDbName, /* Name of the database */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); -SQLITE_API int sqlite3_rekey_v2( - sqlite3 *db, /* Database to be rekeyed */ - const char *zDbName, /* Name of the database */ - const void *pKey, int nKey /* The new key */ -); - -/* -** Specify the activation key for a SEE database. Unless -** activated, none of the SEE routines will work. -*/ -SQLITE_API void sqlite3_activate_see( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -#ifdef SQLITE_ENABLE_CEROD -/* -** Specify the activation key for a CEROD database. Unless -** activated, none of the CEROD routines will work. -*/ -SQLITE_API void sqlite3_activate_cerod( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -/* -** CAPI3REF: Suspend Execution For A Short Time -** -** The sqlite3_sleep() function causes the current thread to suspend execution -** for at least a number of milliseconds specified in its parameter. -** -** If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** ^SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. If the xSleep() method -** of the default VFS is not implemented correctly, or not implemented at -** all, then the behavior of sqlite3_sleep() may deviate from the description -** in the previous paragraphs. -*/ -SQLITE_API int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite when using a built-in [sqlite3_vfs | VFS] -** will be placed in that directory.)^ ^If this variable -** is a NULL pointer, then SQLite performs a search for an appropriate -** temporary file directory. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [temp_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [temp_store_directory pragma] should be avoided. -** -** Note to Windows Runtime users: The temporary directory must be set -** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various -** features that require the use of temporary files may fail. Here is an -** example of how to do this using C++ with the Windows Runtime: -** -**
    -** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
    -**       TemporaryFolder->Path->Data();
    -** char zPathBuf[MAX_PATH + 1];
    -** memset(zPathBuf, 0, sizeof(zPathBuf));
    -** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
    -**       NULL, NULL);
    -** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
    -** 
    -*/ -SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; - -/* -** CAPI3REF: Name Of The Folder Holding Database Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all database files -** specified with a relative pathname and created or accessed by -** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed -** to be relative to that directory.)^ ^If this variable is a NULL -** pointer, then SQLite assumes that all database files specified -** with a relative pathname are relative to the current directory -** for the process. Only the windows VFS makes use of this global -** variable; it is ignored by the unix VFS. -** -** Changing the value of this variable while a database connection is -** open can result in a corrupt database. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [data_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [data_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [data_store_directory pragma] should be avoided. -*/ -SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory; - -/* -** CAPI3REF: Test For Auto-Commit Mode -** KEYWORDS: {autocommit mode} -** -** ^The sqlite3_get_autocommit() interface returns non-zero or -** zero if the given database connection is or is not in autocommit mode, -** respectively. ^Autocommit mode is on by default. -** ^Autocommit mode is disabled by a [BEGIN] statement. -** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. -** -** If certain kinds of errors occur on a statement within a multi-statement -** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. The only way to -** find out whether SQLite automatically rolled back the transaction after -** an error is to use this function. -** -** If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. -*/ -SQLITE_API int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Of A Prepared Statement -** -** ^The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. ^The [database connection] -** returned by sqlite3_db_handle is the same [database connection] -** that was the first argument -** to the [sqlite3_prepare_v2()] call (or its variants) that was used to -** create the statement in the first place. -*/ -SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - -/* -** CAPI3REF: Return The Filename For A Database Connection -** -** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename -** associated with database N of connection D. ^The main database file -** has the name "main". If there is no attached database N on the database -** connection D, or if database N is a temporary or in-memory database, then -** a NULL pointer is returned. -** -** ^The filename returned by this function is the output of the -** xFullPathname method of the [VFS]. ^In other words, the filename -** will be an absolute pathname, even if the filename used -** to open the database originally was a URI or relative pathname. -*/ -SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); - -/* -** CAPI3REF: Determine if a database is read-only -** -** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N -** of connection D is read-only, 0 if it is read/write, or -1 if N is not -** the name of a database on connection D. -*/ -SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); - -/* -** CAPI3REF: Find the next prepared statement -** -** ^This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. ^If pStmt is NULL -** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. ^If no prepared statement -** satisfies the conditions of this routine, it returns NULL. -** -** The [database connection] pointer D in a call to -** [sqlite3_next_stmt(D,S)] must refer to an open database -** connection and in particular must not be a NULL pointer. -*/ -SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks -** -** ^The sqlite3_commit_hook() interface registers a callback -** function to be invoked whenever a transaction is [COMMIT | committed]. -** ^Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** ^The sqlite3_rollback_hook() interface registers a callback -** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** ^Any callback set by a previous call to sqlite3_rollback_hook() -** for the same database connection is overridden. -** ^The pArg argument is passed through to the callback. -** ^If the callback on a commit hook function returns non-zero, -** then the commit is converted into a rollback. -** -** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions -** return the P argument from the previous call of the same function -** on the same [database connection] D, or NULL for -** the first call for each function on D. -** -** The commit and rollback hook callbacks are not reentrant. -** The callback implementation must not do anything that will modify -** the database connection that invoked the callback. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the commit -** or rollback hook in the first place. -** Note that running any other SQL statements, including SELECT statements, -** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify -** the database connections for the meaning of "modify" in this paragraph. -** -** ^Registering a NULL function disables the callback. -** -** ^When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. ^If the commit hook -** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** ^The rollback hook is invoked on a rollback that results from a commit -** hook returning non-zero, just as it would be with any other rollback. -** -** ^For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. -** ^The rollback callback is not invoked if a transaction is -** automatically rolled back because the database connection is closed. -** -** See also the [sqlite3_update_hook()] interface. -*/ -SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks -** -** ^The sqlite3_update_hook() interface registers a callback function -** with the [database connection] identified by the first argument -** to be invoked whenever a row is updated, inserted or deleted. -** ^Any callback set by a previous call to this function -** for the same database connection is overridden. -** -** ^The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. -** ^The first argument to the callback is a copy of the third argument -** to sqlite3_update_hook(). -** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], -** or [SQLITE_UPDATE], depending on the operation that caused the callback -** to be invoked. -** ^The third and fourth arguments to the callback contain pointers to the -** database and table name containing the affected row. -** ^The final callback parameter is the [rowid] of the row. -** ^In the case of an update, this is the [rowid] after the update takes place. -** -** ^(The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence).)^ -** -** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook -** invoked when rows are deleted using the [truncate optimization]. -** The exceptions defined in this paragraph might change in a future -** release of SQLite. -** -** The update hook implementation must not do anything that will modify -** the database connection that invoked the update hook. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the update hook. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^The sqlite3_update_hook(D,C,P) function -** returns the P argument from the previous call -** on the same [database connection] D, or NULL for -** the first call on D. -** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. -*/ -SQLITE_API void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache -** -** ^(This routine enables or disables the sharing of the database cache -** and schema data structures between [database connection | connections] -** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false.)^ -** -** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, -** sharing was enabled or disabled for each thread separately. -** -** ^(The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened.)^ -** -** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise.)^ -** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -** -** This interface is threadsafe on processors where writing a -** 32-bit integer is atomic. -** -** See Also: [SQLite Shared-Cache Mode] -*/ -SQLITE_API int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory -** -** ^The sqlite3_release_memory() interface attempts to free N bytes -** of heap memory by deallocating non-essential memory allocations -** held by the database library. Memory used to cache database -** pages to improve performance is an example of non-essential memory. -** ^sqlite3_release_memory() returns the number of bytes actually freed, -** which might be more or less than the amount requested. -** ^The sqlite3_release_memory() routine is a no-op returning zero -** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** See also: [sqlite3_db_release_memory()] -*/ -SQLITE_API int sqlite3_release_memory(int); - -/* -** CAPI3REF: Free Memory Used By A Database Connection -** -** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap -** memory as possible from database connection D. Unlike the -** [sqlite3_release_memory()] interface, this interface is effect even -** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is -** omitted. -** -** See also: [sqlite3_release_memory()] -*/ -SQLITE_API int sqlite3_db_release_memory(sqlite3*); - -/* -** CAPI3REF: Impose A Limit On Heap Size -** -** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the -** soft limit on the amount of heap memory that may be allocated by SQLite. -** ^SQLite strives to keep heap memory utilization below the soft heap -** limit by reducing the number of pages held in the page cache -** as heap memory usages approaches the limit. -** ^The soft heap limit is "soft" because even though SQLite strives to stay -** below the limit, it will exceed the limit rather than generate -** an [SQLITE_NOMEM] error. In other words, the soft heap limit -** is advisory only. -** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call, or negative in the case of an -** error. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. -** -** ^(The soft heap limit is not enforced in the current implementation -** if one or more of following conditions are true: -** -**
      -**
    • The soft heap limit is set to zero. -**
    • Memory accounting is disabled using a combination of the -** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and -** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. -**
    • An alternative page cache implementation is specified using -** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). -**
    • The page cache allocates from its own memory pool supplied -** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than -** from the heap. -**
    )^ -** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may -** changes in future releases of SQLite. -*/ -SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); - -/* -** CAPI3REF: Deprecated Soft Heap Limit Interface -** DEPRECATED -** -** This is a deprecated version of the [sqlite3_soft_heap_limit64()] -** interface. This routine is provided for historical compatibility -** only. All new applications should use the -** [sqlite3_soft_heap_limit64()] interface rather than this one. -*/ -SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); - - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table -** -** ^This routine returns metadata about a specific column of a specific -** database table accessible using the [database connection] handle -** passed as the first function argument. -** -** ^The column is identified by the second, third and fourth parameters to -** this function. ^The second parameter is either the name of the database -** (i.e. "main", "temp", or an attached database) containing the specified -** table or NULL. ^If it is NULL, then all attached databases are searched -** for the table using the same algorithm used by the database engine to -** resolve unqualified table references. -** -** ^The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** ^Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. ^Any of these arguments may be -** NULL, in which case the corresponding element of metadata is omitted. -** -** ^(
    -** -**
    Parameter Output
    Type
    Description -** -**
    5th const char* Data type -**
    6th const char* Name of default collation sequence -**
    7th int True if column has a NOT NULL constraint -**
    8th int True if column is part of the PRIMARY KEY -**
    9th int True if column is [AUTOINCREMENT] -**
    -**
    )^ -** -** ^The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any SQLite API function. -** -** ^If the specified table is actually a view, an [error code] is returned. -** -** ^If the specified column is "rowid", "oid" or "_rowid_" and an -** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. ^(If there is no -** explicitly declared [INTEGER PRIMARY KEY] column, then the output -** parameters are set as follows: -** -**
    -**     data type: "INTEGER"
    -**     collation sequence: "BINARY"
    -**     not null: 0
    -**     primary key: 1
    -**     auto increment: 0
    -** 
    )^ -** -** ^(This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ -** -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. -*/ -SQLITE_API int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension -** -** ^This interface loads an SQLite extension library from the named file. -** -** ^The sqlite3_load_extension() interface attempts to load an -** [SQLite extension] library contained in the file zFile. If -** the file cannot be loaded directly, attempts are made to load -** with various operating-system specific extensions added. -** So for example, if "samplelib" cannot be loaded, then names like -** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might -** be tried also. -** -** ^The entry point is zProc. -** ^(zProc may be 0, in which case SQLite will try to come up with an -** entry point name on its own. It first tries "sqlite3_extension_init". -** If that does not work, it constructs a name "sqlite3_X_init" where the -** X is consists of the lower-case equivalent of all ASCII alphabetic -** characters in the filename from the last "/" to the first following -** "." and omitting any initial "lib".)^ -** ^The sqlite3_load_extension() interface returns -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** ^If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. The calling function -** should free this memory by calling [sqlite3_free()]. -** -** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. -** -** See also the [load_extension() SQL function]. -*/ -SQLITE_API int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading -** -** ^So as not to open security holes in older applications that are -** unprepared to deal with [extension loading], and as a means of disabling -** [extension loading] while evaluating user-entered SQL, the following API -** is provided to turn the [sqlite3_load_extension()] mechanism on and off. -** -** ^Extension loading is off by default. -** ^Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -*/ -SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Automatically Load Statically Linked Extensions -** -** ^This interface causes the xEntryPoint() function to be invoked for -** each new [database connection] that is created. The idea here is that -** xEntryPoint() is the entry point for a statically linked [SQLite extension] -** that is to be automatically loaded into all new database connections. -** -** ^(Even though the function prototype shows that xEntryPoint() takes -** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the -** entry point where as follows: -** -**
    -**    int xEntryPoint(
    -**      sqlite3 *db,
    -**      const char **pzErrMsg,
    -**      const struct sqlite3_api_routines *pThunk
    -**    );
    -** 
    )^ -** -** If the xEntryPoint routine encounters an error, it should make *pzErrMsg -** point to an appropriate error message (obtained from [sqlite3_mprintf()]) -** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg -** is NULL before calling the xEntryPoint(). ^SQLite will invoke -** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any -** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. -** -** ^Calling sqlite3_auto_extension(X) with an entry point X that is already -** on the list of automatic extensions is a harmless no-op. ^No entry point -** will be called more than once for each database connection that is opened. -** -** See also: [sqlite3_reset_auto_extension()] -** and [sqlite3_cancel_auto_extension()] -*/ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); - -/* -** CAPI3REF: Cancel Automatic Extension Loading -** -** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the -** initialization routine X that was registered using a prior call to -** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] -** routine returns 1 if initialization routine X was successfully -** unregistered and it returns 0 if X was not on the list of initialization -** routines. -*/ -SQLITE_API int sqlite3_cancel_auto_extension(void (*xEntryPoint)(void)); - -/* -** CAPI3REF: Reset Automatic Extension Loading -** -** ^This interface disables all automatic extensions previously -** registered using [sqlite3_auto_extension()]. -*/ -SQLITE_API void sqlite3_reset_auto_extension(void); - -/* -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** CAPI3REF: Virtual Table Object -** KEYWORDS: sqlite3_module {virtual table module} -** -** This structure, sometimes called a "virtual table module", -** defines the implementation of a [virtual tables]. -** This structure consists mostly of methods for the module. -** -** ^A virtual table module is created by filling in a persistent -** instance of this structure and passing a pointer to that instance -** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** ^The registration remains valid until it is replaced by a different -** module or until the [database connection] closes. The content -** of this structure must not change while it is registered with -** any database connection. -*/ -struct sqlite3_module -{ - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); - /* The methods above are in version 1 of the sqlite_module object. Those - ** below are for version 2 and greater. */ - int (*xSavepoint)(sqlite3_vtab *pVTab, int); - int (*xRelease)(sqlite3_vtab *pVTab, int); - int (*xRollbackTo)(sqlite3_vtab *pVTab, int); -}; - -/* -** CAPI3REF: Virtual Table Indexing Information -** KEYWORDS: sqlite3_index_info -** -** The sqlite3_index_info structure and its substructures is used as part -** of the [virtual table] interface to -** pass information into and receive the reply from the [xBestIndex] -** method of a [virtual table module]. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** ^(The aConstraint[] array records WHERE clause constraints of the form: -** -**
    column OP expr
    -** -** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is -** stored in aConstraint[].op using one of the -** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ -** ^(The index of the column is stored in -** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot.)^ -** -** ^The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** ^The aConstraint[] array only reports WHERE clause terms that are -** relevant to the particular virtual table being queried. -** -** ^Information about the ORDER BY clause is stored in aOrderBy[]. -** ^Each term of aOrderBy records a column of the ORDER BY clause. -** -** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. ^If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ -** -** ^The idxNum and idxPtr values are recorded and passed into the -** [xFilter] method. -** ^[sqlite3_free()] is used to free idxPtr if and only if -** needToFreeIdxPtr is true. -** -** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** ^The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info -{ - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint - { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby - { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - /* Outputs */ - struct sqlite3_index_constraint_usage - { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; - -/* -** CAPI3REF: Virtual Table Constraint Operator Codes -** -** These macros defined the allowed values for the -** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of -** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** CAPI3REF: Register A Virtual Table Implementation -** -** ^These routines are used to register a new [virtual table module] name. -** ^Module names must be registered before -** creating a new [virtual table] using the module and before using a -** preexisting [virtual table] for the module. -** -** ^The module name is registered on the [database connection] specified -** by the first parameter. ^The name of the module is given by the -** second parameter. ^The third parameter is a pointer to -** the implementation of the [virtual table module]. ^The fourth -** parameter is an arbitrary client data pointer that is passed through -** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. -** -** ^The sqlite3_create_module_v2() interface has a fifth parameter which -** is a pointer to a destructor for the pClientData. ^SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. ^The destructor will also -** be invoked if the call to sqlite3_create_module_v2() fails. -** ^The sqlite3_create_module() -** interface is equivalent to sqlite3_create_module_v2() with a NULL -** destructor. -*/ -SQLITE_API int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData /* Client data for xCreate/xConnect */ -); -SQLITE_API int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** CAPI3REF: Virtual Table Instance Object -** KEYWORDS: sqlite3_vtab -** -** Every [virtual table module] implementation uses a subclass -** of this object to describe a particular instance -** of the [virtual table]. Each subclass will -** be tailored to the specific needs of the module implementation. -** The purpose of this superclass is to define certain fields that are -** common to all module implementations. -** -** ^Virtual tables methods can set an error message by assigning a -** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should -** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. ^After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. -*/ -struct sqlite3_vtab -{ - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Virtual Table Cursor Object -** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} -** -** Every [virtual table module] implementation uses a subclass of the -** following structure to describe cursors that point into the -** [virtual table] and are used -** to loop through the virtual table. Cursors are created using the -** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cursors are used -** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods -** of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor -{ - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Declare The Schema Of A Virtual Table -** -** ^The [xCreate] and [xConnect] methods of a -** [virtual table module] call this interface -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); - -/* -** CAPI3REF: Overload A Function For A Virtual Table -** -** ^(Virtual tables can provide alternative implementations of functions -** using the [xFindFunction] method of the [virtual table module]. -** But global versions of those functions -** must exist in order to be overloaded.)^ -** -** ^(This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created.)^ ^The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a placeholder function that can be overloaded -** by a [virtual table]. -*/ -SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB -** KEYWORDS: {BLOB handle} {BLOB handles} -** -** An instance of this object represents an open BLOB on which -** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** ^Objects of this type are created by [sqlite3_blob_open()] -** and destroyed by [sqlite3_blob_close()]. -** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the BLOB. -** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O -** -** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located -** in row iRow, column zColumn, table zTable in database zDb; -** in other words, the same BLOB that would be selected by: -** -**
    -**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
    -** 
    )^ -** -** ^If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. ^If it is zero, the BLOB is opened for read access. -** ^It is not possible to open a column that is part of an index or primary -** key for writing. ^If [foreign key constraints] are enabled, it is -** not possible to open a column that is part of a [child key] for writing. -** -** ^Note that the database name is not the filename that contains -** the database but rather the symbolic name of the database that -** appears after the AS keyword when the database is connected using [ATTACH]. -** ^For the main database file, the database name is "main". -** ^For TEMP tables, the database name is "temp". -** -** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written -** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer.)^ -** ^This function sets the [database connection] error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. ^Note that the *ppBlob variable is always initialized in a -** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob -** regardless of the success or failure of this routine. -** -** ^(If the row that a BLOB handle points to is modified by an -** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects -** then the BLOB handle is marked as "expired". -** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on.)^ -** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for -** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. -** ^(Changes written into a BLOB prior to the BLOB expiring are not -** rolled back by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion.)^ -** -** ^Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. ^The size of a blob may not be changed by this -** interface. Use the [UPDATE] SQL command to change the size of a -** blob. -** -** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces -** and the built-in [zeroblob] SQL function can be used, if desired, -** to create an empty, zero-filled blob in which to read or write using -** this interface. -** -** To avoid a resource leak, every open [BLOB handle] should eventually -** be released by a call to [sqlite3_blob_close()]. -*/ -SQLITE_API int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Move a BLOB Handle to a New Row -** -** ^This function is used to move an existing blob handle so that it points -** to a different row of the same database table. ^The new row is identified -** by the rowid value passed as the second argument. Only the row can be -** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be -** faster than closing the existing handle and opening a new one. -** -** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - -** it must exist and there must be either a blob or text value stored in -** the nominated column.)^ ^If the new row is not present in the table, or if -** it does not contain a blob or text value, or if another error occurs, an -** SQLite error code is returned and the blob handle is considered aborted. -** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or -** [sqlite3_blob_reopen()] on an aborted blob handle immediately return -** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle -** always returns zero. -** -** ^This function sets the database handle error code and message. -*/ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); - -/* -** CAPI3REF: Close A BLOB Handle -** -** ^Closes an open [BLOB handle]. -** -** ^Closing a BLOB shall cause the current transaction to commit -** if there are no other BLOBs, no pending prepared statements, and the -** database connection is in [autocommit mode]. -** ^If any writes were made to the BLOB, they might be held in cache -** until the close operation if they will fit. -** -** ^(Closing the BLOB often forces the changes -** out to disk and so if any I/O errors occur, they will likely occur -** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value.)^ -** -** ^(The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed.)^ -** -** ^Calling this routine with a null pointer (such as would be returned -** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. -*/ -SQLITE_API int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB -** -** ^Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing -** blob content; they cannot change the size of a blob. -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -*/ -SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally -** -** ^(This function is used to read data from an open [BLOB handle] into a -** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset.)^ -** -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is -** less than zero, [SQLITE_ERROR] is returned and no data is read. -** ^The size of the blob (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to read from an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. -** -** ^(On success, sqlite3_blob_read() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_write()]. -*/ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally -** -** ^This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. ^N bytes of data are copied from the buffer Z -** into the open BLOB, starting at offset iOffset. -** -** ^If the [BLOB handle] passed as the first argument was not opened for -** writing (the flags parameter to [sqlite3_blob_open()] was zero), -** this function returns [SQLITE_READONLY]. -** -** ^This function may only modify the contents of the BLOB; it is -** not possible to increase the size of a BLOB using this API. -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. ^If N is -** less than zero [SQLITE_ERROR] is returned and no data is written. -** The size of the BLOB (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred -** before the [BLOB handle] expired are not rolled back by the -** expiration of the handle, though of course those changes might -** have been overwritten by the statement that expired the BLOB handle -** or by other independent statements. -** -** ^(On success, sqlite3_blob_write() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_read()]. -*/ -SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most SQLite builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** ^Names are case sensitive. -** ^Names are zero-terminated UTF-8 strings. -** ^If there is no match, a NULL pointer is returned. -** ^If zVfsName is NULL then the default VFS is returned. -** -** ^New VFSes are registered with sqlite3_vfs_register(). -** ^Each new VFS becomes the default VFS if the makeDflt flag is set. -** ^The same VFS can be registered multiple times without injury. -** ^To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. If two different VFSes with the -** same name are registered, the behavior is undefined. If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. -** ^(If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary.)^ -*/ -SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. ^(The following -** implementations are available in the SQLite core: -** -**
      -**
    • SQLITE_MUTEX_PTHREADS -**
    • SQLITE_MUTEX_W32 -**
    • SQLITE_MUTEX_NOOP -**
    )^ -** -** ^The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. ^The SQLITE_MUTEX_PTHREADS and -** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix -** and Windows. -** -** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. In this case the -** application must supply a custom mutex implementation using the -** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function -** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize().)^ -** -** ^The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. ^If it returns NULL -** that means that a mutex could not be allocated. ^SQLite -** will unwind its stack and return an error. ^(The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
      -**
    • SQLITE_MUTEX_FAST -**
    • SQLITE_MUTEX_RECURSIVE -**
    • SQLITE_MUTEX_STATIC_MASTER -**
    • SQLITE_MUTEX_STATIC_MEM -**
    • SQLITE_MUTEX_STATIC_MEM2 -**
    • SQLITE_MUTEX_STATIC_PRNG -**
    • SQLITE_MUTEX_STATIC_LRU -**
    • SQLITE_MUTEX_STATIC_LRU2 -**
    )^ -** -** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) -** cause sqlite3_mutex_alloc() to create -** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. ^SQLite will only request a recursive mutex in -** cases where it really needs one. ^If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other -** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return -** a pointer to a static preexisting mutex. ^Six static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. ^But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -** -** ^The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. ^SQLite is careful to deallocate every -** dynamic mutex that it allocates. The dynamic mutexes must not be in -** use when they are deallocated. Attempting to deallocate a static -** mutex results in undefined behavior. ^SQLite never deallocates -** a static mutex. -** -** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. ^If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. ^(Mutexes created using -** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter.)^ ^(If the same thread tries to enter any other -** kind of mutex more than once, the behavior is undefined. -** SQLite will never exhibit -** such behavior in its own use of mutexes.)^ -** -** ^(Some systems (for example, Windows 95) do not support the operation -** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ -** -** ^The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. ^(The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. SQLite will -** never do either.)^ -** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); -SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Methods Object -** -** An instance of this structure defines the low-level routines -** used to allocate and use mutexes. -** -** Usually, the default mutex implementations provided by SQLite are -** sufficient, however the user has the option of substituting a custom -** implementation for specialized deployments or systems for which SQLite -** does not provide a suitable implementation. In this case, the user -** creates and populates an instance of this structure to pass -** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. -** Additionally, an instance of this structure can be used as an -** output variable when querying the system for the current mutex -** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. -** -** ^The xMutexInit method defined by this structure is invoked as -** part of system initialization by the sqlite3_initialize() function. -** ^The xMutexInit routine is called by SQLite exactly once for each -** effective call to [sqlite3_initialize()]. -** -** ^The xMutexEnd method defined by this structure is invoked as -** part of system shutdown by the sqlite3_shutdown() function. The -** implementation of this method is expected to release all outstanding -** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. ^The xMutexEnd() -** interface is invoked exactly once for each call to [sqlite3_shutdown()]. -** -** ^(The remaining seven methods defined by this structure (xMutexAlloc, -** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and -** xMutexNotheld) implement the following interfaces (respectively): -** -**
      -**
    • [sqlite3_mutex_alloc()]
    • -**
    • [sqlite3_mutex_free()]
    • -**
    • [sqlite3_mutex_enter()]
    • -**
    • [sqlite3_mutex_try()]
    • -**
    • [sqlite3_mutex_leave()]
    • -**
    • [sqlite3_mutex_held()]
    • -**
    • [sqlite3_mutex_notheld()]
    • -**
    )^ -** -** The only difference is that the public sqlite3_XXX functions enumerated -** above silently ignore any invocations that pass a NULL pointer instead -** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results -** of passing a NULL pointer instead of a valid mutex handle are undefined -** (i.e. it is acceptable to provide an implementation that segfaults if -** it is passed a NULL pointer). -** -** The xMutexInit() method must be threadsafe. ^It must be harmless to -** invoke xMutexInit() multiple times within the same process and without -** intervening calls to xMutexEnd(). Second and subsequent calls to -** xMutexInit() must be no-ops. -** -** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. ^However xMutexAlloc() may use SQLite -** memory allocation for a fast or recursive mutex. -** -** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is -** called, but only if the prior call to xMutexInit returned SQLITE_OK. -** If xMutexInit fails in any way, it is expected to clean up after itself -** prior to returning. -*/ -typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; -struct sqlite3_mutex_methods -{ - int (*xMutexInit)(void); - int (*xMutexEnd)(void); - sqlite3_mutex *(*xMutexAlloc)(int); - void (*xMutexFree)(sqlite3_mutex *); - void (*xMutexEnter)(sqlite3_mutex *); - int (*xMutexTry)(sqlite3_mutex *); - void (*xMutexLeave)(sqlite3_mutex *); - int (*xMutexHeld)(sqlite3_mutex *); - int (*xMutexNotheld)(sqlite3_mutex *); -}; - -/* -** CAPI3REF: Mutex Verification Routines -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. ^The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. ^The SQLite core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. ^External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** ^These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. -** -** ^The implementation is not required to provide versions of these -** routines that actually work. If the implementation does not provide working -** versions of these routines, it should at least provide stubs that always -** return true so that one does not get spurious assertion failures. -** -** ^If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. ^The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -#ifndef NDEBUG -SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); -#endif - -/* -** CAPI3REF: Mutex Types -** -** The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. -** -** The set of static mutexes may change from one SQLite release to the -** next. Applications that override the built-in mutex logic must be -** prepared to accommodate additional static mutexes. -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ -#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ - -/* -** CAPI3REF: Retrieve the mutex for a database connection -** -** ^This interface returns a pointer the [sqlite3_mutex] object that -** serializes access to the [database connection] given in the argument -** when the [threading mode] is Serialized. -** ^If the [threading mode] is Single-thread or Multi-thread then this -** routine returns a NULL pointer. -*/ -SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); - -/* -** CAPI3REF: Low-Level Control Of Database Files -** -** ^The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. ^The -** name of the database is "main" for the main database or "temp" for the -** TEMP database, or the name that appears after the AS keyword for -** databases that are added using the [ATTACH] SQL command. -** ^A NULL pointer can be used in place of "main" to refer to the -** main database file. -** ^The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. ^The return value of the xFileControl -** method becomes the return value of this routine. -** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes -** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER -** case is a short-circuit path which does not actually invoke the -** underlying sqlite3_io_methods.xFileControl method. -** -** ^If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. ^This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. The underlying xFileControl method might -** also return SQLITE_ERROR. There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/* -** CAPI3REF: Testing Interface -** -** ^The sqlite3_test_control() interface is used to read out internal -** state of SQLite and to inject faults into SQLite for testing -** purposes. ^The first parameter is an operation code that determines -** the number, meaning, and operation of all subsequent parameters. -** -** This interface is not for use by applications. It exists solely -** for verifying the correct operation of the SQLite library. Depending -** on how the SQLite library is compiled, this interface might not exist. -** -** The details of the operation codes, their meanings, the parameters -** they take, and what they do are all subject to change without notice. -** Unlike most of the SQLite API, this function is not guaranteed to -** operate consistently from one release to the next. -*/ -SQLITE_API int sqlite3_test_control(int op, ...); - -/* -** CAPI3REF: Testing Interface Operation Codes -** -** These constants are the valid operation code parameters used -** as the first argument to [sqlite3_test_control()]. -** -** These parameters and their meanings are subject to change -** without notice. These values are for testing purposes only. -** Applications should not use any of these parameters or the -** [sqlite3_test_control()] interface. -*/ -#define SQLITE_TESTCTRL_FIRST 5 -#define SQLITE_TESTCTRL_PRNG_SAVE 5 -#define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 -#define SQLITE_TESTCTRL_BITVEC_TEST 8 -#define SQLITE_TESTCTRL_FAULT_INSTALL 9 -#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 -#define SQLITE_TESTCTRL_PENDING_BYTE 11 -#define SQLITE_TESTCTRL_ASSERT 12 -#define SQLITE_TESTCTRL_ALWAYS 13 -#define SQLITE_TESTCTRL_RESERVE 14 -#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 -#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 -#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 -#define SQLITE_TESTCTRL_LAST 19 - -/* -** CAPI3REF: SQLite Runtime Status -** -** ^This interface is used to retrieve runtime status information -** about the performance of SQLite, and optionally to reset various -** highwater marks. ^The first argument is an integer code for -** the specific parameter to measure. ^(Recognized integer codes -** are of the form [status parameters | SQLITE_STATUS_...].)^ -** ^The current value of the parameter is returned into *pCurrent. -** ^The highest recorded value is returned in *pHighwater. ^If the -** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. ^(Some parameters do not record the highest -** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored.)^ -** ^(Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent.)^ -** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. -** -** See also: [sqlite3_db_status()] -*/ -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); - - -/* -** CAPI3REF: Status Parameters -** KEYWORDS: {status parameters} -** -** These integer constants designate various run-time status parameters -** that can be returned by [sqlite3_status()]. -** -**
    -** [[SQLITE_STATUS_MEMORY_USED]] ^(
    SQLITE_STATUS_MEMORY_USED
    -**
    This parameter is the current amount of memory checked out -** using [sqlite3_malloc()], either directly or indirectly. The -** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache -** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in -** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
    )^ -** -** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
    SQLITE_STATUS_MALLOC_SIZE
    -**
    This parameter records the largest memory allocation request -** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their -** internal equivalents). Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    )^ -** -** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
    SQLITE_STATUS_MALLOC_COUNT
    -**
    This parameter records the number of separate memory allocations -** currently checked out.
    )^ -** -** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
    SQLITE_STATUS_PAGECACHE_USED
    -**
    This parameter returns the number of pages used out of the -** [pagecache memory allocator] that was configured using -** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
    )^ -** -** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] -** ^(
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    -**
    This parameter returns the number of bytes of page cache -** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] -** buffer and where forced to overflow to [sqlite3_malloc()]. The -** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to -** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
    )^ -** -** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    -**
    This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    )^ -** -** [[SQLITE_STATUS_SCRATCH_USED]] ^(
    SQLITE_STATUS_SCRATCH_USED
    -**
    This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
    )^ -** -** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
    SQLITE_STATUS_SCRATCH_OVERFLOW
    -**
    This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -**
    )^ -** -** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(
    SQLITE_STATUS_SCRATCH_SIZE
    -**
    This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
    )^ -** -** [[SQLITE_STATUS_PARSER_STACK]] ^(
    SQLITE_STATUS_PARSER_STACK
    -**
    This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
    )^ -**
    -** -** New status parameters may be added from time to time. -*/ -#define SQLITE_STATUS_MEMORY_USED 0 -#define SQLITE_STATUS_PAGECACHE_USED 1 -#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 -#define SQLITE_STATUS_MALLOC_SIZE 5 -#define SQLITE_STATUS_PARSER_STACK 6 -#define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 -#define SQLITE_STATUS_MALLOC_COUNT 9 - -/* -** CAPI3REF: Database Connection Status -** -** ^This interface is used to retrieve runtime status information -** about a single [database connection]. ^The first argument is the -** database connection object to be interrogated. ^The second argument -** is an integer constant, taken from the set of -** [SQLITE_DBSTATUS options], that -** determines the parameter to interrogate. The set of -** [SQLITE_DBSTATUS options] is likely -** to grow in future releases of SQLite. -** -** ^The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. ^If -** the resetFlg is true, then the highest instantaneous value is -** reset back down to the current value. -** -** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. -*/ -SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); - -/* -** CAPI3REF: Status Parameters for database connections -** KEYWORDS: {SQLITE_DBSTATUS options} -** -** These constants are the available integer "verbs" that can be passed as -** the second argument to the [sqlite3_db_status()] interface. -** -** New verbs may be added in future releases of SQLite. Existing verbs -** might be discontinued. Applications should check the return code from -** [sqlite3_db_status()] to make sure that the call worked. -** The [sqlite3_db_status()] interface will return a non-zero error code -** if a discontinued or unsupported verb is invoked. -** -**
    -** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_USED
    -**
    This parameter returns the number of lookaside memory slots currently -** checked out.
    )^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_HIT
    -**
    This parameter returns the number malloc attempts that were -** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] -** ^(
    SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
    -**
    This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to the amount of -** memory requested being larger than the lookaside slot size. -** Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] -** ^(
    SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
    -**
    This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to all lookaside -** memory already being in use. -** Only the high-water value is meaningful; -** the current value is always zero.)^ -** -** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
    SQLITE_DBSTATUS_CACHE_USED
    -**
    This parameter returns the approximate number of of bytes of heap -** memory used by all pager caches associated with the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. -** -** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
    SQLITE_DBSTATUS_SCHEMA_USED
    -**
    This parameter returns the approximate number of of bytes of heap -** memory used to store the schema for all databases associated -** with the connection - main, temp, and any [ATTACH]-ed databases.)^ -** ^The full amount of memory used by the schemas is reported, even if the -** schema memory is shared with other database connections due to -** [shared cache mode] being enabled. -** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. -** -** [[SQLITE_DBSTATUS_STMT_USED]] ^(
    SQLITE_DBSTATUS_STMT_USED
    -**
    This parameter returns the approximate number of of bytes of heap -** and lookaside memory used by all prepared statements associated with -** the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. -**
    -** -** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
    SQLITE_DBSTATUS_CACHE_HIT
    -**
    This parameter returns the number of pager cache hits that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT -** is always 0. -**
    -** -** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
    SQLITE_DBSTATUS_CACHE_MISS
    -**
    This parameter returns the number of pager cache misses that have -** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS -** is always 0. -**
    -** -** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
    SQLITE_DBSTATUS_CACHE_WRITE
    -**
    This parameter returns the number of dirty cache entries that have -** been written to disk. Specifically, the number of pages written to the -** wal file in wal mode databases, or the number of pages written to the -** database file in rollback mode databases. Any pages written as part of -** transaction rollback or database recovery operations are not included. -** If an IO or other error occurs while writing a page to disk, the effect -** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The -** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. -**
    -** -** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
    SQLITE_DBSTATUS_DEFERRED_FKS
    -**
    This parameter returns zero for the current value if and only if -** all foreign key constraints (deferred or immediate) have been -** resolved.)^ ^The highwater mark is always 0. -**
    -**
    -*/ -#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 -#define SQLITE_DBSTATUS_CACHE_USED 1 -#define SQLITE_DBSTATUS_SCHEMA_USED 2 -#define SQLITE_DBSTATUS_STMT_USED 3 -#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 -#define SQLITE_DBSTATUS_CACHE_HIT 7 -#define SQLITE_DBSTATUS_CACHE_MISS 8 -#define SQLITE_DBSTATUS_CACHE_WRITE 9 -#define SQLITE_DBSTATUS_DEFERRED_FKS 10 -#define SQLITE_DBSTATUS_MAX 10 /* Largest defined DBSTATUS */ - - -/* -** CAPI3REF: Prepared Statement Status -** -** ^(Each prepared statement maintains various -** [SQLITE_STMTSTATUS counters] that measure the number -** of times it has performed specific operations.)^ These counters can -** be used to monitor the performance characteristics of the prepared -** statements. For example, if the number of table steps greatly exceeds -** the number of table searches or result rows, that would tend to indicate -** that the prepared statement is using a full table scan rather than -** an index. -** -** ^(This interface is used to retrieve and reset counter values from -** a [prepared statement]. The first argument is the prepared statement -** object to be interrogated. The second argument -** is an integer code for a specific [SQLITE_STMTSTATUS counter] -** to be interrogated.)^ -** ^The current value of the requested counter is returned. -** ^If the resetFlg is true, then the counter is reset to zero after this -** interface call returns. -** -** See also: [sqlite3_status()] and [sqlite3_db_status()]. -*/ -SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); - -/* -** CAPI3REF: Status Parameters for prepared statements -** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} -** -** These preprocessor macros define integer codes that name counter -** values associated with the [sqlite3_stmt_status()] interface. -** The meanings of the various counters are as follows: -** -**
    -** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
    SQLITE_STMTSTATUS_FULLSCAN_STEP
    -**
    ^This is the number of times that SQLite has stepped forward in -** a table as part of a full table scan. Large numbers for this counter -** may indicate opportunities for performance improvement through -** careful use of indices.
    -** -** [[SQLITE_STMTSTATUS_SORT]]
    SQLITE_STMTSTATUS_SORT
    -**
    ^This is the number of sort operations that have occurred. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance through careful use of indices.
    -** -** [[SQLITE_STMTSTATUS_AUTOINDEX]]
    SQLITE_STMTSTATUS_AUTOINDEX
    -**
    ^This is the number of rows inserted into transient indices that -** were created automatically in order to help joins run faster. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance by adding permanent indices that do not -** need to be reinitialized each time the statement is run.
    -** -** [[SQLITE_STMTSTATUS_VM_STEP]]
    SQLITE_STMTSTATUS_VM_STEP
    -**
    ^This is the number of virtual machine operations executed -** by the prepared statement if that number is less than or equal -** to 2147483647. The number of virtual machine operations can be -** used as a proxy for the total work done by the prepared statement. -** If the number of virtual machine operations exceeds 2147483647 -** then the value returned by this statement status code is undefined. -**
    -**
    -*/ -#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 -#define SQLITE_STMTSTATUS_SORT 2 -#define SQLITE_STMTSTATUS_AUTOINDEX 3 -#define SQLITE_STMTSTATUS_VM_STEP 4 - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache type is opaque. It is implemented by -** the pluggable module. The SQLite core has no knowledge of -** its size or internal structure and never deals with the -** sqlite3_pcache object except by holding and passing pointers -** to the object. -** -** See [sqlite3_pcache_methods2] for additional information. -*/ -typedef struct sqlite3_pcache sqlite3_pcache; - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache_page object represents a single page in the -** page cache. The page cache will allocate instances of this -** object. Various methods of the page cache use pointers to instances -** of this object as parameters or as their return value. -** -** See [sqlite3_pcache_methods2] for additional information. -*/ -typedef struct sqlite3_pcache_page sqlite3_pcache_page; -struct sqlite3_pcache_page -{ - void *pBuf; /* The content of the page */ - void *pExtra; /* Extra information associated with the page */ -}; - -/* -** CAPI3REF: Application Defined Page Cache. -** KEYWORDS: {page cache} -** -** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can -** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods2 structure.)^ -** In many applications, most of the heap memory allocated by -** SQLite is used for the page cache. -** By implementing a -** custom page cache using this API, an application can better control -** the amount of memory consumed by SQLite, the way in which -** that memory is allocated and released, and the policies used to -** determine exactly which parts of a database file are cached and for -** how long. -** -** The alternative page cache mechanism is an -** extreme measure that is only needed by the most demanding applications. -** The built-in page cache is recommended for most uses. -** -** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an -** internal buffer by SQLite within the call to [sqlite3_config]. Hence -** the application may discard the parameter after the call to -** [sqlite3_config()] returns.)^ -** -** [[the xInit() page cache method]] -** ^(The xInit() method is called once for each effective -** call to [sqlite3_initialize()])^ -** (usually only once during the lifetime of the process). ^(The xInit() -** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ -** The intent of the xInit() method is to set up global data structures -** required by the custom page cache implementation. -** ^(If the xInit() method is NULL, then the -** built-in default page cache is used instead of the application defined -** page cache.)^ -** -** [[the xShutdown() page cache method]] -** ^The xShutdown() method is called by [sqlite3_shutdown()]. -** It can be used to clean up -** any outstanding resources before process shutdown, if required. -** ^The xShutdown() method may be NULL. -** -** ^SQLite automatically serializes calls to the xInit method, -** so the xInit method need not be threadsafe. ^The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. All other methods must be threadsafe -** in multithreaded applications. -** -** ^SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -** -** [[the xCreate() page cache methods]] -** ^SQLite invokes the xCreate() method to construct a new cache instance. -** SQLite will typically create one cache instance for each open database file, -** though this is not guaranteed. ^The -** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. ^szPage will always a power of two. ^The -** second parameter szExtra is a number of bytes of extra storage -** associated with each page cache entry. ^The szExtra parameter will -** a number less than 250. SQLite will use the -** extra szExtra bytes on each page to store metadata about the underlying -** database page on disk. The value passed into szExtra depends -** on the SQLite version, the target platform, and how SQLite was compiled. -** ^The third argument to xCreate(), bPurgeable, is true if the cache being -** created will be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation -** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will -** never invoke xUnpin() except to deliberately delete a page. -** ^In other words, calls to xUnpin() on a cache with bPurgeable set to -** false will always have the "discard" flag set to true. -** ^Hence, a cache created with bPurgeable false will -** never contain any unpinned pages. -** -** [[the xCachesize() page cache method]] -** ^(The xCachesize() method may be called at any time by SQLite to set the -** suggested maximum cache-size (number of pages stored by) the cache -** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable -** parameter, the implementation is not required to do anything with this -** value; it is advisory only. -** -** [[the xPagecount() page cache methods]] -** The xPagecount() method must return the number of pages currently -** stored in the cache, both pinned and unpinned. -** -** [[the xFetch() page cache methods]] -** The xFetch() method locates a page in the cache and returns a pointer to -** an sqlite3_pcache_page object associated with that page, or a NULL pointer. -** The pBuf element of the returned sqlite3_pcache_page object will be a -** pointer to a buffer of szPage bytes used to store the content of a -** single database page. The pExtra element of sqlite3_pcache_page will be -** a pointer to the szExtra bytes of extra storage that SQLite has requested -** for each entry in the page cache. -** -** The page to be fetched is determined by the key. ^The minimum key value -** is 1. After it has been retrieved using xFetch, the page is considered -** to be "pinned". -** -** If the requested page is already in the page cache, then the page cache -** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the -** cache implementation should use the value of the createFlag -** parameter to help it determined what action to take: -** -** -**
    createFlag Behavior when page is not already in cache -**
    0 Do not allocate a new page. Return NULL. -**
    1 Allocate a new page if it easy and convenient to do so. -** Otherwise return NULL. -**
    2 Make every effort to allocate a new page. Only return -** NULL if allocating a new page is effectively impossible. -**
    -** -** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite -** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may -** attempt to unpin one or more cache pages by spilling the content of -** pinned pages to disk and synching the operating system disk cache. -** -** [[the xUnpin() page cache method]] -** ^xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, -** then the page must be evicted from the cache. -** ^If the discard parameter is -** zero, then the page may be discarded or retained at the discretion of -** page cache implementation. ^The page cache implementation -** may choose to evict unpinned pages at any time. -** -** The cache must not perform any reference counting. A single -** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). -** -** [[the xRekey() page cache methods]] -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument. If the cache -** previously contains an entry associated with newKey, it must be -** discarded. ^Any prior cache entry associated with newKey is guaranteed not -** to be pinned. -** -** When SQLite calls the xTruncate() method, the cache must discard all -** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any -** of these pages are pinned, they are implicitly unpinned, meaning that -** they can be safely discarded. -** -** [[the xDestroy() page cache method]] -** ^The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. ^After -** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] -** handle invalid, and will not use it with any other sqlite3_pcache_methods2 -** functions. -** -** [[the xShrink() page cache method]] -** ^SQLite invokes the xShrink() method when it wants the page cache to -** free up as much of heap memory as possible. The page cache implementation -** is not obligated to free any memory, but well-behaved implementations should -** do their best. -*/ -typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; -struct sqlite3_pcache_methods2 -{ - int iVersion; - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); - void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, - unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); - void (*xShrink)(sqlite3_pcache*); -}; - -/* -** This is the obsolete pcache_methods object that has now been replaced -** by sqlite3_pcache_methods2. This object is not used by SQLite. It is -** retained in the header file for backwards compatibility only. -*/ -typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; -struct sqlite3_pcache_methods -{ - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, void*, int discard); - void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); -}; - - -/* -** CAPI3REF: Online Backup Object -** -** The sqlite3_backup object records state information about an ongoing -** online backup operation. ^The sqlite3_backup object is created by -** a call to [sqlite3_backup_init()] and is destroyed by a call to -** [sqlite3_backup_finish()]. -** -** See Also: [Using the SQLite Online Backup API] -*/ -typedef struct sqlite3_backup sqlite3_backup; - -/* -** CAPI3REF: Online Backup API. -** -** The backup API copies the content of one database into another. -** It is useful either for creating backups of databases or -** for copying in-memory databases to or from persistent files. -** -** See Also: [Using the SQLite Online Backup API] -** -** ^SQLite holds a write transaction open on the destination database file -** for the duration of the backup operation. -** ^The source database is read-locked only while it is being read; -** it is not locked continuously for the entire backup operation. -** ^Thus, the backup may be performed on a live source database without -** preventing other database connections from -** reading or writing to the source database while the backup is underway. -** -** ^(To perform a backup operation: -**
      -**
    1. sqlite3_backup_init() is called once to initialize the -** backup, -**
    2. sqlite3_backup_step() is called one or more times to transfer -** the data between the two databases, and finally -**
    3. sqlite3_backup_finish() is called to release all resources -** associated with the backup operation. -**
    )^ -** There should be exactly one call to sqlite3_backup_finish() for each -** successful call to sqlite3_backup_init(). -** -** [[sqlite3_backup_init()]] sqlite3_backup_init() -** -** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the -** [database connection] associated with the destination database -** and the database name, respectively. -** ^The database name is "main" for the main database, "temp" for the -** temporary database, or the name specified after the AS keyword in -** an [ATTACH] statement for an attached database. -** ^The S and M arguments passed to -** sqlite3_backup_init(D,N,S,M) identify the [database connection] -** and database name of the source database, respectively. -** ^The source and destination [database connections] (parameters S and D) -** must be different or else sqlite3_backup_init(D,N,S,M) will fail with -** an error. -** -** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is -** returned and an error code and error message are stored in the -** destination [database connection] D. -** ^The error code and message for the failed call to sqlite3_backup_init() -** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or -** [sqlite3_errmsg16()] functions. -** ^A successful call to sqlite3_backup_init() returns a pointer to an -** [sqlite3_backup] object. -** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and -** sqlite3_backup_finish() functions to perform the specified backup -** operation. -** -** [[sqlite3_backup_step()]] sqlite3_backup_step() -** -** ^Function sqlite3_backup_step(B,N) will copy up to N pages between -** the source and destination databases specified by [sqlite3_backup] object B. -** ^If N is negative, all remaining source pages are copied. -** ^If sqlite3_backup_step(B,N) successfully copies N pages and there -** are still more pages to be copied, then the function returns [SQLITE_OK]. -** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages -** from source to destination, then it returns [SQLITE_DONE]. -** ^If an error occurs while running sqlite3_backup_step(B,N), -** then an [error code] is returned. ^As well as [SQLITE_OK] and -** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], -** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. -** -** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if -**
      -**
    1. the destination database was opened read-only, or -**
    2. the destination database is using write-ahead-log journaling -** and the destination and source page sizes differ, or -**
    3. the destination database is an in-memory database and the -** destination and source page sizes differ. -**
    )^ -** -** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then -** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). ^If the -** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. ^In this case the call to -** sqlite3_backup_step() can be retried later. ^If the source -** [database connection] -** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this -** case the call to sqlite3_backup_step() can be retried later on. ^(If -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or -** [SQLITE_READONLY] is returned, then -** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal.)^ The application must accept -** that the backup operation has failed and pass the backup operation handle -** to the sqlite3_backup_finish() to release associated resources. -** -** ^The first call to sqlite3_backup_step() obtains an exclusive lock -** on the destination file. ^The exclusive lock is not released until either -** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to -** sqlite3_backup_step() obtains a [shared lock] on the source database that -** lasts for the duration of the sqlite3_backup_step() call. -** ^Because the source database is not locked between calls to -** sqlite3_backup_step(), the source database may be modified mid-way -** through the backup process. ^If the source database is modified by an -** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be automatically -** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is automatically -** updated at the same time. -** -** [[sqlite3_backup_finish()]] sqlite3_backup_finish() -** -** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the application -** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). -** ^The sqlite3_backup_finish() interfaces releases all -** resources associated with the [sqlite3_backup] object. -** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any -** active write-transaction on the destination database is rolled back. -** The [sqlite3_backup] object is invalid -** and may not be used following a call to sqlite3_backup_finish(). -** -** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not -** sqlite3_backup_step() completed. -** ^If an out-of-memory condition or IO error occurred during any prior -** sqlite3_backup_step() call on the same [sqlite3_backup] object, then -** sqlite3_backup_finish() returns the corresponding [error code]. -** -** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() -** is not a permanent error and does not affect the return value of -** sqlite3_backup_finish(). -** -** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] -** sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. -** -** Concurrent Usage of Database Handles -** -** ^The source [database connection] may be used by the application for other -** purposes while a backup operation is underway or being initialized. -** ^If SQLite is compiled and configured to support threadsafe database -** connections, then the source database connection may be used concurrently -** from within other threads. -** -** However, the application must guarantee that the destination -** [database connection] is not passed to any other API (by any thread) after -** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). SQLite does not currently check to see -** if the application incorrectly accesses the destination [database connection] -** and so no error code is reported, but the operations may malfunction -** nevertheless. Use of the destination database connection while a -** backup is in progress might also also cause a mutex deadlock. -** -** If running in [shared cache mode], the application must -** guarantee that the shared cache used by the destination database -** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the disk file being -** backed up to is not accessed by any connection within the process, -** not just the specific connection that was passed to sqlite3_backup_init(). -** -** The [sqlite3_backup] object itself is partially threadsafe. Multiple -** threads may safely make multiple concurrent calls to sqlite3_backup_step(). -** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** APIs are not strictly speaking threadsafe. If they are invoked at the -** same time as another thread is invoking sqlite3_backup_step() it is -** possible that they return invalid values. -*/ -SQLITE_API sqlite3_backup *sqlite3_backup_init( - sqlite3 *pDest, /* Destination database handle */ - const char *zDestName, /* Destination database name */ - sqlite3 *pSource, /* Source database handle */ - const char *zSourceName /* Source database name */ -); -SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); -SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); - -/* -** CAPI3REF: Unlock Notification -** -** ^When running in shared-cache mode, a database operation may fail with -** an [SQLITE_LOCKED] error if the required locks on the shared-cache or -** individual tables within the shared-cache cannot be obtained. See -** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** ^This API may be used to register a callback that SQLite will invoke -** when the connection currently holding the required lock relinquishes it. -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. -** -** See Also: [Using the SQLite Unlock Notification Feature]. -** -** ^Shared-cache locks are released when a database connection concludes -** its current transaction, either by committing it or rolling it back. -** -** ^When a connection (known as the blocked connection) fails to obtain a -** shared-cache lock and SQLITE_LOCKED is returned to the caller, the -** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. ^After an -** application receives an SQLITE_LOCKED error, it may call the -** sqlite3_unlock_notify() method with the blocked connection handle as -** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. ^The -** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. -** -** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, -** there is a chance that the blocking connection will have already -** concluded its transaction by the time sqlite3_unlock_notify() is invoked. -** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify().)^ -** -** ^If the blocked connection is attempting to obtain a write-lock on a -** shared-cache table, and more than one other connection currently holds -** a read-lock on the same table, then SQLite arbitrarily selects one of -** the other connections to use as the blocking connection. -** -** ^(There may be at most one unlock-notify callback registered by a -** blocked connection. If sqlite3_unlock_notify() is called when the -** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is -** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is canceled. ^The blocked connections -** unlock-notify callback may also be canceled by closing the blocked -** connection using [sqlite3_close()]. -** -** The unlock-notify callback is not reentrant. If an application invokes -** any sqlite3_xxx API functions from within an unlock-notify callback, a -** crash or deadlock may be the result. -** -** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always -** returns SQLITE_OK. -** -** Callback Invocation Details -** -** When an unlock-notify callback is registered, the application provides a -** single void* pointer that is passed to the callback when it is invoked. -** However, the signature of the callback function allows SQLite to pass -** it an array of void* context pointers. The first argument passed to -** an unlock-notify callback is a pointer to an array of void* pointers, -** and the second is the number of entries in the array. -** -** When a blocking connections transaction is concluded, there may be -** more than one blocked connection that has registered for an unlock-notify -** callback. ^If two or more such blocked connections have specified the -** same callback function, then instead of invoking the callback function -** multiple times, it is invoked once with the set of void* context pointers -** specified by the blocked connections bundled together into an array. -** This gives the application an opportunity to prioritize any actions -** related to the set of unblocked database connections. -** -** Deadlock Detection -** -** Assuming that after registering for an unlock-notify callback a -** database waits for the callback to be issued before taking any further -** action (a reasonable assumption), then using this API may cause the -** application to deadlock. For example, if connection X is waiting for -** connection Y's transaction to be concluded, and similarly connection -** Y is waiting on connection X's transaction, then neither connection -** will proceed and the system may remain deadlocked indefinitely. -** -** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. ^If a given call to sqlite3_unlock_notify() would put the -** system in a deadlocked state, then SQLITE_LOCKED is returned and no -** unlock-notify callback is registered. The system is said to be in -** a deadlocked state if connection A has registered for an unlock-notify -** callback on the conclusion of connection B's transaction, and connection -** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. ^Indirect deadlock is also detected, so -** the system is also considered to be deadlocked if connection B has -** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. ^Any -** number of levels of indirection are allowed. -** -** The "DROP TABLE" Exception -** -** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost -** always appropriate to call sqlite3_unlock_notify(). There is however, -** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, -** SQLite checks if there are any currently executing SELECT statements -** that belong to the same connection. If there are, SQLITE_LOCKED is -** returned. In this case there is no "blocking connection", so invoking -** sqlite3_unlock_notify() results in the unlock-notify callback being -** invoked immediately. If the application then re-attempts the "DROP TABLE" -** or "DROP INDEX" query, an infinite loop might be the result. -** -** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. ^(If there is a blocking connection, then the -** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in -** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED.)^ -*/ -SQLITE_API int sqlite3_unlock_notify( - sqlite3 *pBlocked, /* Waiting connection */ - void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ - void *pNotifyArg /* Argument to pass to xNotify */ -); - - -/* -** CAPI3REF: String Comparison -** -** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications -** and extensions to compare the contents of two buffers containing UTF-8 -** strings in a case-independent fashion, using the same definition of "case -** independence" that SQLite uses internally when comparing identifiers. -*/ -SQLITE_API int sqlite3_stricmp(const char *, const char *); -SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); - -/* -** CAPI3REF: String Globbing -* -** ^The [sqlite3_strglob(P,X)] interface returns zero if string X matches -** the glob pattern P, and it returns non-zero if string X does not match -** the glob pattern P. ^The definition of glob pattern matching used in -** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the -** SQL dialect used by SQLite. ^The sqlite3_strglob(P,X) function is case -** sensitive. -** -** Note that this routine returns zero on a match and non-zero if the strings -** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. -*/ -SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); - -/* -** CAPI3REF: Error Logging Interface -** -** ^The [sqlite3_log()] interface writes a message into the [error log] -** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. -** ^If logging is enabled, the zFormat string and subsequent arguments are -** used with [sqlite3_snprintf()] to generate the final output string. -** -** The sqlite3_log() interface is intended for use by extensions such as -** virtual tables, collating functions, and SQL functions. While there is -** nothing to prevent an application from calling sqlite3_log(), doing so -** is considered bad form. -** -** The zFormat string must not be NULL. -** -** To avoid deadlocks and other threading problems, the sqlite3_log() routine -** will not use dynamically allocated memory. The log message is stored in -** a fixed-length buffer on the stack. If the log message is longer than -** a few hundred characters, it will be truncated to the length of the -** buffer. -*/ -SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); - -/* -** CAPI3REF: Write-Ahead Log Commit Hook -** -** ^The [sqlite3_wal_hook()] function is used to register a callback that -** will be invoked each time a database connection commits data to a -** [write-ahead log] (i.e. whenever a transaction is committed in -** [journal_mode | journal_mode=WAL mode]). -** -** ^The callback is invoked by SQLite after the commit has taken place and -** the associated write-lock on the database released, so the implementation -** may read, write or [checkpoint] the database as required. -** -** ^The first parameter passed to the callback function when it is invoked -** is a copy of the third parameter passed to sqlite3_wal_hook() when -** registering the callback. ^The second is a copy of the database handle. -** ^The third parameter is the name of the database that was written to - -** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter -** is the number of pages currently in the write-ahead log file, -** including those that were just committed. -** -** The callback function should normally return [SQLITE_OK]. ^If an error -** code is returned, that error will propagate back up through the -** SQLite code base to cause the statement that provoked the callback -** to report an error, though the commit will have still occurred. If the -** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value -** that does not correspond to any valid SQLite error code, the results -** are undefined. -** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^Note that the -** [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. -*/ -SQLITE_API void *sqlite3_wal_hook( - sqlite3*, - int(*)(void *,sqlite3*,const char*,int), - void* -); - -/* -** CAPI3REF: Configure an auto-checkpoint -** -** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around -** [sqlite3_wal_hook()] that causes any database on [database connection] D -** to automatically [checkpoint] -** after committing a transaction if there are N or -** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic -** checkpoints entirely. -** -** ^The callback registered by this function replaces any existing callback -** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback -** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism -** configured by this function. -** -** ^The [wal_autocheckpoint pragma] can be used to invoke this interface -** from SQL. -** -** ^Every new [database connection] defaults to having the auto-checkpoint -** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. -*/ -SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); - -/* -** CAPI3REF: Checkpoint a database -** -** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X -** on [database connection] D to be [checkpointed]. ^If X is NULL or an -** empty string, then a checkpoint is run on all databases of -** connection D. ^If the database connection D is not in -** [WAL | write-ahead log mode] then this interface is a harmless no-op. -** -** ^The [wal_checkpoint pragma] can be used to invoke this interface -** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] can be used to cause this interface to be -** run whenever the WAL reaches a certain size threshold. -** -** See also: [sqlite3_wal_checkpoint_v2()] -*/ -SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); - -/* -** CAPI3REF: Checkpoint a database -** -** Run a checkpoint operation on WAL database zDb attached to database -** handle db. The specific operation is determined by the value of the -** eMode parameter: -** -**
    -**
    SQLITE_CHECKPOINT_PASSIVE
    -** Checkpoint as many frames as possible without waiting for any database -** readers or writers to finish. Sync the db file if all frames in the log -** are checkpointed. This mode is the same as calling -** sqlite3_wal_checkpoint(). The busy-handler callback is never invoked. -** -**
    SQLITE_CHECKPOINT_FULL
    -** This mode blocks (calls the busy-handler callback) until there is no -** database writer and all readers are reading from the most recent database -** snapshot. It then checkpoints all frames in the log file and syncs the -** database file. This call blocks database writers while it is running, -** but not database readers. -** -**
    SQLITE_CHECKPOINT_RESTART
    -** This mode works the same way as SQLITE_CHECKPOINT_FULL, except after -** checkpointing the log file it blocks (calls the busy-handler callback) -** until all readers are reading from the database file only. This ensures -** that the next client to write to the database file restarts the log file -** from the beginning. This call blocks database writers while it is running, -** but not database readers. -**
    -** -** If pnLog is not NULL, then *pnLog is set to the total number of frames in -** the log file before returning. If pnCkpt is not NULL, then *pnCkpt is set to -** the total number of checkpointed frames (including any that were already -** checkpointed when this function is called). *pnLog and *pnCkpt may be -** populated even if sqlite3_wal_checkpoint_v2() returns other than SQLITE_OK. -** If no values are available because of an error, they are both set to -1 -** before returning to communicate this to the caller. -** -** All calls obtain an exclusive "checkpoint" lock on the database file. If -** any other process is running a checkpoint operation at the same time, the -** lock cannot be obtained and SQLITE_BUSY is returned. Even if there is a -** busy-handler configured, it will not be invoked in this case. -** -** The SQLITE_CHECKPOINT_FULL and RESTART modes also obtain the exclusive -** "writer" lock on the database file. If the writer lock cannot be obtained -** immediately, and a busy-handler is configured, it is invoked and the writer -** lock retried until either the busy-handler returns 0 or the lock is -** successfully obtained. The busy-handler is also invoked while waiting for -** database readers as described above. If the busy-handler returns 0 before -** the writer lock is obtained or while waiting for database readers, the -** checkpoint operation proceeds from that point in the same way as -** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible -** without blocking any further. SQLITE_BUSY is returned in this case. -** -** If parameter zDb is NULL or points to a zero length string, then the -** specified operation is attempted on all WAL databases. In this case the -** values written to output parameters *pnLog and *pnCkpt are undefined. If -** an SQLITE_BUSY error is encountered when processing one or more of the -** attached WAL databases, the operation is still attempted on any remaining -** attached databases and SQLITE_BUSY is returned to the caller. If any other -** error occurs while processing an attached database, processing is abandoned -** and the error code returned to the caller immediately. If no error -** (SQLITE_BUSY or otherwise) is encountered while processing the attached -** databases, SQLITE_OK is returned. -** -** If database zDb is the name of an attached database that is not in WAL -** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. If -** zDb is not NULL (or a zero length string) and is not the name of any -** attached database, SQLITE_ERROR is returned to the caller. -*/ -SQLITE_API int sqlite3_wal_checkpoint_v2( - sqlite3 *db, /* Database handle */ - const char *zDb, /* Name of attached database (or NULL) */ - int eMode, /* SQLITE_CHECKPOINT_* value */ - int *pnLog, /* OUT: Size of WAL log in frames */ - int *pnCkpt /* OUT: Total number of frames checkpointed */ -); - -/* -** CAPI3REF: Checkpoint operation parameters -** -** These constants can be used as the 3rd parameter to -** [sqlite3_wal_checkpoint_v2()]. See the [sqlite3_wal_checkpoint_v2()] -** documentation for additional information about the meaning and use of -** each of these values. -*/ -#define SQLITE_CHECKPOINT_PASSIVE 0 -#define SQLITE_CHECKPOINT_FULL 1 -#define SQLITE_CHECKPOINT_RESTART 2 - -/* -** CAPI3REF: Virtual Table Interface Configuration -** -** This function may be called by either the [xConnect] or [xCreate] method -** of a [virtual table] implementation to configure -** various facets of the virtual table interface. -** -** If this interface is invoked outside the context of an xConnect or -** xCreate virtual table method then the behavior is undefined. -** -** At present, there is only one option that may be configured using -** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options -** may be added in the future. -*/ -SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Virtual Table Configuration Options -** -** These macros define the various options to the -** [sqlite3_vtab_config()] interface that [virtual table] implementations -** can use to customize and optimize their behavior. -** -**
    -**
    SQLITE_VTAB_CONSTRAINT_SUPPORT -**
    Calls of the form -** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, -** where X is an integer. If X is zero, then the [virtual table] whose -** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not -** support constraints. In this configuration (which is the default) if -** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire -** statement is rolled back as if [ON CONFLICT | OR ABORT] had been -** specified as part of the users SQL statement, regardless of the actual -** ON CONFLICT mode specified. -** -** If X is non-zero, then the virtual table implementation guarantees -** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before -** any modifications to internal or persistent data structures have been made. -** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite -** is able to roll back a statement or database transaction, and abandon -** or continue processing the current SQL statement as appropriate. -** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns -** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode -** had been ABORT. -** -** Virtual table implementations that are required to handle OR REPLACE -** must do so within the [xUpdate] method. If a call to the -** [sqlite3_vtab_on_conflict()] function indicates that the current ON -** CONFLICT policy is REPLACE, the virtual table implementation should -** silently replace the appropriate rows within the xUpdate callback and -** return SQLITE_OK. Or, if this is not possible, it may return -** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT -** constraint handling. -**
    -*/ -#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 - -/* -** CAPI3REF: Determine The Virtual Table Conflict Policy -** -** This function may only be called from within a call to the [xUpdate] method -** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The -** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], -** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode -** of the SQL statement that triggered the call to the [xUpdate] method of the -** [virtual table]. -*/ -SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); - -/* -** CAPI3REF: Conflict resolution modes -** -** These constants are returned by [sqlite3_vtab_on_conflict()] to -** inform a [virtual table] implementation what the [ON CONFLICT] mode -** is for the SQL statement being evaluated. -** -** Note that the [SQLITE_IGNORE] constant is also used as a potential -** return value from the [sqlite3_set_authorizer()] callback and that -** [SQLITE_ABORT] is also a [result code]. -*/ -#define SQLITE_ROLLBACK 1 -/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ -#define SQLITE_FAIL 3 -/* #define SQLITE_ABORT 4 // Also an error code */ -#define SQLITE_REPLACE 5 - - - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#ifdef __cplusplus -} /* End of the 'extern "C"' block */ -#endif -#endif /* _SQLITE3_H_ */ - -/* -** 2010 August 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -*/ - -#ifndef _SQLITE3RTREE_H_ -#define _SQLITE3RTREE_H_ - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; - -/* -** Register a geometry callback named zGeom that can be used as part of an -** R-Tree geometry query as follows: -** -** SELECT ... FROM WHERE MATCH $zGeom(... params ...) -*/ -SQLITE_API int sqlite3_rtree_geometry_callback( - sqlite3 *db, - const char *zGeom, -#ifdef SQLITE_RTREE_INT_ONLY - int (*xGeom)(sqlite3_rtree_geometry*, int n, sqlite3_int64 *a, int *pRes), -#else - int (*xGeom)(sqlite3_rtree_geometry*, int n, double *a, int *pRes), -#endif - void *pContext -); - - -/* -** A pointer to a structure of the following type is passed as the first -** argument to callbacks registered using rtree_geometry_callback(). -*/ -struct sqlite3_rtree_geometry -{ - void *pContext; /* Copy of pContext passed to s_r_g_c() */ - int nParam; /* Size of array aParam[] */ - double *aParam; /* Parameters passed to SQL geom function */ - void *pUser; /* Callback implementation user data */ - void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ -}; - - -#ifdef __cplusplus -} /* end of the 'extern "C"' block */ -#endif - -#endif /* ifndef _SQLITE3RTREE_H_ */ - diff --git a/x64_dbg_dbg/sqlite/sqlite32.lib b/x64_dbg_dbg/sqlite/sqlite32.lib deleted file mode 100644 index 26f1011090f74e6518fbf0fdc0ec19b5cd319fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48100 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 X^p={R@df_l)^?9*jka0ZG~<5(Bh@i3 diff --git a/x64_dbg_dbg/sqlite/sqlite64.lib b/x64_dbg_dbg/sqlite/sqlite64.lib deleted file mode 100644 index 5c1c114cde3f7642a20ab3c7d033d5f3dcd2e8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47100 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 - @@ -66,8 +65,6 @@ - - @@ -130,7 +127,7 @@ Windows true true - DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;sqlite\sqlite32.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) @@ -145,7 +142,7 @@ Windows true true - DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;sqlite\sqlite64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index 1ddb6844..f1f13f21 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -19,9 +19,6 @@ {5623fb24-3b6d-49a6-a0d3-1cfcc46f87bd} - - {fa9d17d3-a464-4693-b1d8-0d0c10a88bd1} - {c7d6554c-6b4c-42b2-8d0a-7968cdfdba63} @@ -90,9 +87,6 @@ Source Files - - Source Files - Source Files @@ -179,9 +173,6 @@ Header Files - - Header Files - Header Files @@ -239,9 +230,6 @@ Header Files\TitanEngine - - Header Files\sqlite - Header Files\DeviceNameResolver From f3d7e7079703371b73aefb3289411fc177940af2 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 19:46:33 +0200 Subject: [PATCH 109/676] PROJECT: updated help template + removed CodeBlocks project files --- help/template/fixedtop.htm | 3 +- x64_dbg.workspace | 8 -- x64_dbg_bridge/x64_dbg_bridge.cbp | 67 ------------- x64_dbg_dbg/x64_dbg_dbg.cbp | 153 ------------------------------ x64_dbg_exe/x64_dbg_exe.cbp | 56 ----------- 5 files changed, 1 insertion(+), 286 deletions(-) delete mode 100644 x64_dbg.workspace delete mode 100644 x64_dbg_bridge/x64_dbg_bridge.cbp delete mode 100644 x64_dbg_dbg/x64_dbg_dbg.cbp delete mode 100644 x64_dbg_exe/x64_dbg_exe.cbp diff --git a/help/template/fixedtop.htm b/help/template/fixedtop.htm index 9e8c0f4b..27ba79a8 100644 --- a/help/template/fixedtop.htm +++ b/help/template/fixedtop.htm @@ -52,8 +52,7 @@ window.onafterprint = d_onafterprint;

    ($content$)


    x64_dbg, No - Copyright  +href="http://x64dbg.com" target=_blank>x64_dbg, GPLv3  diff --git a/x64_dbg.workspace b/x64_dbg.workspace deleted file mode 100644 index e48a355d..00000000 --- a/x64_dbg.workspace +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/x64_dbg_bridge/x64_dbg_bridge.cbp b/x64_dbg_bridge/x64_dbg_bridge.cbp deleted file mode 100644 index 2b583ed1..00000000 --- a/x64_dbg_bridge/x64_dbg_bridge.cbp +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - diff --git a/x64_dbg_dbg/x64_dbg_dbg.cbp b/x64_dbg_dbg/x64_dbg_dbg.cbp deleted file mode 100644 index cbcdd966..00000000 --- a/x64_dbg_dbg/x64_dbg_dbg.cbp +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - diff --git a/x64_dbg_exe/x64_dbg_exe.cbp b/x64_dbg_exe/x64_dbg_exe.cbp deleted file mode 100644 index ac7618b5..00000000 --- a/x64_dbg_exe/x64_dbg_exe.cbp +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - From 40064068bd4cef426b2ee34bb8db06ea1db55f79 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 19:47:36 +0200 Subject: [PATCH 110/676] GUI: fixed a coloring bug with CIP --- x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp index 5c14fd68..a0bd0988 100644 --- a/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/Disassembly.cpp @@ -143,6 +143,8 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse QColor bpColor=ConfigColor("DisassemblyBreakpointBackgroundColor"); if(!bpColor.alpha()) //we don't want transparent text bpColor=ConfigColor("DisassemblyBreakpointColor"); + if(bpColor==ConfigColor("DisassemblyCipBackgroundColor")) + bpColor=ConfigColor("DisassemblyCipColor"); painter->setPen(QPen(bpColor)); } else if(bpxtype&bp_hardware) //hardware breakpoint only @@ -150,6 +152,8 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse QColor hwbpColor=ConfigColor("DisassemblyHardwareBreakpointBackgroundColor"); if(!hwbpColor.alpha()) //we don't want transparent text hwbpColor=ConfigColor("DisassemblyHardwareBreakpointColor"); + if(hwbpColor==ConfigColor("DisassemblyCipBackgroundColor")) + hwbpColor=ConfigColor("DisassemblyCipColor"); painter->setPen(hwbpColor); } else //no breakpoint @@ -162,6 +166,8 @@ QString Disassembly::paintContent(QPainter* painter, int_t rowBase, int rowOffse QColor bookmarkColor=ConfigColor("DisassemblyBookmarkBackgroundColor"); if(!bookmarkColor.alpha()) //we don't want transparent text bookmarkColor=ConfigColor("DisassemblyBookmarkColor"); + if(bookmarkColor==ConfigColor("DisassemblyCipBackgroundColor")) + bookmarkColor=ConfigColor("DisassemblyCipColor"); painter->setPen(QPen(bookmarkColor)); } } From c43d7428c9972294617dfd639940b20c50e3a849 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 19:50:34 +0200 Subject: [PATCH 111/676] DBG: renamed global variable --- x64_dbg_dbg/_global.cpp | 2 +- x64_dbg_dbg/_global.h | 2 +- x64_dbg_dbg/addrinfo.cpp | 1 - x64_dbg_dbg/debugger.cpp | 2 +- x64_dbg_dbg/x64_dbg.cpp | 5 +++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp index a58e4a19..a3b7d298 100644 --- a/x64_dbg_dbg/_global.cpp +++ b/x64_dbg_dbg/_global.cpp @@ -3,7 +3,7 @@ #include HINSTANCE hInst; -char sqlitedb_basedir[deflen]=""; +char dbbasepath[deflen]=""; char dbpath[3*deflen]=""; void* emalloc(size_t size) diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index 732b9553..7bce8d5f 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -92,7 +92,7 @@ enum BITMASK //superglobal variables extern HINSTANCE hInst; -extern char sqlitedb_basedir[deflen]; +extern char dbbasepath[deflen]; extern char dbpath[3*deflen]; //functions diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index bda06362..88dc1de5 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -26,7 +26,6 @@ bool dbload() bool dbsave() { - CreateDirectoryA(sqlitedb_basedir, 0); //create database directory return true; } diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 11e294cb..6e9f8a52 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -516,7 +516,7 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo) #else strcat(sqlitedb, ".dd32"); #endif // _WIN64 - sprintf(dbpath, "%s\\%s", sqlitedb_basedir, sqlitedb); + sprintf(dbpath, "%s\\%s", dbbasepath, sqlitedb); dprintf("Database file: %s\n", dbpath); dbinit(); SymSetOptions(SYMOPT_DEBUG|SYMOPT_LOAD_LINES); diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 0895c805..121178e3 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -217,8 +217,9 @@ extern "C" DLL_EXPORT const char* _dbg_dbginit() while(dir[len]!='\\') len--; dir[len]=0; - strcpy(sqlitedb_basedir, dir); //debug directory - PathAppendA(sqlitedb_basedir, "db"); + strcpy(dbbasepath, dir); //debug directory + PathAppendA(dbbasepath, "db"); + CreateDirectoryA(dbbasepath, 0); //create database directory SetCurrentDirectoryA(dir); gMsgStack=msgallocstack(); if(!gMsgStack) From 17abb7f1360781cb53093e45f21734a117c713b1 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 21:08:09 +0200 Subject: [PATCH 112/676] DBG: removed some garbage --- x64_dbg_dbg/dbg.h | 18 -------------- x64_dbg_dbg/dbg/dbg.cbp | 51 --------------------------------------- x64_dbg_dbg/dbg/dbg.cpp | 8 ------ x64_dbg_dbg/dbg/dbg.h | 28 --------------------- x64_dbg_dbg/libdbg_x32.a | Bin 1346 -> 0 bytes x64_dbg_dbg/libdbg_x64.a | Bin 1344 -> 0 bytes 6 files changed, 105 deletions(-) delete mode 100644 x64_dbg_dbg/dbg.h delete mode 100644 x64_dbg_dbg/dbg/dbg.cbp delete mode 100644 x64_dbg_dbg/dbg/dbg.cpp delete mode 100644 x64_dbg_dbg/dbg/dbg.h delete mode 100644 x64_dbg_dbg/libdbg_x32.a delete mode 100644 x64_dbg_dbg/libdbg_x64.a diff --git a/x64_dbg_dbg/dbg.h b/x64_dbg_dbg/dbg.h deleted file mode 100644 index eb5837cf..00000000 --- a/x64_dbg_dbg/dbg.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __DBG_H__ -#define __DBG_H__ - -#include -#include "_global.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -void DLL_IMPORT dbg(const char* a); - -#ifdef __cplusplus -} -#endif - -#endif // __DBG_H__ diff --git a/x64_dbg_dbg/dbg/dbg.cbp b/x64_dbg_dbg/dbg/dbg.cbp deleted file mode 100644 index f22b7b9e..00000000 --- a/x64_dbg_dbg/dbg/dbg.cbp +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - diff --git a/x64_dbg_dbg/dbg/dbg.cpp b/x64_dbg_dbg/dbg/dbg.cpp deleted file mode 100644 index 8504703b..00000000 --- a/x64_dbg_dbg/dbg/dbg.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "dbg.h" - -// a sample exported function -void DLL_EXPORT dbg(const char* a) -{ - char b[256]=""; - strcpy(b,a); -} diff --git a/x64_dbg_dbg/dbg/dbg.h b/x64_dbg_dbg/dbg/dbg.h deleted file mode 100644 index 0b317f84..00000000 --- a/x64_dbg_dbg/dbg/dbg.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __MAIN_H__ -#define __MAIN_H__ - -#include - -/* To use this exported function of dll, include this header - * in your project. - */ - -#ifdef BUILD_DLL -#define DLL_EXPORT __declspec(dllexport) -#else -#define DLL_EXPORT __declspec(dllimport) -#endif - - -#ifdef __cplusplus -extern "C" -{ -#endif - -void DLL_EXPORT dbg(const char* a); - -#ifdef __cplusplus -} -#endif - -#endif // __MAIN_H__ diff --git a/x64_dbg_dbg/libdbg_x32.a b/x64_dbg_dbg/libdbg_x32.a deleted file mode 100644 index df27b8f2bc56ea16ba01ec1e45357385eaba1ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcma)6%`OB%5U!oY%0@y$9AyaC)y9}55l`S9#xNT;@fX>HCvb9baCC5R@C;6S@)QmZ z4h{~EZq!%R-Fnsvom6#Ibxr+z)jji@#o6A$R&zP7u9elcNt1S(Y{apVqmajOmO1~O zCJ~J=T@ckCi0bR0yxiT-%frLGdt4lKD9;Z%Md^$LfoHagL6v=h}Lnr6EL&m!7X%*?+rTTPN5m_2gbQ6@&n zVU~!>Y=#M#-CKj!<*}$>c58jUH}6-O!QHoml}z7t>W&6=pwyrV<~V846mwwNa9B#k zf1oQ>{6rUDAwCJhA~1_+f%%Xt8(e5bf92okr&)-;VjgpP+$2H2*E#QrtPJ)irVndF zr7@Xjd!zhK1ST&`5gd5w=FzWA>6OnXhWk~f^u~U(!~HVkz(RfRB8ANKKbN3i4Ll+| zcSRa#kHLlKr{v}en@+eDV1Y9HtC6k|!CRz1ooo2k5XbvS%|N`a{~eaF5LssrZ!E-7 R%cSVaBAR0%_*o5Hj4w^ztaAVW diff --git a/x64_dbg_dbg/libdbg_x64.a b/x64_dbg_dbg/libdbg_x64.a deleted file mode 100644 index b0fb34daae4a60d6f5bced0f2537b2e1e721a7e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcma)6KTE?v6n{-DN)Qq0C~|^=Q@kc=>L7lVG@4=yt%`JTc5rg&;OOAs#}MfUaddEW zbkq0e?vk_>dhq_L_b&UV`R&EvEI3y6(T=-1iMmM~E2Vj=s+CG3i|+*hu!eFE z(0BvzHA!)PnH8f^HoVHmeaHs=yvR%r&_b3C$2XLLLeq%CYg591JEuv)TSgtRO7()` z!N-jOUQwt7fF^{)BA?_335TdQP#$gItezQM$EFDPWCLd%u4_|-d$xhIdgff?;MqcC zpjJ-<=X{&toxN&?_n;HWspLcwd9Z_d!=PbRnA0mW7q{)DmCU{4s!bH)&oB~kh^mD` z%)Ow{kg6Objyai~*AC}yVjdy!B6Aie+-zbPr(V&oGg zsNet`=k9K3y)Ts3a-6#x!hNIcEytxe#e;A^#xISY{T@;@otC+(NAFztCeEd=*U>Bc zyy}G&PN*FBV)*p67sKb2+pWHP=@*mX+KG9e|2*jMpp~Tqq#mh8GFt{i#)Dnd<^QVQ F9e<9 Date: Wed, 18 Jun 2014 21:11:54 +0200 Subject: [PATCH 113/676] DBG: added jansson (JSON) library + kill the command thread to prevent crashes on exit + memory leak detector (allow the user to send 'alloctrace.txt' PROJECT: updated clean & release scripts --- clean.bat | 1 + release.bat | 12 +- x64_dbg_dbg/_global.cpp | 21 +- x64_dbg_dbg/_global.h | 5 +- x64_dbg_dbg/jansson/jansson.h | 292 ++++++++++++++++++++++++ x64_dbg_dbg/jansson/jansson_config.h | 64 ++++++ x64_dbg_dbg/jansson/jansson_x64.a | Bin 0 -> 50726 bytes x64_dbg_dbg/jansson/jansson_x64.lib | Bin 0 -> 15226 bytes x64_dbg_dbg/jansson/jansson_x86.a | Bin 0 -> 50588 bytes x64_dbg_dbg/jansson/jansson_x86.lib | Bin 0 -> 15550 bytes x64_dbg_dbg/x64_dbg.cpp | 18 +- x64_dbg_dbg/x64_dbg_dbg.vcxproj | 6 +- x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 9 - 13 files changed, 403 insertions(+), 25 deletions(-) create mode 100644 x64_dbg_dbg/jansson/jansson.h create mode 100644 x64_dbg_dbg/jansson/jansson_config.h create mode 100644 x64_dbg_dbg/jansson/jansson_x64.a create mode 100644 x64_dbg_dbg/jansson/jansson_x64.lib create mode 100644 x64_dbg_dbg/jansson/jansson_x86.a create mode 100644 x64_dbg_dbg/jansson/jansson_x86.lib diff --git a/clean.bat b/clean.bat index 0ee464e4..87d5b8ac 100644 --- a/clean.bat +++ b/clean.bat @@ -4,6 +4,7 @@ del /Q *.sdf del /Q *.layout del /Q /A H *.suo rmdir /S /Q ipch +rmdir /S /Q release echo cleaning x64_dbg_bridge... cd x64_dbg_bridge rmdir /S /Q obj diff --git a/release.bat b/release.bat index bb78c0d7..5e45d162 100644 --- a/release.bat +++ b/release.bat @@ -25,14 +25,14 @@ copy bin\x32\BeaEngine.dll %RELEASEDIR%\bin_base\bin\x32\BeaEngine.dll copy bin\x32\dbghelp.dll %RELEASEDIR%\bin_base\bin\x32\dbghelp.dll copy bin\x32\DeviceNameResolver.dll %RELEASEDIR%\bin_base\bin\x32\DeviceNameResolver.dll copy bin\x32\Scylla.dll %RELEASEDIR%\bin_base\bin\x32\Scylla.dll -copy bin\x32\sqlite.dll %RELEASEDIR%\bin_base\bin\x32\sqlite.dll +copy bin\x32\jansson.dll %RELEASEDIR%\bin_base\bin\x32\jansson.dll copy bin\x32\TitanEngine.dll %RELEASEDIR%\bin_base\bin\x32\TitanEngine.dll copy bin\x32\XEDParse.dll %RELEASEDIR%\bin_base\bin\x32\XEDParse.dll copy bin\x64\BeaEngine.dll %RELEASEDIR%\bin_base\bin\x64\BeaEngine.dll copy bin\x64\dbghelp.dll %RELEASEDIR%\bin_base\bin\x64\dbghelp.dll copy bin\x64\DeviceNameResolver.dll %RELEASEDIR%\bin_base\bin\x64\DeviceNameResolver.dll copy bin\x64\Scylla.dll %RELEASEDIR%\bin_base\bin\x64\Scylla.dll -copy bin\x64\sqlite.dll %RELEASEDIR%\bin_base\bin\x64\sqlite.dll +copy bin\x64\jansson.dll %RELEASEDIR%\bin_base\bin\x64\jansson.dll copy bin\x64\TitanEngine.dll %RELEASEDIR%\bin_base\bin\x64\TitanEngine.dll copy bin\x64\XEDParse.dll %RELEASEDIR%\bin_base\bin\x64\XEDParse.dll @@ -61,12 +61,20 @@ copy help\x64_dbg.chm %RELEASEDIR%\help echo pluginsdk mkdir %RELEASEDIR%\pluginsdk +mkdir %RELEASEDIR%\pluginsdk\BeaEngine mkdir %RELEASEDIR%\pluginsdk\dbghelp +mkdir %RELEASEDIR%\pluginsdk\DeviceNameResolver +mkdir %RELEASEDIR%\pluginsdk\jansson mkdir %RELEASEDIR%\pluginsdk\TitanEngine +mkdir %RELEASEDIR%\pluginsdk\XEDParse +xcopy x64_dbg_dbg\BeaEngine %RELEASEDIR%\pluginsdk\BeaEngine /S /Y xcopy x64_dbg_dbg\dbghelp %RELEASEDIR%\pluginsdk\dbghelp /S /Y +xcopy x64_dbg_dbg\DeviceNameResolver %RELEASEDIR%\pluginsdk\DeviceNameResolver /S /Y +xcopy x64_dbg_dbg\jansson %RELEASEDIR%\pluginsdk\jansson /S /Y xcopy x64_dbg_dbg\TitanEngine %RELEASEDIR%\pluginsdk\TitanEngine /S /Y del %RELEASEDIR%\pluginsdk\TitanEngine\TitanEngine.txt /F /Q +xcopy x64_dbg_dbg\XEDParse %RELEASEDIR%\pluginsdk\XEDParse /S /Y copy x64_dbg_dbg\_plugin_types.h %RELEASEDIR%\pluginsdk\_plugin_types.h copy x64_dbg_dbg\_plugins.h %RELEASEDIR%\pluginsdk\_plugins.h copy x64_dbg_bridge\bridgemain.h %RELEASEDIR%\pluginsdk\bridgemain.h diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp index a3b7d298..71ff6806 100644 --- a/x64_dbg_dbg/_global.cpp +++ b/x64_dbg_dbg/_global.cpp @@ -17,10 +17,10 @@ void efree(void* ptr) } static int emalloc_count=0; +static char alloctrace[MAX_PATH]=""; void* emalloc(size_t size, const char* reason) { - //unsigned char* a=(unsigned char*)VirtualAlloc(0, size+0x1000, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); unsigned char* a=new (std::nothrow)unsigned char[size+0x1000]; if(!a) { @@ -29,22 +29,31 @@ void* emalloc(size_t size, const char* reason) } memset(a, 0, size+0x1000); emalloc_count++; - /*FILE* file=fopen("alloctrace.txt", "a+"); + FILE* file=fopen(alloctrace, "a+"); fprintf(file, "DBG%.5d:alloc:"fhex":%s:"fhex"\n", emalloc_count, a, reason, size); - fclose(file);*/ + fclose(file); return a; } void efree(void* ptr, const char* reason) { emalloc_count--; - /*FILE* file=fopen("alloctrace.txt", "a+"); + FILE* file=fopen(alloctrace, "a+"); fprintf(file, "DBG%.5d:efree:"fhex":%s\n", emalloc_count, ptr, reason); - fclose(file);*/ - //VirtualFree(ptr, 0, MEM_RELEASE); + fclose(file); delete[] (unsigned char*)ptr; } +int memleaks() +{ + return emalloc_count; +} + +void setalloctrace(const char* file) +{ + strcpy(alloctrace, file); +} + bool arraycontains(const char* cmd_list, const char* cmd) { //TODO: fix this function a little diff --git a/x64_dbg_dbg/_global.h b/x64_dbg_dbg/_global.h index 7bce8d5f..bd10577d 100644 --- a/x64_dbg_dbg/_global.h +++ b/x64_dbg_dbg/_global.h @@ -18,6 +18,7 @@ #include #include #include "..\x64_dbg_bridge\bridgemain.h" +#include "jansson\jansson.h" #ifdef __GNUC__ #include "dbghelp\dbghelp.h" @@ -37,8 +38,6 @@ #define DLL_IMPORT __declspec(dllimport) #endif //DLL_IMPORT -#include "dbg.h" - //defines #define deflen 1024 @@ -100,6 +99,8 @@ void* emalloc(size_t size); void efree(void* ptr); void* emalloc(size_t size, const char* reason); void efree(void* ptr, const char* reason); +int memleaks(); +void setalloctrace(const char* file); bool arraycontains(const char* cmd_list, const char* cmd); bool scmp(const char* a, const char* b); void formathex(char* string); diff --git a/x64_dbg_dbg/jansson/jansson.h b/x64_dbg_dbg/jansson/jansson.h new file mode 100644 index 00000000..8d1cbb4e --- /dev/null +++ b/x64_dbg_dbg/jansson/jansson.h @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2009-2014 Petri Lehtinen + * + * Jansson is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + +#ifndef JANSSON_H +#define JANSSON_H + +#include +#include /* for size_t */ +#include + +#include "jansson_config.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* version */ + +#define JANSSON_MAJOR_VERSION 2 +#define JANSSON_MINOR_VERSION 6 +#define JANSSON_MICRO_VERSION 0 + +/* Micro version is omitted if it's 0 */ +#define JANSSON_VERSION "2.6" + +/* Version as a 3-byte hex number, e.g. 0x010201 == 1.2.1. Use this + for numeric comparisons, e.g. #if JANSSON_VERSION_HEX >= ... */ +#define JANSSON_VERSION_HEX ((JANSSON_MAJOR_VERSION << 16) | \ + (JANSSON_MINOR_VERSION << 8) | \ + (JANSSON_MICRO_VERSION << 0)) + + +/* types */ + +typedef enum { + JSON_OBJECT, + JSON_ARRAY, + JSON_STRING, + JSON_INTEGER, + JSON_REAL, + JSON_TRUE, + JSON_FALSE, + JSON_NULL +} json_type; + +typedef struct json_t +{ + json_type type; + size_t refcount; +} json_t; + +#ifndef JANSSON_USING_CMAKE /* disabled if using cmake */ +#if JSON_INTEGER_IS_LONG_LONG +#ifdef _WIN32 +#define JSON_INTEGER_FORMAT "I64d" +#else +#define JSON_INTEGER_FORMAT "lld" +#endif +typedef long long json_int_t; +#else +#define JSON_INTEGER_FORMAT "ld" +typedef long json_int_t; +#endif /* JSON_INTEGER_IS_LONG_LONG */ +#endif + +#define json_typeof(json) ((json)->type) +#define json_is_object(json) ((json) && json_typeof(json) == JSON_OBJECT) +#define json_is_array(json) ((json) && json_typeof(json) == JSON_ARRAY) +#define json_is_string(json) ((json) && json_typeof(json) == JSON_STRING) +#define json_is_integer(json) ((json) && json_typeof(json) == JSON_INTEGER) +#define json_is_real(json) ((json) && json_typeof(json) == JSON_REAL) +#define json_is_number(json) (json_is_integer(json) || json_is_real(json)) +#define json_is_true(json) ((json) && json_typeof(json) == JSON_TRUE) +#define json_is_false(json) ((json) && json_typeof(json) == JSON_FALSE) +#define json_boolean_value json_is_true +#define json_is_boolean(json) (json_is_true(json) || json_is_false(json)) +#define json_is_null(json) ((json) && json_typeof(json) == JSON_NULL) + +/* construction, destruction, reference counting */ + +__declspec(dllimport) json_t* json_object(void); +__declspec(dllimport) json_t* json_array(void); +__declspec(dllimport) json_t* json_string(const char *value); +__declspec(dllimport) json_t* json_stringn(const char *value, size_t len); +__declspec(dllimport) json_t* json_string_nocheck(const char *value); +__declspec(dllimport) json_t* json_stringn_nocheck(const char *value, size_t len); +__declspec(dllimport) json_t* json_integer(json_int_t value); +__declspec(dllimport) json_t* json_real(double value); +__declspec(dllimport) json_t* json_true(void); +__declspec(dllimport) json_t* json_false(void); +#define json_boolean(val) ((val) ? json_true() : json_false()) +__declspec(dllimport) json_t* json_null(void); + +static JSON_INLINE +json_t *json_incref(json_t *json) +{ + if(json && json->refcount != (size_t)-1) + ++json->refcount; + return json; +} + +/* do not call json_delete directly */ +__declspec(dllimport) void json_delete(json_t *json); + +static JSON_INLINE +void json_decref(json_t *json) +{ + if(json && json->refcount != (size_t)-1 && --json->refcount == 0) + json_delete(json); +} + + +/* error reporting */ + +#define JSON_ERROR_TEXT_LENGTH 160 +#define JSON_ERROR_SOURCE_LENGTH 80 + +typedef struct +{ + int line; + int column; + int position; + char source[JSON_ERROR_SOURCE_LENGTH]; + char text[JSON_ERROR_TEXT_LENGTH]; +} json_error_t; + + +/* getters, setters, manipulation */ + +__declspec(dllimport) void json_object_seed(size_t seed); +__declspec(dllimport) size_t json_object_size(const json_t *object); +__declspec(dllimport) json_t* json_object_get(const json_t *object, const char *key); +__declspec(dllimport) int json_object_set_new(json_t *object, const char *key, json_t *value); +__declspec(dllimport) int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value); +__declspec(dllimport) int json_object_del(json_t *object, const char *key); +__declspec(dllimport) int json_object_clear(json_t *object); +__declspec(dllimport) int json_object_update(json_t *object, json_t *other); +__declspec(dllimport) int json_object_update_existing(json_t *object, json_t *other); +__declspec(dllimport) int json_object_update_missing(json_t *object, json_t *other); +__declspec(dllimport) void* json_object_iter(json_t *object); +__declspec(dllimport) void* json_object_iter_at(json_t *object, const char *key); +__declspec(dllimport) void* json_object_key_to_iter(const char *key); +__declspec(dllimport) void* json_object_iter_next(json_t *object, void *iter); +__declspec(dllimport) const char* json_object_iter_key(void *iter); +__declspec(dllimport) json_t* json_object_iter_value(void *iter); +__declspec(dllimport) int json_object_iter_set_new(json_t *object, void *iter, json_t *value); + +#define json_object_foreach(object, key, value) \ + for(key = json_object_iter_key(json_object_iter(object)); \ + key && (value = json_object_iter_value(json_object_key_to_iter(key))); \ + key = json_object_iter_key(json_object_iter_next(object, json_object_key_to_iter(key)))) + +#define json_array_foreach(array, index, value) \ + for(index = 0; \ + index < json_array_size(array) && (value = json_array_get(array, index)); \ + index++) + +static JSON_INLINE +int json_object_set(json_t *object, const char *key, json_t *value) +{ + return json_object_set_new(object, key, json_incref(value)); +} + +static JSON_INLINE +int json_object_set_nocheck(json_t *object, const char *key, json_t *value) +{ + return json_object_set_new_nocheck(object, key, json_incref(value)); +} + +static JSON_INLINE +int json_object_iter_set(json_t *object, void *iter, json_t *value) +{ + return json_object_iter_set_new(object, iter, json_incref(value)); +} + +__declspec(dllimport) size_t json_array_size(const json_t *array); +__declspec(dllimport) json_t* json_array_get(const json_t *array, size_t index); +__declspec(dllimport) int json_array_set_new(json_t *array, size_t index, json_t *value); +__declspec(dllimport) int json_array_append_new(json_t *array, json_t *value); +__declspec(dllimport) int json_array_insert_new(json_t *array, size_t index, json_t *value); +__declspec(dllimport) int json_array_remove(json_t *array, size_t index); +__declspec(dllimport) int json_array_clear(json_t *array); +__declspec(dllimport) int json_array_extend(json_t *array, json_t *other); + +static JSON_INLINE +int json_array_set(json_t *array, size_t ind, json_t *value) +{ + return json_array_set_new(array, ind, json_incref(value)); +} + +static JSON_INLINE +int json_array_append(json_t *array, json_t *value) +{ + return json_array_append_new(array, json_incref(value)); +} + +static JSON_INLINE +int json_array_insert(json_t *array, size_t ind, json_t *value) +{ + return json_array_insert_new(array, ind, json_incref(value)); +} + +__declspec(dllimport) const char* json_string_value(const json_t *string); +__declspec(dllimport) size_t json_string_length(const json_t *string); +__declspec(dllimport) json_int_t json_integer_value(const json_t *integer); +__declspec(dllimport) double json_real_value(const json_t *real); +__declspec(dllimport) double json_number_value(const json_t *json); + +__declspec(dllimport) int json_string_set(json_t *string, const char *value); +__declspec(dllimport) int json_string_setn(json_t *string, const char *value, size_t len); +__declspec(dllimport) int json_string_set_nocheck(json_t *string, const char *value); +__declspec(dllimport) int json_string_setn_nocheck(json_t *string, const char *value, size_t len); +__declspec(dllimport) int json_integer_set(json_t *integer, json_int_t value); +__declspec(dllimport) int json_real_set(json_t *real, double value); + +/* pack, unpack */ + +__declspec(dllimport) json_t* json_pack(const char *fmt, ...); +__declspec(dllimport) json_t* json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...); +__declspec(dllimport) json_t* json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap); + +#define JSON_VALIDATE_ONLY 0x1 +#define JSON_STRICT 0x2 + +__declspec(dllimport) int json_unpack(json_t *root, const char *fmt, ...); +__declspec(dllimport) int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...); +__declspec(dllimport) int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap); + + +/* equality */ + +__declspec(dllimport) int json_equal(json_t *value1, json_t *value2); + + +/* copying */ + +__declspec(dllimport) json_t* json_copy(json_t *value); +__declspec(dllimport) json_t* json_deep_copy(const json_t *value); + + +/* decoding */ + +#define JSON_REJECT_DUPLICATES 0x1 +#define JSON_DISABLE_EOF_CHECK 0x2 +#define JSON_DECODE_ANY 0x4 +#define JSON_DECODE_INT_AS_REAL 0x8 +#define JSON_ALLOW_NUL 0x10 + +typedef size_t (*json_load_callback_t)(void *buffer, size_t buflen, void *data); + +__declspec(dllimport) json_t* json_loads(const char *input, size_t flags, json_error_t *error); +__declspec(dllimport) json_t* json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error); +__declspec(dllimport) json_t* json_loadf(FILE *input, size_t flags, json_error_t *error); +__declspec(dllimport) json_t* json_load_file(const char *path, size_t flags, json_error_t *error); +__declspec(dllimport) json_t* json_load_callback(json_load_callback_t callback, void *data, size_t flags, json_error_t *error); + + +/* encoding */ + +#define JSON_INDENT(n) ((n) & 0x1F) +#define JSON_COMPACT 0x20 +#define JSON_ENSURE_ASCII 0x40 +#define JSON_SORT_KEYS 0x80 +#define JSON_PRESERVE_ORDER 0x100 +#define JSON_ENCODE_ANY 0x200 +#define JSON_ESCAPE_SLASH 0x400 +#define JSON_REAL_PRECISION(n) (((n) & 0x1F) << 11) + +typedef int (*json_dump_callback_t)(const char *buffer, size_t size, void *data); + +__declspec(dllimport) char* json_dumps(const json_t *json, size_t flags); +__declspec(dllimport) int json_dumpf(const json_t *json, FILE *output, size_t flags); +__declspec(dllimport) int json_dump_file(const json_t *json, const char *path, size_t flags); +__declspec(dllimport) int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data, size_t flags); + +/* custom memory allocation */ + +typedef void *(*json_malloc_t)(size_t); +typedef void (*json_free_t)(void *); + +__declspec(dllimport) void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/x64_dbg_dbg/jansson/jansson_config.h b/x64_dbg_dbg/jansson/jansson_config.h new file mode 100644 index 00000000..b80a497a --- /dev/null +++ b/x64_dbg_dbg/jansson/jansson_config.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010-2014 Petri Lehtinen + * + * Jansson is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + * + * + * This file specifies a part of the site-specific configuration for + * Jansson, namely those things that affect the public API in + * jansson.h. + * + * The CMake system will generate the jansson_config.h file and + * copy it to the build and install directories. + */ + +#ifndef JANSSON_CONFIG_H +#define JANSSON_CONFIG_H + +/* Define this so that we can disable scattered automake configuration in source files */ +#ifndef JANSSON_USING_CMAKE +#define JANSSON_USING_CMAKE +#endif + +/* Note: when using cmake, JSON_INTEGER_IS_LONG_LONG is not defined nor used, + * as we will also check for __int64 etc types. + * (the definition was used in the automake system) */ + +/* Bring in the cmake-detected defines */ +#define HAVE_STDINT_H 1 +/* #undef HAVE_INTTYPES_H */ +/* #undef HAVE_SYS_TYPES_H */ + +/* Include our standard type header for the integer typedef */ + +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_SYS_TYPES_H) +# include +#endif + + +/* If your compiler supports the inline keyword in C, JSON_INLINE is + defined to `inline', otherwise empty. In C++, the inline is always + supported. */ +#ifdef __cplusplus +#define JSON_INLINE inline +#else +#define JSON_INLINE __inline +#endif + + +#define json_int_t long long +#define json_strtoint _strtoi64 +#define JSON_INTEGER_FORMAT "I64d" + + +/* If locale.h and localeconv() are available, define to 1, otherwise to 0. */ +#define JSON_HAVE_LOCALECONV 1 + + + +#endif diff --git a/x64_dbg_dbg/jansson/jansson_x64.a b/x64_dbg_dbg/jansson/jansson_x64.a new file mode 100644 index 0000000000000000000000000000000000000000..a2b6376fec0650a37dbdfed84df0030f65ac53da GIT binary patch literal 50726 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 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/jansson/jansson_x64.lib b/x64_dbg_dbg/jansson/jansson_x64.lib new file mode 100644 index 0000000000000000000000000000000000000000..aa6194b0064c275b5a1470e7b5250cdedee20464 GIT binary patch literal 15226 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 JV8LdG{tGgl7w`Z8 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/jansson/jansson_x86.a b/x64_dbg_dbg/jansson/jansson_x86.a new file mode 100644 index 0000000000000000000000000000000000000000..daf6b8d8b2120662239803d25f188159e5ad9e2d GIT binary patch literal 50588 zcmeI5>x*PZ6~JqHH`&da_ha);ChKkz*JRSu^Vml=n@LQJ#sq^J2_f3kGjnIAcYAs| z-976hhOnSQFenQmh!2o}5(0_@1QCQ_{3L$%llZ|;`5^uUVmzl#-CL(_Ro$r@HXDkm z3w68u)VXzU)&2FU$EjQQo>QIS^7`om4^5ie^lWpcIentlJT^Jmlu>*?IXN>kKTk(2 z9uPvjA;eW@gt+EkLR|lI3O9XT2n;uWK;gCvLSVRaio)H05dy=Z*C-shLkJA_{guMe z9}0ot!IKmo`mYceTEC_+_mU78j$cdRzIc=~k; z&ps^#hUadf@Rh#_f#LaW3NJt&FuVxo#_)}|DJ(*MF)SaYko`vp4C@e&;p`%X{y`xy z4E{`E)Dr^3Ignx4hBCnL?IjAY!!=_#5BbFKoyRGB@1H_oc;i(HZypi?!w>#W;llTY z!0@Aa3O@!phMx>6{OoEWF#O^j3crLrVR#F!8N;vMqVV>D5E$P1fWmK}oG|?EehTmY zLkJANhjU^0!xI$#_-`RF{OP9@-h;F;ybpN1FWT)ho&IRF*>88+-F{~y1Ic>USD(7S30j5!BT6FvT@Zll;X=rI<7??VO|fMqavGl zfQ~Mm!E*vLeSZB_Qf z#jT8Tp7Po3mG*eE-5qB`*8xT}KMoIYK&3LnW38i#E4B+k9#_O$NA|OAlTLm*inNY_ z9Jn$j&m`llBRc+bU{qP(m%6FBR{CG5E0e~8S z8%xgHXhz7i`ddBo%19vNdYhdU(-J935xZ(!1jd4-h+VQ`K~luFSGzs)e}=~^sn%Ks ztGHA)Fj7;;NbPQaoUJ*tU5YWZflA{lb6qLtnl3Gso7GNlWadOk&E`Dzt>%ukRF`b=z%vt$9-hs0_rjOGa9w

    5<-CE=Rrne!XM4-j(p>N{3z^ulf;FD_}pT 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 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/jansson/jansson_x86.lib b/x64_dbg_dbg/jansson/jansson_x86.lib new file mode 100644 index 0000000000000000000000000000000000000000..c9bfb569e28e171e623daf09bf3777c66306625f GIT binary patch literal 15550 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 - - @@ -127,7 +125,7 @@ Windows true true - DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + jansson\jansson_x86.lib;DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) @@ -142,7 +140,7 @@ Windows true true - DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + jansson\jansson_x64.lib;DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index f1f13f21..31397c72 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -19,9 +19,6 @@ {5623fb24-3b6d-49a6-a0d3-1cfcc46f87bd} - - {c7d6554c-6b4c-42b2-8d0a-7968cdfdba63} - {23226861-3b20-42db-8dd6-c5d276ba7a83} @@ -140,9 +137,6 @@ Header Files - - Header Files - Header Files @@ -221,9 +215,6 @@ Header Files\dbghelp - - Header Files\dbg - Header Files\XEDParse From b4df671222c7e17bb065a5459f9a88d96b372e06 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Wed, 18 Jun 2014 21:23:52 +0200 Subject: [PATCH 114/676] DBG: fixed a potential bug with running a script and then exiting x64_dbg --- x64_dbg_dbg/simplescript.cpp | 4 ++++ x64_dbg_dbg/x64_dbg.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/x64_dbg_dbg/simplescript.cpp b/x64_dbg_dbg/simplescript.cpp index 52bd499d..9e18dab4 100644 --- a/x64_dbg_dbg/simplescript.cpp +++ b/x64_dbg_dbg/simplescript.cpp @@ -599,7 +599,11 @@ bool scriptcmdexec(const char* command) void scriptabort() { if(bIsRunning) + { bAbort=true; + while(bIsRunning) + Sleep(1); + } else //reset the script scriptsetip(0); } diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index ae75ca39..018246b1 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -253,6 +253,7 @@ extern "C" DLL_EXPORT const char* _dbg_dbginit() extern "C" DLL_EXPORT void _dbg_dbgexitsignal() { cbStopDebug(0, 0); + scriptabort(); wait(WAITID_STOP); //after this, debugging stopped pluginunload(); TerminateThread(hCommandLoopThread, 0); From 289f11db0577c8365fd8a9da76fb6eef2c33e1c1 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 19 Jun 2014 00:44:24 +0200 Subject: [PATCH 115/676] DBG: updated jansson headers --- x64_dbg_dbg/jansson/jansson.h | 28 +++++++++++++++++++++++++ x64_dbg_dbg/x64_dbg_dbg.vcxproj | 2 ++ x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 9 ++++++++ 3 files changed, 39 insertions(+) diff --git a/x64_dbg_dbg/jansson/jansson.h b/x64_dbg_dbg/jansson/jansson.h index 8d1cbb4e..cd4d86b4 100644 --- a/x64_dbg_dbg/jansson/jansson.h +++ b/x64_dbg_dbg/jansson/jansson.h @@ -54,6 +54,8 @@ typedef struct json_t size_t refcount; } json_t; +typedef json_t* JSON; + #ifndef JANSSON_USING_CMAKE /* disabled if using cmake */ #if JSON_INTEGER_IS_LONG_LONG #ifdef _WIN32 @@ -90,6 +92,17 @@ __declspec(dllimport) json_t* json_stringn(const char *value, size_t len); __declspec(dllimport) json_t* json_string_nocheck(const char *value); __declspec(dllimport) json_t* json_stringn_nocheck(const char *value, size_t len); __declspec(dllimport) json_t* json_integer(json_int_t value); +static JSON_INLINE +json_t *json_hex(json_int_t value) +{ + char hexvalue[20]; +#ifdef _WIN64 + sprintf(hexvalue, "0x%llX", value); +#else //x64 + sprintf(hexvalue, "0x%X", value); +#endif //_WIN64 + return json_string(hexvalue); +} __declspec(dllimport) json_t* json_real(double value); __declspec(dllimport) json_t* json_true(void); __declspec(dllimport) json_t* json_false(void); @@ -208,6 +221,21 @@ int json_array_insert(json_t *array, size_t ind, json_t *value) __declspec(dllimport) const char* json_string_value(const json_t *string); __declspec(dllimport) size_t json_string_length(const json_t *string); __declspec(dllimport) json_int_t json_integer_value(const json_t *integer); +static JSON_INLINE +json_int_t json_hex_value(const json_t* hex) +{ + json_int_t ret; + const char* hexvalue; + hexvalue=json_string_value(hex); + if(!hexvalue) + return 0; +#ifdef _WIN64 + sscanf(hexvalue, "0x%llX", &ret); +#else //x64 + sscanf(hexvalue, "0x%X", &ret); +#endif //_WIN64 + return ret; +} __declspec(dllimport) double json_real_value(const json_t *real); __declspec(dllimport) double json_number_value(const json_t *json); diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj b/x64_dbg_dbg/x64_dbg_dbg.vcxproj index 84496e91..0f377ec8 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj @@ -57,6 +57,8 @@ + + diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index 31397c72..4acc1620 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -28,6 +28,9 @@ {f4eb1487-15d6-4836-9d20-339d0f18c31f} + + {b63305e2-2b10-46eb-839f-5e9080fa8ad8} + @@ -224,5 +227,11 @@ Header Files\DeviceNameResolver + + Header Files\jansson + + + Header Files\jansson + \ No newline at end of file From 8ba093b0babe680ebb3f7faba52f9e74703c6308 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Thu, 19 Jun 2014 00:44:43 +0200 Subject: [PATCH 116/676] DBG: comment database working again (using JSON) --- x64_dbg_dbg/_exports.cpp | 6 +- x64_dbg_dbg/addrinfo.cpp | 219 +++++++++++++++++++++++++----------- x64_dbg_dbg/addrinfo.h | 24 ++-- x64_dbg_dbg/debugger.cpp | 6 +- x64_dbg_dbg/instruction.cpp | 18 +-- x64_dbg_dbg/x64_dbg.cpp | 11 ++ 6 files changed, 186 insertions(+), 98 deletions(-) diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index a4033ea4..87de0309 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -410,18 +410,18 @@ extern "C" DLL_EXPORT bool _dbg_addrinfoset(duint addr, ADDRINFO* addrinfo) bool retval=false; if(addrinfo->flags&flaglabel) //set label { - if(labelset(addr, addrinfo->label)) + if(labelset(addr, addrinfo->label, true)) retval=true; } if(addrinfo->flags&flagcomment) //set comment { - if(commentset(addr, addrinfo->comment)) + if(commentset(addr, addrinfo->comment, true)) retval=true; } if(addrinfo->flags&flagbookmark) //set bookmark { if(addrinfo->isbookmark) - retval=bookmarkset(addr); + retval=bookmarkset(addr, true); else retval=bookmarkdel(addr); } diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 88dc1de5..cb091e4b 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -13,35 +13,28 @@ static BookmarksInfo bookmarks; static FunctionsInfo functions; static LoopsInfo loops; -///basic database functions -void dbinit() +//database functions +void dbsave() { - dbreadcache(); + JSON root=json_object(); + commentcachesave(root); + json_dump_file(root, dbpath, JSON_INDENT(4)|JSON_SORT_KEYS); + json_decref(root); //free root } -bool dbload() +void dbload() { - return true; + JSON root=json_load_file(dbpath, 0, 0); + if(!root) + return; + commentcacheload(root); + json_decref(root); //free root } -bool dbsave() +void dbupdate() { - return true; -} - -void dbreadcache() -{ - -} - -void dbwritecache() -{ - -} - -void dbclose() -{ - dbwritecache(); + dbsave(); //flush cache to disk + dbload(); //load database to cache (and update the module bases + VAs) } ///module functions @@ -74,11 +67,13 @@ bool modload(uint base, uint size, const char* fullpath) _strlwr(info.name); modinfo.push_back(info); symupdatemodulelist(); + dbupdate(); return true; } bool modunload(uint base) { + dbupdate(); int total=modinfo.size(); for(int i=0; ihProcess, addr) or !text or strlen(text)>=MAX_COMMENT_SIZE-1) return false; if(!*text) //NOTE: delete when there is no text return commentdel(addr); - COMMENTSINFO info; - strcpy(info.text, text); - modnamefromaddr(addr, info.mod, true); - info.addr=addr-modbasefromaddr(addr); + COMMENTSINFO comment; + comment.manual=manual; + strcpy(comment.text, text); + modnamefromaddr(addr, comment.mod, true); + comment.addr=addr-modbasefromaddr(addr); if(comments.count(addr)) //contains addr - comments[addr]=info; + comments[addr]=comment; else - comments.insert(std::make_pair(addr, info)); + comments.insert(std::make_pair(addr, comment)); return true; } @@ -270,14 +266,99 @@ bool commentdel(uint addr) return false; } +void commentcachesave(JSON root) +{ + JSON jsoncomments=json_array(); + JSON jsonautocomments=json_array(); + for(CommentsInfo::iterator i=comments.begin(); i!=comments.end(); ++i) + { + COMMENTSINFO curComment=i->second; + JSON curjsoncomment=json_object(); + if(*curComment.mod) + json_object_set_new(curjsoncomment, "module", json_string(curComment.mod)); + else + json_object_set_new(curjsoncomment, "module", json_null()); + json_object_set_new(curjsoncomment, "address", json_hex(curComment.addr)); + json_object_set_new(curjsoncomment, "text", json_string(curComment.text)); + if(curComment.manual) + json_array_append_new(jsoncomments, curjsoncomment); + else + json_array_append_new(jsonautocomments, curjsoncomment); + } + if(json_array_size(jsoncomments)) + json_object_set(root, "comments", jsoncomments); + json_decref(jsoncomments); + if(json_array_size(jsonautocomments)) + json_object_set(root, "autocomments", jsonautocomments); + json_decref(jsonautocomments); +} + +void commentcacheload(JSON root) +{ + comments.clear(); + JSON jsoncomments=json_object_get(root, "comments"); + if(jsoncomments) + { + size_t i; + JSON value; + json_array_foreach(jsoncomments, i, value) + { + COMMENTSINFO curComment; + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod)hProcess, addr) or !text or strlen(text)>=MAX_LABEL_SIZE-1) return false; if(!*text) //NOTE: delete when there is no text return labeldel(addr); LABELSINFO label; + label.manual=manual; strcpy(label.text, text); modnamefromaddr(addr, label.mod, true); label.addr=addr-modbasefromaddr(addr); @@ -329,13 +410,14 @@ bool labeldel(uint addr) } ///bookmark functions -bool bookmarkset(uint addr) +bool bookmarkset(uint addr, bool manual) { if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) return false; BOOKMARKSINFO bookmark; modnamefromaddr(addr, bookmark.mod, true); bookmark.addr=addr-modbasefromaddr(addr); + bookmark.manual=manual; bookmarks.insert(std::make_pair(addr, bookmark)); return true; } @@ -362,6 +444,22 @@ bool bookmarkdel(uint addr) } ///function database +bool functionadd(uint start, uint end, bool manual) +{ + if(!DbgIsDebugging() or endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page + return false; + if(functionoverlaps(start, end)) + return false; + FUNCTIONSINFO function; + modnamefromaddr(start, function.mod, true); + function.modbase=modbasefromaddr(start); + function.start=start-function.modbase; + function.end=end-function.modbase; + function.manual=manual; + functions.push_back(function); + return true; +} + bool functionget(uint addr, uint* start, uint* end) { if(!DbgIsDebugging()) @@ -395,22 +493,6 @@ bool functionoverlaps(uint start, uint end) return false; } -bool functionadd(uint start, uint end, bool manual) -{ - if(!DbgIsDebugging() or endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page - return false; - if(functionoverlaps(start, end)) - return false; - FUNCTIONSINFO function; - modnamefromaddr(start, function.mod, true); - function.modbase=modbasefromaddr(start); - function.start=start-function.modbase; - function.end=end-function.modbase; - function.manual=manual; - functions.push_back(function); - return true; -} - bool functiondel(uint addr) { if(!DbgIsDebugging()) @@ -427,6 +509,28 @@ bool functiondel(uint addr) return false; } +//loop database +bool loopadd(uint start, uint end, bool manual) +{ + if(!DbgIsDebugging() or endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page + return false; + int finaldepth; + if(loopoverlaps(0, start, end, &finaldepth)) //loop cannot overlap another loop + return false; + LOOPSINFO loop; + modnamefromaddr(start, loop.mod, true); + loop.modbase=modbasefromaddr(start); + loop.start=start-loop.modbase; + loop.end=end-loop.modbase; + loop.depth=finaldepth; + if(finaldepth) + loop.parent=finaldepth-1; + else + loop.parent=0; + loop.manual=manual; + return false; +} + bool loopget(int depth, uint addr, uint* start, uint* end) { if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) @@ -446,27 +550,6 @@ bool loopget(int depth, uint addr, uint* start, uint* end) return false; } -bool loopadd(uint start, uint end, bool manual) -{ - if(!DbgIsDebugging() or endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page - return false; - int finaldepth; - if(loopoverlaps(0, start, end, &finaldepth)) //loop cannot overlap another loop - return false; - LOOPSINFO loop; - modnamefromaddr(start, loop.mod, true); - loop.modbase=modbasefromaddr(start); - loop.start=start-loop.modbase; - loop.end=end-loop.modbase; - loop.depth=finaldepth; - if(finaldepth) - loop.parent=finaldepth-1; - else - loop.parent=0; - loop.manual=manual; - return false; -} - //check if a loop overlaps a range, inside is not overlapping bool loopoverlaps(int depth, uint start, uint end, int* finaldepth) { diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index 857c4d06..8e2580e1 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -17,6 +17,7 @@ struct COMMENTSINFO char mod[MAX_MODULE_SIZE]; uint addr; char text[MAX_COMMENT_SIZE]; + bool manual; }; struct LABELSINFO @@ -24,12 +25,14 @@ struct LABELSINFO char mod[MAX_MODULE_SIZE]; uint addr; char text[MAX_LABEL_SIZE]; + bool manual; }; struct BOOKMARKSINFO { char mod[MAX_MODULE_SIZE]; uint addr; + bool manual; }; struct FUNCTIONSINFO @@ -62,12 +65,9 @@ typedef std::map BookmarksInfo; typedef std::vector FunctionsInfo; typedef std::vector LoopsInfo; -void dbinit(); -bool dbsave(); -bool dbload(); -void dbreadcache(); -void dbwritecache(); -void dbclose(); +void dbsave(); +void dbload(); +void dbupdate(); bool modload(uint base, uint size, const char* fullpath); bool modunload(uint base); @@ -78,27 +78,29 @@ uint modbasefromname(const char* modname); bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); -bool commentset(uint addr, const char* text); +bool commentset(uint addr, const char* text, bool manual); bool commentget(uint addr, char* text); bool commentdel(uint addr); +void commentcachesave(JSON root); +void commentcacheload(JSON root); -bool labelset(uint addr, const char* text); +bool labelset(uint addr, const char* text, bool manual); bool labelfromstring(const char* text, uint* addr); bool labelget(uint addr, char* text); bool labeldel(uint addr); -bool bookmarkset(uint addr); +bool bookmarkset(uint addr, bool manual); bool bookmarkget(uint addr); bool bookmarkdel(uint addr); +bool functionadd(uint start, uint end, bool manual); bool functionget(uint addr, uint* start, uint* end); bool functionoverlaps(uint start, uint end); -bool functionadd(uint start, uint end, bool manual); bool functiondel(uint addr); +bool loopadd(uint start, uint end, bool manual); bool loopget(int depth, uint addr, uint* start, uint* end); bool loopoverlaps(int depth, uint start, uint end, int* finaldepth); -bool loopadd(uint start, uint end, bool manual); bool loopdel(int depth, uint addr); #endif // _ADDRINFO_H diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 6e9f8a52..68e20761 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -518,7 +518,7 @@ static void cbCreateProcess(CREATE_PROCESS_DEBUG_INFO* CreateProcessInfo) #endif // _WIN64 sprintf(dbpath, "%s\\%s", dbbasepath, sqlitedb); dprintf("Database file: %s\n", dbpath); - dbinit(); + dbload(); SymSetOptions(SYMOPT_DEBUG|SYMOPT_LOAD_LINES); GuiSymbolLogClear(); SymInitialize(fdProcessInfo->hProcess, 0, false); //initialize symbols @@ -1007,7 +1007,7 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter) //message the user/do final stuff RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints //cleanup - dbclose(); + dbsave(); modclear(); threadclear(); GuiSetDebugState(stopped); @@ -1955,7 +1955,7 @@ static DWORD WINAPI threadAttachLoop(void* lpParameter) plugincbcall(CB_STOPDEBUG, &stopInfo); //message the user/do final stuff RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints - dbclose(); + dbsave(); modclear(); GuiSetDebugState(stopped); dputs("debugging stopped!"); diff --git a/x64_dbg_dbg/instruction.cpp b/x64_dbg_dbg/instruction.cpp index fe2203a6..8650644e 100644 --- a/x64_dbg_dbg/instruction.cpp +++ b/x64_dbg_dbg/instruction.cpp @@ -236,7 +236,7 @@ CMDRESULT cbInstrCmt(int argc, char* argv[]) uint addr=0; if(!valfromstring(argv[1], &addr, false)) return STATUS_ERROR; - if(!commentset(addr, argv[2])) + if(!commentset(addr, argv[2], true)) { dputs("error setting comment"); return STATUS_ERROR; @@ -273,7 +273,7 @@ CMDRESULT cbInstrLbl(int argc, char* argv[]) uint addr=0; if(!valfromstring(argv[1], &addr, false)) return STATUS_ERROR; - if(!labelset(addr, argv[2])) + if(!labelset(addr, argv[2], true)) { dputs("error setting label"); return STATUS_ERROR; @@ -310,7 +310,7 @@ CMDRESULT cbInstrBookmarkSet(int argc, char* argv[]) uint addr=0; if(!valfromstring(argv[1], &addr, false)) return STATUS_ERROR; - if(!bookmarkset(addr)) + if(!bookmarkset(addr, true)) { dputs("failed to set bookmark!"); return STATUS_ERROR; @@ -340,22 +340,14 @@ CMDRESULT cbInstrBookmarkDel(int argc, char* argv[]) CMDRESULT cbLoaddb(int argc, char* argv[]) { - if(!dbload()) - { - dputs("failed to load database from disk!"); - return STATUS_ERROR; - } + dbload(); GuiUpdateAllViews(); return STATUS_CONTINUE; } CMDRESULT cbSavedb(int argc, char* argv[]) { - if(!dbsave()) - { - dputs("failed to save database to disk!"); - return STATUS_ERROR; - } + dbsave(); return STATUS_CONTINUE; } diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 018246b1..f7ba26cc 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -209,8 +209,19 @@ static DWORD WINAPI DbgCommandLoopThread(void* a) return 0; } +static void* emalloc_json(size_t size) +{ + return emalloc(size, "json:ptr"); +} + +static void efree_json(void* ptr) +{ + efree(ptr, "json:ptr"); +} + extern "C" DLL_EXPORT const char* _dbg_dbginit() { + json_set_alloc_funcs(emalloc_json, efree_json); char dir[deflen]=""; if(!GetModuleFileNameA(hInst, dir, deflen)) return "GetModuleFileNameA failed!"; From b587c30aeb995a28d802c16d2d77b9565877e510 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 00:09:09 +0200 Subject: [PATCH 117/676] DBG: some fixes in addrinfo --- x64_dbg_dbg/_global.cpp | 8 ++++++-- x64_dbg_dbg/addrinfo.cpp | 17 +++++++++++++++-- x64_dbg_dbg/addrinfo.h | 1 + x64_dbg_dbg/debugger.cpp | 11 +++++------ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp index 71ff6806..011c4f7d 100644 --- a/x64_dbg_dbg/_global.cpp +++ b/x64_dbg_dbg/_global.cpp @@ -21,26 +21,30 @@ static char alloctrace[MAX_PATH]=""; void* emalloc(size_t size, const char* reason) { - unsigned char* a=new (std::nothrow)unsigned char[size+0x1000]; + unsigned char* a=new (std::nothrow)unsigned char[size]; if(!a) { MessageBoxA(0, "Could not allocate memory", "Error", MB_ICONERROR); ExitProcess(1); } - memset(a, 0, size+0x1000); + memset(a, 0, size); emalloc_count++; + /* FILE* file=fopen(alloctrace, "a+"); fprintf(file, "DBG%.5d:alloc:"fhex":%s:"fhex"\n", emalloc_count, a, reason, size); fclose(file); + */ return a; } void efree(void* ptr, const char* reason) { emalloc_count--; + /* FILE* file=fopen(alloctrace, "a+"); fprintf(file, "DBG%.5d:efree:"fhex":%s\n", emalloc_count, ptr, reason); fclose(file); + */ delete[] (unsigned char*)ptr; } diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index cb091e4b..c937f6a3 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -16,19 +16,26 @@ static LoopsInfo loops; //database functions void dbsave() { + dprintf("saving database..."); + DWORD ticks=GetTickCount(); JSON root=json_object(); commentcachesave(root); - json_dump_file(root, dbpath, JSON_INDENT(4)|JSON_SORT_KEYS); + if(json_object_size(root)) + json_dump_file(root, dbpath, JSON_INDENT(4)); json_decref(root); //free root + dprintf("%ums\n", GetTickCount()-ticks); } void dbload() { + dprintf("loading database..."); + DWORD ticks=GetTickCount(); JSON root=json_load_file(dbpath, 0, 0); if(!root) return; commentcacheload(root); json_decref(root); //free root + dprintf("%ums\n", GetTickCount()-ticks); } void dbupdate() @@ -37,6 +44,12 @@ void dbupdate() dbload(); //load database to cache (and update the module bases + VAs) } +void dbclose() +{ + dbsave(); + CommentsInfo().swap(comments); +} + ///module functions bool modload(uint base, uint size, const char* fullpath) { @@ -73,7 +86,6 @@ bool modload(uint base, uint size, const char* fullpath) bool modunload(uint base) { - dbupdate(); int total=modinfo.size(); for(int i=0; i LoopsInfo; void dbsave(); void dbload(); void dbupdate(); +void dbclose(); bool modload(uint base, uint size, const char* fullpath); bool modunload(uint base); diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 68e20761..94a98bc1 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -1007,7 +1007,7 @@ static DWORD WINAPI threadDebugLoop(void* lpParameter) //message the user/do final stuff RemoveAllBreakPoints(UE_OPTION_REMOVEALL); //remove all breakpoints //cleanup - dbsave(); + dbclose(); modclear(); threadclear(); GuiSetDebugState(stopped); @@ -1821,14 +1821,13 @@ CMDRESULT cbDebugMemset(int argc, char* argv[]) CMDRESULT cbBenchmark(int argc, char* argv[]) { - uint addr=GetContextData(UE_CIP); + uint addr=memfindbaseaddr(fdProcessInfo->hProcess, GetContextData(UE_CIP), 0); DWORD ticks=GetTickCount(); char comment[MAX_COMMENT_SIZE]=""; - for(uint i=addr; i Date: Fri, 20 Jun 2014 00:32:54 +0200 Subject: [PATCH 118/676] DBG: added murmurhash (really fast hashing) --- x64_dbg_dbg/addrinfo.cpp | 3 + x64_dbg_dbg/murmurhash.cpp | 431 ++++++++++++++++++++++++ x64_dbg_dbg/murmurhash.h | 53 +++ x64_dbg_dbg/x64_dbg_dbg.vcxproj | 2 + x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 6 + 5 files changed, 495 insertions(+) create mode 100644 x64_dbg_dbg/murmurhash.cpp create mode 100644 x64_dbg_dbg/murmurhash.h diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index c937f6a3..6099e318 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -6,6 +6,9 @@ #include "threading.h" #include "symbolinfo.h" +//TODO: faster module lookup functions (http://bit.ly/TbJlu3) +//TODO: use murmurhash(modname+rva) as key for the maps for "instant" lookup + static ModulesInfo modinfo; static CommentsInfo comments; static LabelsInfo labels; diff --git a/x64_dbg_dbg/murmurhash.cpp b/x64_dbg_dbg/murmurhash.cpp new file mode 100644 index 00000000..23913172 --- /dev/null +++ b/x64_dbg_dbg/murmurhash.cpp @@ -0,0 +1,431 @@ +//----------------------------------------------------------------------------- +// MurmurHash3 was written by Austin Appleby, and is placed in the public +// domain. The author hereby disclaims copyright to this source code. + +// Note - The x86 and x64 versions do _not_ produce the same results, as the +// algorithms are optimized for their respective platforms. You can still +// compile and run any of them on any platform, but your performance with the +// non-native version will be less than optimal. + +#include "murmurhash.h" + +//----------------------------------------------------------------------------- +// Platform-specific functions and macros + +// Microsoft Visual Studio + +#if defined(_MSC_VER) + +#define FORCE_INLINE __forceinline + +#include + +#define ROTL32(x,y) _rotl(x,y) +#define ROTL64(x,y) _rotl64(x,y) + +#define BIG_CONSTANT(x) (x) + +// Other compilers + +#else // defined(_MSC_VER) + +#define FORCE_INLINE inline __attribute__((always_inline)) + +inline uint32_t rotl32 ( uint32_t x, int8_t r ) +{ + return (x << r) | (x >> (32 - r)); +} + +inline uint64_t rotl64 ( uint64_t x, int8_t r ) +{ + return (x << r) | (x >> (64 - r)); +} + +#define ROTL32(x,y) rotl32(x,y) +#define ROTL64(x,y) rotl64(x,y) + +#define BIG_CONSTANT(x) (x##LLU) + +#endif // !defined(_MSC_VER) + +//----------------------------------------------------------------------------- +// Block read - if your platform needs to do endian-swapping or can only +// handle aligned reads, do the conversion here + +FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i ) +{ + return p[i]; +} + +FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i ) +{ + return p[i]; +} + +//----------------------------------------------------------------------------- +// Finalization mix - force all bits of a hash block to avalanche + +FORCE_INLINE uint32_t fmix32 ( uint32_t h ) +{ + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; +} + +//---------- + +FORCE_INLINE uint64_t fmix64 ( uint64_t k ) +{ + k ^= k >> 33; + k *= BIG_CONSTANT(0xff51afd7ed558ccd); + k ^= k >> 33; + k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53); + k ^= k >> 33; + + return k; +} + +//----------------------------------------------------------------------------- + +void MurmurHash3_x86_32 ( const void * key, int len, + uint32_t seed, void * out ) +{ + const uint8_t * data = (const uint8_t*)key; + const int nblocks = len / 4; + + uint32_t h1 = seed; + + const uint32_t c1 = 0xcc9e2d51; + const uint32_t c2 = 0x1b873593; + + //---------- + // body + + const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); + + for(int i = -nblocks; i; i++) + { + uint32_t k1 = getblock32(blocks,i); + + k1 *= c1; + k1 = ROTL32(k1,15); + k1 *= c2; + + h1 ^= k1; + h1 = ROTL32(h1,13); + h1 = h1*5+0xe6546b64; + } + + //---------- + // tail + + const uint8_t * tail = (const uint8_t*)(data + nblocks*4); + + uint32_t k1 = 0; + + switch(len & 3) + { + case 3: + k1 ^= tail[2] << 16; + case 2: + k1 ^= tail[1] << 8; + case 1: + k1 ^= tail[0]; + k1 *= c1; + k1 = ROTL32(k1,15); + k1 *= c2; + h1 ^= k1; + }; + + //---------- + // finalization + + h1 ^= len; + + h1 = fmix32(h1); + + *(uint32_t*)out = h1; +} + +//----------------------------------------------------------------------------- + +void MurmurHash3_x86_128 ( const void * key, const int len, + uint32_t seed, void * out ) +{ + const uint8_t * data = (const uint8_t*)key; + const int nblocks = len / 16; + + uint32_t h1 = seed; + uint32_t h2 = seed; + uint32_t h3 = seed; + uint32_t h4 = seed; + + const uint32_t c1 = 0x239b961b; + const uint32_t c2 = 0xab0e9789; + const uint32_t c3 = 0x38b34ae5; + const uint32_t c4 = 0xa1e38b93; + + //---------- + // body + + const uint32_t * blocks = (const uint32_t *)(data + nblocks*16); + + for(int i = -nblocks; i; i++) + { + uint32_t k1 = getblock32(blocks,i*4+0); + uint32_t k2 = getblock32(blocks,i*4+1); + uint32_t k3 = getblock32(blocks,i*4+2); + uint32_t k4 = getblock32(blocks,i*4+3); + + k1 *= c1; + k1 = ROTL32(k1,15); + k1 *= c2; + h1 ^= k1; + + h1 = ROTL32(h1,19); + h1 += h2; + h1 = h1*5+0x561ccd1b; + + k2 *= c2; + k2 = ROTL32(k2,16); + k2 *= c3; + h2 ^= k2; + + h2 = ROTL32(h2,17); + h2 += h3; + h2 = h2*5+0x0bcaa747; + + k3 *= c3; + k3 = ROTL32(k3,17); + k3 *= c4; + h3 ^= k3; + + h3 = ROTL32(h3,15); + h3 += h4; + h3 = h3*5+0x96cd1c35; + + k4 *= c4; + k4 = ROTL32(k4,18); + k4 *= c1; + h4 ^= k4; + + h4 = ROTL32(h4,13); + h4 += h1; + h4 = h4*5+0x32ac3b17; + } + + //---------- + // tail + + const uint8_t * tail = (const uint8_t*)(data + nblocks*16); + + uint32_t k1 = 0; + uint32_t k2 = 0; + uint32_t k3 = 0; + uint32_t k4 = 0; + + switch(len & 15) + { + case 15: + k4 ^= tail[14] << 16; + case 14: + k4 ^= tail[13] << 8; + case 13: + k4 ^= tail[12] << 0; + k4 *= c4; + k4 = ROTL32(k4,18); + k4 *= c1; + h4 ^= k4; + + case 12: + k3 ^= tail[11] << 24; + case 11: + k3 ^= tail[10] << 16; + case 10: + k3 ^= tail[ 9] << 8; + case 9: + k3 ^= tail[ 8] << 0; + k3 *= c3; + k3 = ROTL32(k3,17); + k3 *= c4; + h3 ^= k3; + + case 8: + k2 ^= tail[ 7] << 24; + case 7: + k2 ^= tail[ 6] << 16; + case 6: + k2 ^= tail[ 5] << 8; + case 5: + k2 ^= tail[ 4] << 0; + k2 *= c2; + k2 = ROTL32(k2,16); + k2 *= c3; + h2 ^= k2; + + case 4: + k1 ^= tail[ 3] << 24; + case 3: + k1 ^= tail[ 2] << 16; + case 2: + k1 ^= tail[ 1] << 8; + case 1: + k1 ^= tail[ 0] << 0; + k1 *= c1; + k1 = ROTL32(k1,15); + k1 *= c2; + h1 ^= k1; + }; + + //---------- + // finalization + + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 += h2; + h1 += h3; + h1 += h4; + h2 += h1; + h3 += h1; + h4 += h1; + + h1 = fmix32(h1); + h2 = fmix32(h2); + h3 = fmix32(h3); + h4 = fmix32(h4); + + h1 += h2; + h1 += h3; + h1 += h4; + h2 += h1; + h3 += h1; + h4 += h1; + + ((uint32_t*)out)[0] = h1; + ((uint32_t*)out)[1] = h2; + ((uint32_t*)out)[2] = h3; + ((uint32_t*)out)[3] = h4; +} + +//----------------------------------------------------------------------------- + +void MurmurHash3_x64_128 ( const void * key, const int len, + const uint32_t seed, void * out ) +{ + const uint8_t * data = (const uint8_t*)key; + const int nblocks = len / 16; + + uint64_t h1 = seed; + uint64_t h2 = seed; + + const uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); + const uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); + + //---------- + // body + + const uint64_t * blocks = (const uint64_t *)(data); + + for(int i = 0; i < nblocks; i++) + { + uint64_t k1 = getblock64(blocks,i*2+0); + uint64_t k2 = getblock64(blocks,i*2+1); + + k1 *= c1; + k1 = ROTL64(k1,31); + k1 *= c2; + h1 ^= k1; + + h1 = ROTL64(h1,27); + h1 += h2; + h1 = h1*5+0x52dce729; + + k2 *= c2; + k2 = ROTL64(k2,33); + k2 *= c1; + h2 ^= k2; + + h2 = ROTL64(h2,31); + h2 += h1; + h2 = h2*5+0x38495ab5; + } + + //---------- + // tail + + const uint8_t * tail = (const uint8_t*)(data + nblocks*16); + + uint64_t k1 = 0; + uint64_t k2 = 0; + + switch(len & 15) + { + case 15: + k2 ^= ((uint64_t)tail[14]) << 48; + case 14: + k2 ^= ((uint64_t)tail[13]) << 40; + case 13: + k2 ^= ((uint64_t)tail[12]) << 32; + case 12: + k2 ^= ((uint64_t)tail[11]) << 24; + case 11: + k2 ^= ((uint64_t)tail[10]) << 16; + case 10: + k2 ^= ((uint64_t)tail[ 9]) << 8; + case 9: + k2 ^= ((uint64_t)tail[ 8]) << 0; + k2 *= c2; + k2 = ROTL64(k2,33); + k2 *= c1; + h2 ^= k2; + + case 8: + k1 ^= ((uint64_t)tail[ 7]) << 56; + case 7: + k1 ^= ((uint64_t)tail[ 6]) << 48; + case 6: + k1 ^= ((uint64_t)tail[ 5]) << 40; + case 5: + k1 ^= ((uint64_t)tail[ 4]) << 32; + case 4: + k1 ^= ((uint64_t)tail[ 3]) << 24; + case 3: + k1 ^= ((uint64_t)tail[ 2]) << 16; + case 2: + k1 ^= ((uint64_t)tail[ 1]) << 8; + case 1: + k1 ^= ((uint64_t)tail[ 0]) << 0; + k1 *= c1; + k1 = ROTL64(k1,31); + k1 *= c2; + h1 ^= k1; + }; + + //---------- + // finalization + + h1 ^= len; + h2 ^= len; + + h1 += h2; + h2 += h1; + + h1 = fmix64(h1); + h2 = fmix64(h2); + + h1 += h2; + h2 += h1; + + ((uint64_t*)out)[0] = h1; + ((uint64_t*)out)[1] = h2; +} + +//----------------------------------------------------------------------------- + diff --git a/x64_dbg_dbg/murmurhash.h b/x64_dbg_dbg/murmurhash.h new file mode 100644 index 00000000..ce53b614 --- /dev/null +++ b/x64_dbg_dbg/murmurhash.h @@ -0,0 +1,53 @@ +//----------------------------------------------------------------------------- +// MurmurHash3 was written by Austin Appleby, and is placed in the public +// domain. The author hereby disclaims copyright to this source code. + +#ifndef _MURMURHASH3_H_ +#define _MURMURHASH3_H_ + +//----------------------------------------------------------------------------- +// Platform-specific functions and macros + +// Microsoft Visual Studio + +#if defined(_MSC_VER) && (_MSC_VER < 1600) + +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; + +// Other compilers + +#else // defined(_MSC_VER) + +#include + +#endif // !defined(_MSC_VER) + +//----------------------------------------------------------------------------- + +void MurmurHash3_x86_32 ( const void * key, int len, uint32_t seed, void * out ); + +void MurmurHash3_x86_128 ( const void * key, int len, uint32_t seed, void * out ); + +void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out ); + +//----------------------------------------------------------------------------- + +#ifdef _WIN64 +static inline +unsigned long long murmurhash(const void* data, int len) +{ + unsigned long long hash[2]; + MurmurHash3_x64_128(data, len, 0x1337, hash); +#else //x86 +static inline +unsigned long murmurhash(const void* data, int len) +{ + unsigned int hash[1]; + MurmurHash3_x86_32(data, len, 0x1337, hash); +#endif //_WIN64 + return hash[0]; +} + +#endif // _MURMURHASH3_H_ diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj b/x64_dbg_dbg/x64_dbg_dbg.vcxproj index 0f377ec8..2a5fbc51 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj @@ -25,6 +25,7 @@ + @@ -62,6 +63,7 @@ + diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index 4acc1620..8d7b6916 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -114,6 +114,9 @@ Source Files + + Source Files + @@ -233,5 +236,8 @@ Header Files\jansson + + Header Files + \ No newline at end of file From 425bd2f36157a508927f20ff3f6a29d2d8f149b2 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 00:33:56 +0200 Subject: [PATCH 119/676] DBG: allow '-' in front of any value (valfromstring) --- x64_dbg_dbg/value.cpp | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/x64_dbg_dbg/value.cpp b/x64_dbg_dbg/value.cpp index 0c9ef6f9..5badc2f5 100644 --- a/x64_dbg_dbg/value.cpp +++ b/x64_dbg_dbg/value.cpp @@ -1143,25 +1143,13 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, { if(!value or !string) return false; - else if(*string=='.' and string[1]=='-' and string[2]) //negative decimal number + uint finalMul=1; + if(*string=='-') //negative { - uint finalMul=1; - if(value_size) - *value_size=0; - if(isvar) - *isvar=false; - int decAdd=1; - if(string[1]=='-') //negative number - { - decAdd++; - finalMul=~0; - } - uint newValue=0; - sscanf(string+decAdd, "%"fext"u", &newValue); - *value=newValue*finalMul; - return true; + finalMul=~0; + string++; } - else if(!*string) + if(!*string) { *value=0; return true; @@ -1202,6 +1190,7 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, } bool ret=mathfromstring(string_+add, value, silent, baseonly, value_size, isvar); efree(string_, "valfromstring:string_"); + *value*=finalMul; return ret; } else if(*string=='@' or strstr(string, "[")) //memory location @@ -1265,6 +1254,7 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value_size=read_size; if(isvar) *isvar=true; + *value*=finalMul; return true; } else if(isregister(string)) //register @@ -1283,6 +1273,7 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value=getregister(value_size, string); if(isvar) *isvar=true; + *value*=finalMul; return true; } else if(*string=='!' and isflag(string+1)) //flag @@ -1307,6 +1298,7 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value_size=0; if(isvar) *isvar=true; + *value*=finalMul; return true; } else if(isdecnumber(string)) //decimal numbers come 'first' @@ -1316,6 +1308,7 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, if(isvar) *isvar=false; sscanf(string+1, "%"fext"u", value); + *value*=finalMul; return true; } else if(ishexnumber(string)) //then hex numbers @@ -1329,21 +1322,32 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, if(*string=='x') inc=1; sscanf(string+inc, "%"fext"x", value); + *value*=finalMul; return true; } if(baseonly) return false; else if(valapifromstring(string, value, value_size, true, silent, hexonly)) //then come APIs + { + *value*=finalMul; return true; + } else if(labelfromstring(string, value)) //then come labels + { + *value*=finalMul; return true; + } else if(symfromname(string, value)) //then come symbols + { + *value*=finalMul; return true; + } else if(varget(string, value, value_size, 0)) //finally variables { if(isvar) *isvar=true; + *value*=finalMul; return true; } if(!silent) From 3b34cf5d813ff220dbba6db3403fc8332a8c34cb Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 00:45:37 +0200 Subject: [PATCH 120/676] GUI: better highlighting mode behavior --- .../Project/Src/Gui/CPUDisassembly.cpp | 26 +++++++++++++------ x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h | 4 +-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp index a38d20b1..ed7ec5fe 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.cpp @@ -24,7 +24,14 @@ void CPUDisassembly::mousePressEvent(QMouseEvent* event) } } else + { Disassembly::mousePressEvent(event); + if(mHighlightingMode) //disable highlighting mode after clicked + { + mHighlightingMode=false; + reloadData(); + } + } } void CPUDisassembly::mouseDoubleClickEvent(QMouseEvent* event) @@ -168,9 +175,14 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) } wMenu->addMenu(mBPMenu); + wMenu->addSeparator(); + wMenu->addAction(mEnableHighlightingMode); + // Separator wMenu->addSeparator(); + + // New origin wMenu->addAction(mSetNewOriginHere); @@ -203,9 +215,6 @@ void CPUDisassembly::contextMenuEvent(QContextMenuEvent* event) mReferencesMenu->addAction(mReferenceSelectedAddress); wMenu->addMenu(mReferencesMenu); - wMenu->addSeparator(); - wMenu->addAction(mToggleHighlightingMode); - QAction* wAction = wMenu->exec(event->globalPos()); } } @@ -355,10 +364,11 @@ void CPUDisassembly::setupRightClickContextMenu() connect(mSearchStrings, SIGNAL(triggered()), this, SLOT(findStrings())); // Highlighting mode - mToggleHighlightingMode = new QAction("Toggle &highlighting mode", this); - mToggleHighlightingMode->setShortcutContext(Qt::WidgetShortcut); - mToggleHighlightingMode->setShortcut(QKeySequence("ctrl+h")); - connect(mToggleHighlightingMode, SIGNAL(triggered()), this, SLOT(toggleHighlightingMode())); + mEnableHighlightingMode = new QAction("&Highlighting mode", this); + mEnableHighlightingMode->setShortcutContext(Qt::WidgetShortcut); + mEnableHighlightingMode->setShortcut(QKeySequence("ctrl+h")); + this->addAction(mEnableHighlightingMode); + connect(mEnableHighlightingMode, SIGNAL(triggered()), this, SLOT(enableHighlightingMode())); } void CPUDisassembly::gotoOrigin() @@ -727,7 +737,7 @@ void CPUDisassembly::selectionSet(const SELECTIONDATA* selection) Bridge::getBridge()->BridgeSetResult(1); } -void CPUDisassembly::toggleHighlightingMode() +void CPUDisassembly::enableHighlightingMode() { if(mHighlightingMode) mHighlightingMode=false; diff --git a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h index 119d0f0e..0eb045ca 100644 --- a/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h +++ b/x64_dbg_gui/Project/Src/Gui/CPUDisassembly.h @@ -56,7 +56,7 @@ public slots: void findStrings(); void selectionGet(SELECTIONDATA* selection); void selectionSet(const SELECTIONDATA* selection); - void toggleHighlightingMode(); + void enableHighlightingMode(); private: @@ -88,7 +88,7 @@ private: QAction* mReferenceSelectedAddress; QAction* mSearchConstant; QAction* mSearchStrings; - QAction* mToggleHighlightingMode; + QAction* mEnableHighlightingMode; GotoDialog* mGoto; }; From dbef65e09b69fb0268edd4308eabf31a7970c164 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 03:41:09 +0200 Subject: [PATCH 121/676] DBG: better (hopefully) module lookup functions --- x64_dbg_dbg/addrinfo.cpp | 87 ++++++++++++++++++---------------------- x64_dbg_dbg/addrinfo.h | 33 ++++++++++++--- 2 files changed, 67 insertions(+), 53 deletions(-) diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 6099e318..25029545 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -5,8 +5,8 @@ #include "breakpoint.h" #include "threading.h" #include "symbolinfo.h" +#include "murmurhash.h" -//TODO: faster module lookup functions (http://bit.ly/TbJlu3) //TODO: use murmurhash(modname+rva) as key for the maps for "instant" lookup static ModulesInfo modinfo; @@ -35,7 +35,10 @@ void dbload() DWORD ticks=GetTickCount(); JSON root=json_load_file(dbpath, 0, 0); if(!root) + { + dputs(""); return; + } commentcacheload(root); json_decref(root); //free root dprintf("%ums\n", GetTickCount()-ticks); @@ -71,6 +74,7 @@ bool modload(uint base, uint size, const char* fullpath) len--; MODINFO info; memset(&info, 0, sizeof(MODINFO)); + info.hash=murmurhash(name, strlen(name)); if(len) { strcpy(info.extension, name+len); @@ -81,7 +85,7 @@ bool modload(uint base, uint size, const char* fullpath) info.size=size; strcpy(info.name, name); _strlwr(info.name); - modinfo.push_back(info); + modinfo.insert(std::make_pair(Range(base, base+size-1), info)); symupdatemodulelist(); dbupdate(); return true; @@ -89,18 +93,12 @@ bool modload(uint base, uint size, const char* fullpath) bool modunload(uint base) { - int total=modinfo.size(); - for(int i=0; i=modstart and addrsecond.name); + if(extension) + strcat(modname, found->second.extension); //append extension + return true; } uint modbasefromaddr(uint addr) { - int total=modinfo.size(); - for(int i=0; i=modstart and addrsecond.base; +} + +uint modhashfromaddr(uint addr) +{ + ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); + if(found==modinfo.end()) //not found + return 0; + return found->second.hash; } uint modbasefromname(const char* modname) { - if(!modname) + if(!modname or strlen(modname)>=MAX_MODULE_SIZE) return 0; - int total=modinfo.size(); - int modname_len=strlen(modname); - if(modname_len>=MAX_MODULE_SIZE) - return 0; - for(int i=0; isecond; char curmodname[MAX_MODULE_SIZE]=""; - sprintf(curmodname, "%s%s", modinfo.at(i).name, modinfo.at(i).extension); + sprintf(curmodname, "%s%s", curMod->name, curMod->extension); if(!_stricmp(curmodname, modname)) //with extension - return modinfo.at(i).base; - if(!_stricmp(modinfo.at(i).name, modname)) //without extension - return modinfo.at(i).base; + return curMod->base; + if(!_stricmp(curMod->name, modname)) //without extension + return curMod->base; } return 0; } diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index db482382..e48543d2 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -3,15 +3,38 @@ #include "_global.h" +//ranges +typedef std::pair Range; + +struct RangeCompare +{ + bool operator()(const Range& a, const Range& b) //a before b? + { + return a.second < b.first; + } +}; + +struct OverlappingRangeCompare +{ + bool operator()(const Range& a, const Range& b) //a before b? + { + return a.second < b.first || a.second < b.second; + } +}; + //structures struct MODINFO { - uint base; - uint size; - char name[MAX_MODULE_SIZE]; - char extension[MAX_MODULE_SIZE]; + uint base; //module base + uint size; //module size + uint hash; //full module name hash + char name[MAX_MODULE_SIZE]; //module name (without extension) + char extension[MAX_MODULE_SIZE]; //file extension }; +typedef std::map ModulesInfo; + + struct COMMENTSINFO { char mod[MAX_MODULE_SIZE]; @@ -58,7 +81,6 @@ struct LOOPSINFO //typedefs typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr); -typedef std::vector ModulesInfo; typedef std::map CommentsInfo; typedef std::map LabelsInfo; typedef std::map BookmarksInfo; @@ -75,6 +97,7 @@ bool modunload(uint base); void modclear(); bool modnamefromaddr(uint addr, char* modname, bool extension); uint modbasefromaddr(uint addr); +uint modhashfromaddr(uint addr); uint modbasefromname(const char* modname); bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); From 26d653e9d81ab2b076a8748e6fcf781139664941 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 05:04:47 +0200 Subject: [PATCH 122/676] DBG: module list in an std::map + comments in an std::map + call modunload --- x64_dbg_dbg/addrinfo.cpp | 79 +++++++++++++++++----------------------- x64_dbg_dbg/addrinfo.h | 8 ++-- x64_dbg_dbg/debugger.cpp | 2 + 3 files changed, 39 insertions(+), 50 deletions(-) diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 25029545..3a7c288c 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -7,7 +7,7 @@ #include "symbolinfo.h" #include "murmurhash.h" -//TODO: use murmurhash(modname+rva) as key for the maps for "instant" lookup +//TODO: use modinfo.hash+rva as key for the maps for "instant" lookup static ModulesInfo modinfo; static CommentsInfo comments; @@ -44,12 +44,6 @@ void dbload() dprintf("%ums\n", GetTickCount()-ticks); } -void dbupdate() -{ - dbsave(); //flush cache to disk - dbload(); //load database to cache (and update the module bases + VAs) -} - void dbclose() { dbsave(); @@ -68,32 +62,30 @@ bool modload(uint base, uint size, const char* fullpath) if(len) len++; strcpy(name, fullpath+len); + _strlwr(name); len=strlen(name); name[MAX_MODULE_SIZE-1]=0; //ignore later characters while(name[len]!='.' and len) len--; MODINFO info; memset(&info, 0, sizeof(MODINFO)); - info.hash=murmurhash(name, strlen(name)); + info.hash=modhashfromname(name); if(len) { strcpy(info.extension, name+len); - _strlwr(info.extension); name[len]=0; //remove extension } info.base=base; info.size=size; strcpy(info.name, name); - _strlwr(info.name); modinfo.insert(std::make_pair(Range(base, base+size-1), info)); symupdatemodulelist(); - dbupdate(); return true; } bool modunload(uint base) { - ModulesInfo::iterator found=modinfo.find(Range(base, base)); + const ModulesInfo::iterator found=modinfo.find(Range(base, base)); if(found==modinfo.end()) //not found return false; modinfo.erase(found); @@ -112,7 +104,7 @@ bool modnamefromaddr(uint addr, char* modname, bool extension) if(!modname) return false; *modname='\0'; - ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); + const ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); if(found==modinfo.end()) //not found return false; strcpy(modname, found->second.name); @@ -123,18 +115,26 @@ bool modnamefromaddr(uint addr, char* modname, bool extension) uint modbasefromaddr(uint addr) { - ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); + const ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); if(found==modinfo.end()) //not found return 0; return found->second.base; } -uint modhashfromaddr(uint addr) +uint modhashfromva(uint va) //return a unique hash from a VA { - ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); + const ModulesInfo::iterator found=modinfo.find(Range(va, va)); if(found==modinfo.end()) //not found + return va; + return found->second.hash+(va-found->second.base); +} + +uint modhashfromname(const char* mod) //return MODINFO.hash +{ + if(!mod or !*mod) return 0; - return found->second.hash; + int len=strlen(mod); + return murmurhash(mod, len); } uint modbasefromname(const char* modname) @@ -242,10 +242,9 @@ bool commentset(uint addr, const char* text, bool manual) strcpy(comment.text, text); modnamefromaddr(addr, comment.mod, true); comment.addr=addr-modbasefromaddr(addr); - if(comments.count(addr)) //contains addr - comments[addr]=comment; - else - comments.insert(std::make_pair(addr, comment)); + const uint key=modhashfromva(addr); + if(!comments.insert(std::make_pair(key, comment)).second) //key already present + comments[key]=comment; return true; } @@ -253,33 +252,27 @@ bool commentget(uint addr, char* text) { if(!DbgIsDebugging()) return false; - if(comments.count(addr)) //contains - { - strcpy(text, comments[addr].text); - return true; - } - return false; + const CommentsInfo::iterator found=comments.find(modhashfromva(addr)); + if(found==comments.end()) //not found + return false; + strcpy(text, found->second.text); + return true; } bool commentdel(uint addr) { if(!DbgIsDebugging()) return false; - if(comments.count(addr)) //contains - { - comments.erase(addr); - return true; - } - return false; + return (comments.erase(modhashfromva(addr))==1); } void commentcachesave(JSON root) { - JSON jsoncomments=json_array(); - JSON jsonautocomments=json_array(); + const JSON jsoncomments=json_array(); + const JSON jsonautocomments=json_array(); for(CommentsInfo::iterator i=comments.begin(); i!=comments.end(); ++i) { - COMMENTSINFO curComment=i->second; + const COMMENTSINFO curComment=i->second; JSON curjsoncomment=json_object(); if(*curComment.mod) json_object_set_new(curjsoncomment, "module", json_string(curComment.mod)); @@ -303,7 +296,7 @@ void commentcachesave(JSON root) void commentcacheload(JSON root) { comments.clear(); - JSON jsoncomments=json_object_get(root, "comments"); + const JSON jsoncomments=json_object_get(root, "comments"); if(jsoncomments) { size_t i; @@ -317,16 +310,14 @@ void commentcacheload(JSON root) else *curComment.mod='\0'; curComment.addr=json_hex_value(json_object_get(value, "address")); - if(!curComment.addr) - continue; //skip curComment.manual=true; const char* text=json_string_value(json_object_get(value, "text")); if(text) strcpy(curComment.text, text); else continue; //skip - uint modbase=modbasefromname(curComment.mod); - comments.insert(std::make_pair(curComment.addr+modbase, curComment)); + const uint key=modhashfromname(curComment.mod)+curComment.addr; + comments.insert(std::make_pair(key, curComment)); } } JSON jsonautocomments=json_object_get(root, "autocomments"); @@ -343,16 +334,14 @@ void commentcacheload(JSON root) else *curComment.mod='\0'; curComment.addr=json_hex_value(json_object_get(value, "address")); - if(!curComment.addr) - continue; //skip curComment.manual=false; const char* text=json_string_value(json_object_get(value, "text")); if(text) strcpy(curComment.text, text); else continue; //skip - uint modbase=modbasefromname(curComment.mod); - comments.insert(std::make_pair(curComment.addr+modbase, curComment)); + const uint key=modhashfromname(curComment.mod)+curComment.addr; + comments.insert(std::make_pair(key, curComment)); } } } diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index e48543d2..9b036277 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -31,10 +31,8 @@ struct MODINFO char name[MAX_MODULE_SIZE]; //module name (without extension) char extension[MAX_MODULE_SIZE]; //file extension }; - typedef std::map ModulesInfo; - struct COMMENTSINFO { char mod[MAX_MODULE_SIZE]; @@ -42,6 +40,7 @@ struct COMMENTSINFO char text[MAX_COMMENT_SIZE]; bool manual; }; +typedef std::map CommentsInfo; struct LABELSINFO { @@ -81,7 +80,6 @@ struct LOOPSINFO //typedefs typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr); -typedef std::map CommentsInfo; typedef std::map LabelsInfo; typedef std::map BookmarksInfo; typedef std::vector FunctionsInfo; @@ -89,7 +87,6 @@ typedef std::vector LoopsInfo; void dbsave(); void dbload(); -void dbupdate(); void dbclose(); bool modload(uint base, uint size, const char* fullpath); @@ -97,7 +94,8 @@ bool modunload(uint base); void modclear(); bool modnamefromaddr(uint addr, char* modname, bool extension); uint modbasefromaddr(uint addr); -uint modhashfromaddr(uint addr); +uint modhashfromva(uint va); +uint modhashfromname(const char* mod); uint modbasefromname(const char* modname); bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 94a98bc1..4c743518 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -777,6 +777,8 @@ static void cbUnloadDll(UNLOAD_DLL_DEBUG_INFO* UnloadDll) plugincbcall(CB_PAUSEDEBUG, &pauseInfo); wait(WAITID_RUN); } + + modunload((uint)base); } static void cbOutputDebugString(OUTPUT_DEBUG_STRING_INFO* DebugString) From 974be7ee3e9f61bcede719245457737df498207e Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 14:30:09 +0200 Subject: [PATCH 123/676] DBG: labels + bookmarks working in database --- x64_dbg_dbg/addrinfo.cpp | 185 ++++++++++++++++++++++++++++++++++----- x64_dbg_dbg/addrinfo.h | 9 +- 2 files changed, 171 insertions(+), 23 deletions(-) diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 3a7c288c..56a4e04f 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -23,6 +23,8 @@ void dbsave() DWORD ticks=GetTickCount(); JSON root=json_object(); commentcachesave(root); + labelcachesave(root); + bookmarkcachesave(root); if(json_object_size(root)) json_dump_file(root, dbpath, JSON_INDENT(4)); json_decref(root); //free root @@ -40,6 +42,8 @@ void dbload() return; } commentcacheload(root); + labelcacheload(root); + bookmarkcacheload(root); json_decref(root); //free root dprintf("%ums\n", GetTickCount()-ticks); } @@ -358,10 +362,9 @@ bool labelset(uint addr, const char* text, bool manual) strcpy(label.text, text); modnamefromaddr(addr, label.mod, true); label.addr=addr-modbasefromaddr(addr); - if(labels.count(addr)) //contains - labels[addr]=label; - else - labels.insert(std::make_pair(addr, label)); + uint key=modhashfromva(addr); + if(!labels.insert(std::make_pair(modhashfromva(key), label)).second) //already present + labels[key]=label; return true; } @@ -374,7 +377,7 @@ bool labelfromstring(const char* text, uint* addr) if(!strcmp(i->second.text, text)) { if(addr) - *addr=i->first; + *addr=i->second.addr+modbasefromname(i->second.mod); return true; } } @@ -385,24 +388,99 @@ bool labelget(uint addr, char* text) { if(!DbgIsDebugging()) return false; - if(labels.count(addr)) //contains - { - strcpy(text, labels[addr].text); - return true; - } - return false; + LabelsInfo::iterator found=labels.find(modhashfromva(addr)); + if(found==labels.end()) //not found + return false; + if(text) + strcpy(text, found->second.text); + return true; } bool labeldel(uint addr) { if(!DbgIsDebugging()) return false; - if(labels.count(addr)) + return (labels.erase(modhashfromva(addr))>0); +} + +void labelcachesave(JSON root) +{ + const JSON jsonlabels=json_array(); + const JSON jsonautolabels=json_array(); + for(LabelsInfo::iterator i=labels.begin(); i!=labels.end(); ++i) { - labels.erase(addr); - return true; + const LABELSINFO curLabel=i->second; + JSON curjsonlabel=json_object(); + if(*curLabel.mod) + json_object_set_new(curjsonlabel, "module", json_string(curLabel.mod)); + else + json_object_set_new(curjsonlabel, "module", json_null()); + json_object_set_new(curjsonlabel, "address", json_hex(curLabel.addr)); + json_object_set_new(curjsonlabel, "text", json_string(curLabel.text)); + if(curLabel.manual) + json_array_append_new(jsonlabels, curjsonlabel); + else + json_array_append_new(jsonautolabels, curjsonlabel); + } + if(json_array_size(jsonlabels)) + json_object_set(root, "labels", jsonlabels); + json_decref(jsonlabels); + if(json_array_size(jsonautolabels)) + json_object_set(root, "autolabels", jsonautolabels); + json_decref(jsonautolabels); +} + +void labelcacheload(JSON root) +{ + labels.clear(); + const JSON jsonlabels=json_object_get(root, "labels"); + if(jsonlabels) + { + size_t i; + JSON value; + json_array_foreach(jsonlabels, i, value) + { + LABELSINFO curLabel; + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod)0); +} + +void bookmarkcachesave(JSON root) +{ + const JSON jsonbookmarks=json_array(); + const JSON jsonautobookmarks=json_array(); + for(BookmarksInfo::iterator i=bookmarks.begin(); i!=bookmarks.end(); ++i) { - bookmarks.erase(addr); - return true; + const BOOKMARKSINFO curBookmark=i->second; + JSON curjsonbookmark=json_object(); + if(*curBookmark.mod) + json_object_set_new(curjsonbookmark, "module", json_string(curBookmark.mod)); + else + json_object_set_new(curjsonbookmark, "module", json_null()); + json_object_set_new(curjsonbookmark, "address", json_hex(curBookmark.addr)); + if(curBookmark.manual) + json_array_append_new(jsonbookmarks, curjsonbookmark); + else + json_array_append_new(jsonautobookmarks, curjsonbookmark); + } + if(json_array_size(jsonbookmarks)) + json_object_set(root, "bookmarks", jsonbookmarks); + json_decref(jsonbookmarks); + if(json_array_size(jsonautobookmarks)) + json_object_set(root, "autobookmarks", jsonautobookmarks); + json_decref(jsonautobookmarks); +} + +void bookmarkcacheload(JSON root) +{ + bookmarks.clear(); + const JSON jsonbookmarks=json_object_get(root, "bookmarks"); + if(jsonbookmarks) + { + size_t i; + JSON value; + json_array_foreach(jsonbookmarks, i, value) + { + BOOKMARKSINFO curBookmark; + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod) LabelsInfo; struct BOOKMARKSINFO { @@ -56,6 +57,7 @@ struct BOOKMARKSINFO uint addr; bool manual; }; +typedef std::map BookmarksInfo; struct FUNCTIONSINFO { @@ -80,8 +82,6 @@ struct LOOPSINFO //typedefs typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr); -typedef std::map LabelsInfo; -typedef std::map BookmarksInfo; typedef std::vector FunctionsInfo; typedef std::vector LoopsInfo; @@ -110,10 +110,15 @@ bool labelset(uint addr, const char* text, bool manual); bool labelfromstring(const char* text, uint* addr); bool labelget(uint addr, char* text); bool labeldel(uint addr); +void labelcachesave(JSON root); +void labelcacheload(JSON root); bool bookmarkset(uint addr, bool manual); bool bookmarkget(uint addr); bool bookmarkdel(uint addr); +void bookmarkcachesave(JSON root); +void bookmarkcacheload(JSON root); + bool functionadd(uint start, uint end, bool manual); bool functionget(uint addr, uint* start, uint* end); From d0160f2f0a01422b4a94bcd753158c628ba733bf Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 17:12:44 +0200 Subject: [PATCH 124/676] DBG: save functions & loops to database --- x64_dbg_dbg/addrinfo.cpp | 275 ++++++++++++++++++++++++++++++--------- x64_dbg_dbg/addrinfo.h | 48 +++++-- 2 files changed, 255 insertions(+), 68 deletions(-) diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 56a4e04f..b4a5a560 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -25,6 +25,8 @@ void dbsave() commentcachesave(root); labelcachesave(root); bookmarkcachesave(root); + functioncachesave(root); + loopcachesave(root); if(json_object_size(root)) json_dump_file(root, dbpath, JSON_INDENT(4)); json_decref(root); //free root @@ -44,6 +46,8 @@ void dbload() commentcacheload(root); labelcacheload(root); bookmarkcacheload(root); + functioncacheload(root); + loopcacheload(root); json_decref(root); //free root dprintf("%ums\n", GetTickCount()-ticks); } @@ -52,6 +56,10 @@ void dbclose() { dbsave(); CommentsInfo().swap(comments); + LabelsInfo().swap(labels); + BookmarksInfo().swap(bookmarks); + FunctionsInfo().swap(functions); + LoopsInfo().swap(loops); } ///module functions @@ -388,7 +396,7 @@ bool labelget(uint addr, char* text) { if(!DbgIsDebugging()) return false; - LabelsInfo::iterator found=labels.find(modhashfromva(addr)); + const LabelsInfo::iterator found=labels.find(modhashfromva(addr)); if(found==labels.end()) //not found return false; if(text) @@ -585,17 +593,20 @@ void bookmarkcacheload(JSON root) ///function database bool functionadd(uint start, uint end, bool manual) { - if(!DbgIsDebugging() or endhProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page + if(!DbgIsDebugging() or endhProcess, start, 0); + if(!page or page!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page return false; if(functionoverlaps(start, end)) return false; FUNCTIONSINFO function; modnamefromaddr(start, function.mod, true); - function.modbase=modbasefromaddr(start); - function.start=start-function.modbase; - function.end=end-function.modbase; + uint modbase=modbasefromaddr(start); + function.start=start-modbase; + function.end=end-modbase; function.manual=manual; - functions.push_back(function); + functions.insert(std::make_pair(ModuleRange(modhashfromva(modbase), Range(function.start, function.end)), function)); return true; } @@ -603,90 +614,148 @@ bool functionget(uint addr, uint* start, uint* end) { if(!DbgIsDebugging()) return false; - for(FunctionsInfo::iterator i=functions.begin(); i!=functions.end(); ++i) - { - uint curAddr=addr-i->modbase; - if(i->start<=curAddr and i->end>=curAddr) - { - if(start) - *start=i->start+i->modbase; - if(end) - *end=i->end+i->modbase; - return true; - } - } - return false; + uint modbase=modbasefromaddr(addr); + const FunctionsInfo::iterator found=functions.find(ModuleRange(modhashfromva(modbase), Range(addr-modbase, addr-modbase))); + if(found==functions.end()) //not found + return false; + if(start) + *start=found->second.start+modbase; + if(end) + *end=found->second.end+modbase; + return true; } bool functionoverlaps(uint start, uint end) { - if(!DbgIsDebugging()) + if(!DbgIsDebugging() or endmodbase; - uint curEnd=end-i->modbase; - if(i->start<=curEnd and i->end>=curStart) - return true; - } - return false; + const uint modbase=modbasefromaddr(start); + return (functions.count(ModuleRange(modhashfromva(modbase), Range(start-modbase, end-modbase)))>0); } bool functiondel(uint addr) { if(!DbgIsDebugging()) return false; + const uint modbase=modbasefromaddr(addr); + return (functions.erase(ModuleRange(modhashfromva(modbase), Range(addr-modbase, addr-modbase)))>0); +} + +void functioncachesave(JSON root) +{ + const JSON jsonfunctions=json_array(); + const JSON jsonautofunctions=json_array(); for(FunctionsInfo::iterator i=functions.begin(); i!=functions.end(); ++i) { - uint curAddr=addr-i->modbase; - if(i->start<=curAddr and i->end>=curAddr) + const FUNCTIONSINFO curFunction=i->second; + JSON curjsonfunction=json_object(); + if(*curFunction.mod) + json_object_set_new(curjsonfunction, "module", json_string(curFunction.mod)); + else + json_object_set_new(curjsonfunction, "module", json_null()); + json_object_set_new(curjsonfunction, "start", json_hex(curFunction.start)); + json_object_set_new(curjsonfunction, "end", json_hex(curFunction.end)); + if(curFunction.manual) + json_array_append_new(jsonfunctions, curjsonfunction); + else + json_array_append_new(jsonautofunctions, curjsonfunction); + } + if(json_array_size(jsonfunctions)) + json_object_set(root, "functions", jsonfunctions); + json_decref(jsonfunctions); + if(json_array_size(jsonautofunctions)) + json_object_set(root, "autofunctions", jsonautofunctions); + json_decref(jsonautofunctions); +} + +void functioncacheload(JSON root) +{ + functions.clear(); + const JSON jsonfunctions=json_object_get(root, "functions"); + if(jsonfunctions) + { + size_t i; + JSON value; + json_array_foreach(jsonfunctions, i, value) { - functions.erase(i); - return true; + FUNCTIONSINFO curFunction; + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod)hProcess, start, 0)!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)!=0) //the function boundaries are not in the same mem page + if(!DbgIsDebugging() or endhProcess, start, 0); + if(!page or page!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page return false; int finaldepth; if(loopoverlaps(0, start, end, &finaldepth)) //loop cannot overlap another loop return false; LOOPSINFO loop; modnamefromaddr(start, loop.mod, true); - loop.modbase=modbasefromaddr(start); - loop.start=start-loop.modbase; - loop.end=end-loop.modbase; + const uint modbase=modbasefromaddr(start); + loop.start=start-modbase; + loop.end=end-modbase; loop.depth=finaldepth; if(finaldepth) - loop.parent=finaldepth-1; + loopget(finaldepth-1, start, &loop.parent, 0); else loop.parent=0; loop.manual=manual; - return false; + loops.insert(std::make_pair(DepthModuleRange(finaldepth, ModuleRange(modhashfromva(modbase), Range(loop.start, loop.end))), loop)); + return true; } bool loopget(int depth, uint addr, uint* start, uint* end) { if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) return false; - for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i) - { - uint curAddr=addr-i->modbase; - if(i->start<=curAddr and i->end>=curAddr and i->depth==depth) - { - if(start) - *start=i->start+i->modbase; - if(end) - *end=i->end+i->modbase; - return true; - } - } - return false; + const uint modbase=modbasefromaddr(addr); + LoopsInfo::iterator found=loops.find(DepthModuleRange(depth, ModuleRange(modhashfromva(modbase), Range(addr-modbase, addr-modbase)))); + if(found==loops.end()) //not found + return false; + if(start) + *start=found->second.start+modbase; + if(end) + *end=found->second.end+modbase; + return true; } //check if a loop overlaps a range, inside is not overlapping @@ -694,13 +763,20 @@ bool loopoverlaps(int depth, uint start, uint end, int* finaldepth) { if(!DbgIsDebugging()) return false; + + const uint modbase=modbasefromaddr(start); + uint curStart=start-modbase; + uint curEnd=end-modbase; + const uint key=modhashfromva(modbase); + //check if the new loop fits in the old loop for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i) { - uint curStart=start-i->modbase; - uint curEnd=end-i->modbase; - if(i->startend>curEnd and i->depth==depth) - return loopoverlaps(depth+1, start, end, finaldepth); + if(i->first.second.first!=key) //only look in the current module + continue; + LOOPSINFO* curLoop=&i->second; + if(curLoop->startend>curEnd and curLoop->depth==depth) + return loopoverlaps(depth+1, curStart, curEnd, finaldepth); } if(finaldepth) @@ -709,9 +785,10 @@ bool loopoverlaps(int depth, uint start, uint end, int* finaldepth) //check for loop overlaps for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i) { - uint curStart=start-i->modbase; - uint curEnd=end-i->modbase; - if(i->start<=curEnd and i->end>=curStart and i->depth==depth) + if(i->first.second.first!=key) //only look in the current module + continue; + LOOPSINFO* curLoop=&i->second; + if(curLoop->start<=curEnd and curLoop->end>=curStart and curLoop->depth==depth) return true; } return false; @@ -721,3 +798,83 @@ bool loopdel(int depth, uint addr) { return false; } + +void loopcachesave(JSON root) +{ + const JSON jsonloops=json_array(); + const JSON jsonautoloops=json_array(); + for(LoopsInfo::iterator i=loops.begin(); i!=loops.end(); ++i) + { + const LOOPSINFO curLoop=i->second; + JSON curjsonloop=json_object(); + if(*curLoop.mod) + json_object_set_new(curjsonloop, "module", json_string(curLoop.mod)); + else + json_object_set_new(curjsonloop, "module", json_null()); + json_object_set_new(curjsonloop, "start", json_hex(curLoop.start)); + json_object_set_new(curjsonloop, "end", json_hex(curLoop.end)); + json_object_set_new(curjsonloop, "depth", json_integer(curLoop.depth)); + json_object_set_new(curjsonloop, "parent", json_hex(curLoop.parent)); + if(curLoop.manual) + json_array_append_new(jsonloops, curjsonloop); + else + json_array_append_new(jsonautoloops, curjsonloop); + } + if(json_array_size(jsonloops)) + json_object_set(root, "loops", jsonloops); + json_decref(jsonloops); + if(json_array_size(jsonautoloops)) + json_object_set(root, "autoloops", jsonautoloops); + json_decref(jsonautoloops); +} + +void loopcacheload(JSON root) +{ + loops.clear(); + const JSON jsonloops=json_object_get(root, "loops"); + if(jsonloops) + { + size_t i; + JSON value; + json_array_foreach(jsonloops, i, value) + { + LOOPSINFO curLoop; + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod) Range; +typedef std::pair ModuleRange; //modhash + RVA range +typedef std::pair DepthModuleRange; //depth + modulerange struct RangeCompare { - bool operator()(const Range& a, const Range& b) //a before b? + bool operator()(const Range& a, const Range& b) const //a before b? { return a.second < b.first; } @@ -16,12 +18,40 @@ struct RangeCompare struct OverlappingRangeCompare { - bool operator()(const Range& a, const Range& b) //a before b? + bool operator()(const Range& a, const Range& b) const //a before b? { return a.second < b.first || a.second < b.second; } }; +struct ModuleRangeCompare +{ + bool operator()(const ModuleRange& a, const ModuleRange& b) const + { + if(a.first < b.first) //module hash is smaller + return true; + if(a.first != b.first) //module hashes are not equal + return false; + return a.second.second < b.second.first; //a.second is before b.second + } +}; + +struct DepthModuleRangeCompare +{ + bool operator()(const DepthModuleRange& a, const DepthModuleRange& b) const + { + if(a.first < b.first) //module depth is smaller + return true; + if(a.first != b.first) //module depths are not equal + return false; + if(a.second.first < b.second.first) //module hash is smaller + return true; + if(a.second.first != b.second.first) //module hashes are not equal + return false; + return a.second.second.second < b.second.second.first; //a.second.second is before b.second.second + } +}; + //structures struct MODINFO { @@ -62,29 +92,26 @@ typedef std::map BookmarksInfo; struct FUNCTIONSINFO { char mod[MAX_MODULE_SIZE]; - uint modbase; uint start; uint end; bool manual; }; +typedef std::map FunctionsInfo; struct LOOPSINFO { char mod[MAX_MODULE_SIZE]; - uint modbase; uint start; uint end; - int parent; + uint parent; int depth; bool manual; }; +typedef std::map LoopsInfo; //typedefs typedef void (*EXPORTENUMCALLBACK)(uint base, const char* mod, const char* name, uint addr); -typedef std::vector FunctionsInfo; -typedef std::vector LoopsInfo; - void dbsave(); void dbload(); void dbclose(); @@ -119,15 +146,18 @@ bool bookmarkdel(uint addr); void bookmarkcachesave(JSON root); void bookmarkcacheload(JSON root); - bool functionadd(uint start, uint end, bool manual); bool functionget(uint addr, uint* start, uint* end); bool functionoverlaps(uint start, uint end); bool functiondel(uint addr); +void functioncachesave(JSON root); +void functioncacheload(JSON root); bool loopadd(uint start, uint end, bool manual); bool loopget(int depth, uint addr, uint* start, uint* end); bool loopoverlaps(int depth, uint start, uint end, int* finaldepth); bool loopdel(int depth, uint addr); +void loopcachesave(JSON root); +void loopcacheload(JSON root); #endif // _ADDRINFO_H From e9f18c2802efba7e9ffb40e505b5fc62e141df77 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 17:44:56 +0200 Subject: [PATCH 125/676] DBG: fixed some bugs in addrinfo + save breakpoints to database --- x64_dbg_dbg/addrinfo.cpp | 63 +++++++----------- x64_dbg_dbg/breakpoint.cpp | 130 ++++++++++++++++++++++++++----------- x64_dbg_dbg/breakpoint.h | 7 +- 3 files changed, 122 insertions(+), 78 deletions(-) diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index b4a5a560..5f771cfe 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -27,6 +27,7 @@ void dbsave() bookmarkcachesave(root); functioncachesave(root); loopcachesave(root); + bpcachesave(root); if(json_object_size(root)) json_dump_file(root, dbpath, JSON_INDENT(4)); json_decref(root); //free root @@ -48,6 +49,7 @@ void dbload() bookmarkcacheload(root); functioncacheload(root); loopcacheload(root); + bpcacheload(root); json_decref(root); //free root dprintf("%ums\n", GetTickCount()-ticks); } @@ -286,10 +288,7 @@ void commentcachesave(JSON root) { const COMMENTSINFO curComment=i->second; JSON curjsoncomment=json_object(); - if(*curComment.mod) - json_object_set_new(curjsoncomment, "module", json_string(curComment.mod)); - else - json_object_set_new(curjsoncomment, "module", json_null()); + json_object_set_new(curjsoncomment, "module", json_string(curComment.mod)); json_object_set_new(curjsoncomment, "address", json_hex(curComment.addr)); json_object_set_new(curjsoncomment, "text", json_string(curComment.text)); if(curComment.manual) @@ -321,7 +320,7 @@ void commentcacheload(JSON root) strcpy(curComment.mod, mod); else *curComment.mod='\0'; - curComment.addr=json_hex_value(json_object_get(value, "address")); + curComment.addr=(uint)json_hex_value(json_object_get(value, "address")); curComment.manual=true; const char* text=json_string_value(json_object_get(value, "text")); if(text) @@ -345,7 +344,7 @@ void commentcacheload(JSON root) strcpy(curComment.mod, mod); else *curComment.mod='\0'; - curComment.addr=json_hex_value(json_object_get(value, "address")); + curComment.addr=(uint)json_hex_value(json_object_get(value, "address")); curComment.manual=false; const char* text=json_string_value(json_object_get(value, "text")); if(text) @@ -419,10 +418,7 @@ void labelcachesave(JSON root) { const LABELSINFO curLabel=i->second; JSON curjsonlabel=json_object(); - if(*curLabel.mod) - json_object_set_new(curjsonlabel, "module", json_string(curLabel.mod)); - else - json_object_set_new(curjsonlabel, "module", json_null()); + json_object_set_new(curjsonlabel, "module", json_string(curLabel.mod)); json_object_set_new(curjsonlabel, "address", json_hex(curLabel.addr)); json_object_set_new(curjsonlabel, "text", json_string(curLabel.text)); if(curLabel.manual) @@ -454,7 +450,7 @@ void labelcacheload(JSON root) strcpy(curLabel.mod, mod); else *curLabel.mod='\0'; - curLabel.addr=json_hex_value(json_object_get(value, "address")); + curLabel.addr=(uint)json_hex_value(json_object_get(value, "address")); curLabel.manual=true; const char* text=json_string_value(json_object_get(value, "text")); if(text) @@ -478,7 +474,7 @@ void labelcacheload(JSON root) strcpy(curLabel.mod, mod); else *curLabel.mod='\0'; - curLabel.addr=json_hex_value(json_object_get(value, "address")); + curLabel.addr=(uint)json_hex_value(json_object_get(value, "address")); curLabel.manual=false; const char* text=json_string_value(json_object_get(value, "text")); if(text) @@ -529,10 +525,7 @@ void bookmarkcachesave(JSON root) { const BOOKMARKSINFO curBookmark=i->second; JSON curjsonbookmark=json_object(); - if(*curBookmark.mod) - json_object_set_new(curjsonbookmark, "module", json_string(curBookmark.mod)); - else - json_object_set_new(curjsonbookmark, "module", json_null()); + json_object_set_new(curjsonbookmark, "module", json_string(curBookmark.mod)); json_object_set_new(curjsonbookmark, "address", json_hex(curBookmark.addr)); if(curBookmark.manual) json_array_append_new(jsonbookmarks, curjsonbookmark); @@ -563,7 +556,7 @@ void bookmarkcacheload(JSON root) strcpy(curBookmark.mod, mod); else *curBookmark.mod='\0'; - curBookmark.addr=json_hex_value(json_object_get(value, "address")); + curBookmark.addr=(uint)json_hex_value(json_object_get(value, "address")); curBookmark.manual=true; const uint key=modhashfromname(curBookmark.mod)+curBookmark.addr; bookmarks.insert(std::make_pair(key, curBookmark)); @@ -582,7 +575,7 @@ void bookmarkcacheload(JSON root) strcpy(curBookmark.mod, mod); else *curBookmark.mod='\0'; - curBookmark.addr=json_hex_value(json_object_get(value, "address")); + curBookmark.addr=(uint)json_hex_value(json_object_get(value, "address")); curBookmark.manual=false; const uint key=modhashfromname(curBookmark.mod)+curBookmark.addr; bookmarks.insert(std::make_pair(key, curBookmark)); @@ -649,10 +642,7 @@ void functioncachesave(JSON root) { const FUNCTIONSINFO curFunction=i->second; JSON curjsonfunction=json_object(); - if(*curFunction.mod) - json_object_set_new(curjsonfunction, "module", json_string(curFunction.mod)); - else - json_object_set_new(curjsonfunction, "module", json_null()); + json_object_set_new(curjsonfunction, "module", json_string(curFunction.mod)); json_object_set_new(curjsonfunction, "start", json_hex(curFunction.start)); json_object_set_new(curjsonfunction, "end", json_hex(curFunction.end)); if(curFunction.manual) @@ -684,8 +674,8 @@ void functioncacheload(JSON root) strcpy(curFunction.mod, mod); else *curFunction.mod='\0'; - curFunction.start=json_hex_value(json_object_get(value, "start")); - curFunction.end=json_hex_value(json_object_get(value, "end")); + curFunction.start=(uint)json_hex_value(json_object_get(value, "start")); + curFunction.end=(uint)json_hex_value(json_object_get(value, "end")); if(curFunction.end < curFunction.start) continue; //invalid function curFunction.manual=true; @@ -706,8 +696,8 @@ void functioncacheload(JSON root) strcpy(curFunction.mod, mod); else *curFunction.mod='\0'; - curFunction.start=json_hex_value(json_object_get(value, "start")); - curFunction.end=json_hex_value(json_object_get(value, "end")); + curFunction.start=(uint)json_hex_value(json_object_get(value, "start")); + curFunction.end=(uint)json_hex_value(json_object_get(value, "end")); if(curFunction.end < curFunction.start) continue; //invalid function curFunction.manual=true; @@ -807,10 +797,7 @@ void loopcachesave(JSON root) { const LOOPSINFO curLoop=i->second; JSON curjsonloop=json_object(); - if(*curLoop.mod) - json_object_set_new(curjsonloop, "module", json_string(curLoop.mod)); - else - json_object_set_new(curjsonloop, "module", json_null()); + json_object_set_new(curjsonloop, "module", json_string(curLoop.mod)); json_object_set_new(curjsonloop, "start", json_hex(curLoop.start)); json_object_set_new(curjsonloop, "end", json_hex(curLoop.end)); json_object_set_new(curjsonloop, "depth", json_integer(curLoop.depth)); @@ -844,10 +831,10 @@ void loopcacheload(JSON root) strcpy(curLoop.mod, mod); else *curLoop.mod='\0'; - curLoop.start=json_hex_value(json_object_get(value, "start")); - curLoop.end=json_hex_value(json_object_get(value, "end")); - curLoop.depth=json_integer_value(json_object_get(value, "depth")); - curLoop.parent=json_hex_value(json_object_get(value, "parent")); + curLoop.start=(uint)json_hex_value(json_object_get(value, "start")); + curLoop.end=(uint)json_hex_value(json_object_get(value, "end")); + curLoop.depth=(int)json_integer_value(json_object_get(value, "depth")); + curLoop.parent=(uint)json_hex_value(json_object_get(value, "parent")); if(curLoop.end < curLoop.start) continue; //invalid loop curLoop.manual=true; @@ -867,10 +854,10 @@ void loopcacheload(JSON root) strcpy(curLoop.mod, mod); else *curLoop.mod='\0'; - curLoop.start=json_hex_value(json_object_get(value, "start")); - curLoop.end=json_hex_value(json_object_get(value, "end")); - curLoop.depth=json_integer_value(json_object_get(value, "depth")); - curLoop.parent=json_hex_value(json_object_get(value, "parent")); + curLoop.start=(uint)json_hex_value(json_object_get(value, "start")); + curLoop.end=(uint)json_hex_value(json_object_get(value, "end")); + curLoop.depth=(int)json_integer_value(json_object_get(value, "depth")); + curLoop.parent=(uint)json_hex_value(json_object_get(value, "parent")); if(curLoop.end < curLoop.start) continue; //invalid loop curLoop.manual=false; diff --git a/x64_dbg_dbg/breakpoint.cpp b/x64_dbg_dbg/breakpoint.cpp index df256f75..2413d2eb 100644 --- a/x64_dbg_dbg/breakpoint.cpp +++ b/x64_dbg_dbg/breakpoint.cpp @@ -5,7 +5,7 @@ #include "memory.h" #include "threading.h" -static BreakpointsMap breakpoints; +static BreakpointsInfo breakpoints; int bpgetlist(std::vector* list) { @@ -13,10 +13,10 @@ int bpgetlist(std::vector* list) return false; BREAKPOINT curBp; int count=0; - for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + for(BreakpointsInfo::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { curBp=i->second; - curBp.addr+=curBp.modbase; + curBp.addr+=modbasefromname(curBp.mod); curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); count++; if(list) @@ -31,9 +31,9 @@ bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE ty return false; BREAKPOINT bp; modnamefromaddr(addr, bp.mod, true); - bp.modbase=modbasefromaddr(addr); + uint modbase=modbasefromaddr(addr); bp.active=true; - bp.addr=addr-bp.modbase; + bp.addr=addr-modbase; bp.enabled=enabled; if(name and *name) strcpy(bp.name, name); @@ -43,7 +43,7 @@ bool bpnew(uint addr, bool enabled, bool singleshoot, short oldbytes, BP_TYPE ty bp.singleshoot=singleshoot; bp.titantype=titantype; bp.type=type; - breakpoints.insert(std::make_pair(std::make_pair(addr, type), bp)); + breakpoints.insert(std::make_pair(BreakpointKey(type, modhashfromva(addr)), bp)); return true; } @@ -52,26 +52,35 @@ bool bpget(uint addr, BP_TYPE type, const char* name, BREAKPOINT* bp) if(!DbgIsDebugging()) return false; BREAKPOINT curBp; - for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + if(!name) + { + BreakpointsInfo::iterator found=breakpoints.find(BreakpointKey(type, modhashfromva(addr))); + if(found==breakpoints.end()) //not found + return false; + if(!bp) + return true; + curBp=found->second; + curBp.addr+=modbasefromaddr(addr); + curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); + *bp=curBp; + return true; + } + for(BreakpointsInfo::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { curBp=i->second; - curBp.addr+=curBp.modbase; - curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); if(name and *name) { - if(i->first==std::make_pair(addr, type) or !strcmp(name, curBp.name)) + if(!strcmp(name, curBp.name)) { if(bp) + { + curBp.addr+=modbasefromname(curBp.mod); + curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); *bp=curBp; + } return true; } } - else if(i->first==std::make_pair(addr, type)) - { - if(bp) - *bp=curBp; - return true; - } } return false; } @@ -80,36 +89,29 @@ bool bpdel(uint addr, BP_TYPE type) { if(!DbgIsDebugging()) return false; - if(breakpoints.count(std::make_pair(addr, type))) - { - breakpoints.erase(std::make_pair(addr, type)); - return true; - } - return false; + return (breakpoints.erase(BreakpointKey(type, modhashfromva(addr)))>0); } bool bpenable(uint addr, BP_TYPE type, bool enable) { if(!DbgIsDebugging()) return false; - if(breakpoints.count(std::make_pair(addr, type))) - { - breakpoints[std::make_pair(addr, type)].enabled=true; - return true; - } - return false; + BreakpointsInfo::iterator found=breakpoints.find(BreakpointKey(type, modhashfromva(addr))); + if(found==breakpoints.end()) //not found + return false; + breakpoints[found->first].enabled=enable; + return true; } bool bpsetname(uint addr, BP_TYPE type, const char* name) { if(!DbgIsDebugging() or !name or !*name) return false; - if(breakpoints.count(std::make_pair(addr, type))) - { - strcpy(breakpoints[std::make_pair(addr, type)].name, name); - return true; - } - return false; + BreakpointsInfo::iterator found=breakpoints.find(BreakpointKey(type, modhashfromva(addr))); + if(found==breakpoints.end()) //not found + return false; + strcpy(breakpoints[found->first].name, name); + return true; } bool bpenumall(BPENUMCALLBACK cbEnum, const char* module) @@ -118,10 +120,10 @@ bool bpenumall(BPENUMCALLBACK cbEnum, const char* module) return false; bool retval=true; BREAKPOINT curBp; - for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + for(BreakpointsInfo::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { curBp=i->second; - curBp.addr+=curBp.modbase; //RVA to VA + curBp.addr+=modbasefromname(curBp.mod); //RVA to VA curBp.active=memisvalidreadptr(fdProcessInfo->hProcess, curBp.addr); //TODO: wtf am I doing? if(module and *module) { @@ -148,7 +150,7 @@ bool bpenumall(BPENUMCALLBACK cbEnum) int bpgetcount(BP_TYPE type) { int count=0; - for(BreakpointsMap::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + for(BreakpointsInfo::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) { if(i->first.first==type) count++; @@ -181,3 +183,57 @@ void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge) bridge->type=bp_none; } } + +void bpcachesave(JSON root) +{ + const JSON jsonbreakpoints=json_array(); + for(BreakpointsInfo::iterator i=breakpoints.begin(); i!=breakpoints.end(); ++i) + { + const BREAKPOINT curBreakpoint=i->second; + if(curBreakpoint.singleshoot) + continue; //skip + JSON curjsonbreakpoint=json_object(); + json_object_set_new(curjsonbreakpoint, "address", json_hex(curBreakpoint.addr)); + json_object_set_new(curjsonbreakpoint, "enabled", json_boolean(curBreakpoint.enabled)); + if(curBreakpoint.type==BPNORMAL) + json_object_set_new(curjsonbreakpoint, "oldbytes", json_hex(curBreakpoint.oldbytes)); + json_object_set_new(curjsonbreakpoint, "type", json_integer(curBreakpoint.type)); + json_object_set_new(curjsonbreakpoint, "titantype", json_hex(curBreakpoint.titantype)); + json_object_set_new(curjsonbreakpoint, "name", json_string(curBreakpoint.name)); + json_object_set_new(curjsonbreakpoint, "module", json_string(curBreakpoint.mod)); + json_array_append_new(jsonbreakpoints, curjsonbreakpoint); + } + if(json_array_size(jsonbreakpoints)) + json_object_set(root, "breakpoints", jsonbreakpoints); + json_decref(jsonbreakpoints); +} + +void bpcacheload(JSON root) +{ + breakpoints.clear(); + const JSON jsonbreakpoints=json_object_get(root, "breakpoints"); + if(jsonbreakpoints) + { + size_t i; + JSON value; + json_array_foreach(jsonbreakpoints, i, value) + { + BREAKPOINT curBreakpoint; + memset(&curBreakpoint, 0, sizeof(BREAKPOINT)); + curBreakpoint.type=(BP_TYPE)json_integer_value(json_object_get(value, "type")); + if(curBreakpoint.type==BPNORMAL) + curBreakpoint.oldbytes=(short)json_hex_value(json_object_get(value, "oldbytes")); + curBreakpoint.addr=(uint)json_hex_value(json_object_get(value, "address")); + curBreakpoint.enabled=json_boolean_value(json_object_get(value, "enabled")); + curBreakpoint.titantype=(DWORD)json_hex_value(json_object_get(value, "titantype")); + const char* name=json_string_value(json_object_get(value, "name")); + if(name) + strcpy(curBreakpoint.name, name); + const char* mod=json_string_value(json_object_get(value, "module")); + if(mod && *mod && strlen(mod), BREAKPOINT> BreakpointsMap; +typedef std::pair BreakpointKey; +typedef std::map BreakpointsInfo; //functions int bpgetlist(std::vector* list); @@ -43,5 +42,7 @@ bool bpenumall(BPENUMCALLBACK cbEnum); bool bpenumall(BPENUMCALLBACK cbEnum, const char* module); int bpgetcount(BP_TYPE type); void bptobridge(const BREAKPOINT* bp, BRIDGEBP* bridge); +void bpcachesave(JSON root); +void bpcacheload(JSON root); #endif // _BREAKPOINT_H From c3c9f1d04d1c9e63e089651ee6feb690307a45e2 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 17:45:21 +0200 Subject: [PATCH 126/676] DBG: better minus sign handling --- x64_dbg_dbg/value.cpp | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/x64_dbg_dbg/value.cpp b/x64_dbg_dbg/value.cpp index 5badc2f5..aaf5f3c4 100644 --- a/x64_dbg_dbg/value.cpp +++ b/x64_dbg_dbg/value.cpp @@ -1143,11 +1143,15 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, { if(!value or !string) return false; - uint finalMul=1; if(*string=='-') //negative { - finalMul=~0; - string++; + uint val; + if(!valfromstring(string+1, &val, silent, baseonly, value_size, isvar, hexonly)) + return false; + val*=~0; + if(value) + *value=val; + return true; } if(!*string) { @@ -1190,7 +1194,6 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, } bool ret=mathfromstring(string_+add, value, silent, baseonly, value_size, isvar); efree(string_, "valfromstring:string_"); - *value*=finalMul; return ret; } else if(*string=='@' or strstr(string, "[")) //memory location @@ -1254,7 +1257,6 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value_size=read_size; if(isvar) *isvar=true; - *value*=finalMul; return true; } else if(isregister(string)) //register @@ -1273,7 +1275,6 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value=getregister(value_size, string); if(isvar) *isvar=true; - *value*=finalMul; return true; } else if(*string=='!' and isflag(string+1)) //flag @@ -1298,7 +1299,6 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, *value_size=0; if(isvar) *isvar=true; - *value*=finalMul; return true; } else if(isdecnumber(string)) //decimal numbers come 'first' @@ -1308,7 +1308,6 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, if(isvar) *isvar=false; sscanf(string+1, "%"fext"u", value); - *value*=finalMul; return true; } else if(ishexnumber(string)) //then hex numbers @@ -1322,32 +1321,21 @@ bool valfromstring(const char* string, uint* value, bool silent, bool baseonly, if(*string=='x') inc=1; sscanf(string+inc, "%"fext"x", value); - *value*=finalMul; return true; } if(baseonly) return false; else if(valapifromstring(string, value, value_size, true, silent, hexonly)) //then come APIs - { - *value*=finalMul; return true; - } else if(labelfromstring(string, value)) //then come labels - { - *value*=finalMul; return true; - } else if(symfromname(string, value)) //then come symbols - { - *value*=finalMul; return true; - } else if(varget(string, value, value_size, 0)) //finally variables { if(isvar) *isvar=true; - *value*=finalMul; return true; } if(!silent) From d128ead3b534d32389526dc98525116ad969f600 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 18:00:12 +0200 Subject: [PATCH 127/676] GUI: fixed a strange crash in the HexDump --- x64_dbg_gui/Project/Src/BasicView/HexDump.cpp | 4 +++- x64_dbg_gui/Project/Src/BasicView/StdTable.cpp | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp index f34c2c5b..25789c5d 100644 --- a/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/HexDump.cpp @@ -166,7 +166,7 @@ void HexDump::mouseReleaseEvent(QMouseEvent* event) { mGuiState = HexDump::NoState; - this->viewport()->repaint(); + repaint(); wAccept = false; } @@ -221,8 +221,10 @@ void HexDump::printSelected(QPainter* painter, int_t rowBase, int rowOffset, int wSelectionX = x + wI * wItemPixWidth; wSelectionWidth = wItemPixWidth > w - (wSelectionX - x) ? w - (wSelectionX - x) : wItemPixWidth; wSelectionWidth = wSelectionWidth < 0 ? 0 : wSelectionWidth; + painter->save(); painter->setPen(textColor); painter->fillRect(QRect(wSelectionX, y, wSelectionWidth, h), QBrush(selectionColor)); + painter->restore(); } } } diff --git a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp index 03e4504c..fbb42e88 100644 --- a/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp +++ b/x64_dbg_gui/Project/Src/BasicView/StdTable.cpp @@ -49,7 +49,7 @@ void StdTable::mouseMoveEvent(QMouseEvent* event) else setSingleSelection(wRowIndex); - this->viewport()->repaint(); + repaint(); wAccept = false; } @@ -82,7 +82,7 @@ void StdTable::mousePressEvent(QMouseEvent* event) mGuiState = StdTable::MultiRowsSelectionState; - viewport()->repaint(); + repaint(); wAccept = true; } @@ -111,7 +111,7 @@ void StdTable::mouseReleaseEvent(QMouseEvent* event) { mGuiState = StdTable::NoState; - this->viewport()->repaint(); + repaint(); wAccept = false; } From e9bb33239f6769c2ca0e9141c428d2ff67d5b5f2 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 22:01:10 +0200 Subject: [PATCH 128/676] DBG: database performance (100 000 comments+labels+bookmarks+functions = 900ms) + added database compression --- release.bat | 4 + x64_dbg_dbg/addrinfo.cpp | 32 +-- x64_dbg_dbg/debugger.cpp | 5 +- x64_dbg_dbg/lz4/lz4.h | 252 ++++++++++++++++++++++++ x64_dbg_dbg/lz4/lz4_x64.a | Bin 0 -> 32138 bytes x64_dbg_dbg/lz4/lz4_x64.lib | Bin 0 -> 10972 bytes x64_dbg_dbg/lz4/lz4_x86.a | Bin 0 -> 32062 bytes x64_dbg_dbg/lz4/lz4_x86.lib | Bin 0 -> 11164 bytes x64_dbg_dbg/lz4/lz4file.h | 26 +++ x64_dbg_dbg/lz4/lz4hc.h | 175 ++++++++++++++++ x64_dbg_dbg/x64_dbg_dbg.vcxproj | 7 +- x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters | 12 ++ 12 files changed, 498 insertions(+), 15 deletions(-) create mode 100644 x64_dbg_dbg/lz4/lz4.h create mode 100644 x64_dbg_dbg/lz4/lz4_x64.a create mode 100644 x64_dbg_dbg/lz4/lz4_x64.lib create mode 100644 x64_dbg_dbg/lz4/lz4_x86.a create mode 100644 x64_dbg_dbg/lz4/lz4_x86.lib create mode 100644 x64_dbg_dbg/lz4/lz4file.h create mode 100644 x64_dbg_dbg/lz4/lz4hc.h diff --git a/release.bat b/release.bat index 5e45d162..8a13d83a 100644 --- a/release.bat +++ b/release.bat @@ -26,6 +26,7 @@ copy bin\x32\dbghelp.dll %RELEASEDIR%\bin_base\bin\x32\dbghelp.dll copy bin\x32\DeviceNameResolver.dll %RELEASEDIR%\bin_base\bin\x32\DeviceNameResolver.dll copy bin\x32\Scylla.dll %RELEASEDIR%\bin_base\bin\x32\Scylla.dll copy bin\x32\jansson.dll %RELEASEDIR%\bin_base\bin\x32\jansson.dll +copy bin\x32\lz4.dll %RELEASEDIR%\bin_base\bin\x32\lz4.dll copy bin\x32\TitanEngine.dll %RELEASEDIR%\bin_base\bin\x32\TitanEngine.dll copy bin\x32\XEDParse.dll %RELEASEDIR%\bin_base\bin\x32\XEDParse.dll copy bin\x64\BeaEngine.dll %RELEASEDIR%\bin_base\bin\x64\BeaEngine.dll @@ -33,6 +34,7 @@ copy bin\x64\dbghelp.dll %RELEASEDIR%\bin_base\bin\x64\dbghelp.dll copy bin\x64\DeviceNameResolver.dll %RELEASEDIR%\bin_base\bin\x64\DeviceNameResolver.dll copy bin\x64\Scylla.dll %RELEASEDIR%\bin_base\bin\x64\Scylla.dll copy bin\x64\jansson.dll %RELEASEDIR%\bin_base\bin\x64\jansson.dll +copy bin\x64\lz4.dll %RELEASEDIR%\bin_base\bin\x64\lz4.dll copy bin\x64\TitanEngine.dll %RELEASEDIR%\bin_base\bin\x64\TitanEngine.dll copy bin\x64\XEDParse.dll %RELEASEDIR%\bin_base\bin\x64\XEDParse.dll @@ -65,6 +67,7 @@ mkdir %RELEASEDIR%\pluginsdk\BeaEngine mkdir %RELEASEDIR%\pluginsdk\dbghelp mkdir %RELEASEDIR%\pluginsdk\DeviceNameResolver mkdir %RELEASEDIR%\pluginsdk\jansson +mkdir %RELEASEDIR%\pluginsdk\lz4 mkdir %RELEASEDIR%\pluginsdk\TitanEngine mkdir %RELEASEDIR%\pluginsdk\XEDParse @@ -72,6 +75,7 @@ xcopy x64_dbg_dbg\BeaEngine %RELEASEDIR%\pluginsdk\BeaEngine /S /Y xcopy x64_dbg_dbg\dbghelp %RELEASEDIR%\pluginsdk\dbghelp /S /Y xcopy x64_dbg_dbg\DeviceNameResolver %RELEASEDIR%\pluginsdk\DeviceNameResolver /S /Y xcopy x64_dbg_dbg\jansson %RELEASEDIR%\pluginsdk\jansson /S /Y +xcopy x64_dbg_dbg\lz4 %RELEASEDIR%\pluginsdk\lz4 /S /Y xcopy x64_dbg_dbg\TitanEngine %RELEASEDIR%\pluginsdk\TitanEngine /S /Y del %RELEASEDIR%\pluginsdk\TitanEngine\TitanEngine.txt /F /Q xcopy x64_dbg_dbg\XEDParse %RELEASEDIR%\pluginsdk\XEDParse /S /Y diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 5f771cfe..3f8e0095 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -6,8 +6,7 @@ #include "threading.h" #include "symbolinfo.h" #include "murmurhash.h" - -//TODO: use modinfo.hash+rva as key for the maps for "instant" lookup +#include "lz4\lz4file.h" static ModulesInfo modinfo; static CommentsInfo comments; @@ -29,7 +28,10 @@ void dbsave() loopcachesave(root); bpcachesave(root); if(json_object_size(root)) + { json_dump_file(root, dbpath, JSON_INDENT(4)); + LZ4_compress_file(dbpath, dbpath); + } json_decref(root); //free root dprintf("%ums\n", GetTickCount()-ticks); } @@ -38,10 +40,18 @@ void dbload() { dprintf("loading database..."); DWORD ticks=GetTickCount(); + LZ4_STATUS status=LZ4_decompress_file(dbpath, dbpath); + if(status!=LZ4_SUCCESS && status!=LZ4_INVALID_ARCHIVE) + { + dputs("\ninvalid database file!"); + return; + } JSON root=json_load_file(dbpath, 0, 0); + if(status!=LZ4_INVALID_ARCHIVE) + LZ4_compress_file(dbpath, dbpath); if(!root) { - dputs(""); + dputs("\ninvalid database file (JSON)!"); return; } commentcacheload(root); @@ -586,16 +596,15 @@ void bookmarkcacheload(JSON root) ///function database bool functionadd(uint start, uint end, bool manual) { - if(!DbgIsDebugging() or endhProcess, start)) return false; - uint page=memfindbaseaddr(fdProcessInfo->hProcess, start, 0); - if(!page or page!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page + const uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) //the function boundaries are not in the same module return false; if(functionoverlaps(start, end)) return false; FUNCTIONSINFO function; modnamefromaddr(start, function.mod, true); - uint modbase=modbasefromaddr(start); function.start=start-modbase; function.end=end-modbase; function.manual=manual; @@ -710,17 +719,16 @@ void functioncacheload(JSON root) //loop database bool loopadd(uint start, uint end, bool manual) { - if(!DbgIsDebugging() or endhProcess, start)) return false; - uint page=memfindbaseaddr(fdProcessInfo->hProcess, start, 0); - if(!page or page!=memfindbaseaddr(fdProcessInfo->hProcess, end, 0)) //the function boundaries are not in the same mem page + const uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) //the function boundaries are not in the same mem page return false; int finaldepth; if(loopoverlaps(0, start, end, &finaldepth)) //loop cannot overlap another loop return false; LOOPSINFO loop; modnamefromaddr(start, loop.mod, true); - const uint modbase=modbasefromaddr(start); loop.start=start-modbase; loop.end=end-modbase; loop.depth=finaldepth; @@ -735,7 +743,7 @@ bool loopadd(uint start, uint end, bool manual) bool loopget(int depth, uint addr, uint* start, uint* end) { - if(!DbgIsDebugging() or !memisvalidreadptr(fdProcessInfo->hProcess, addr)) + if(!DbgIsDebugging()) return false; const uint modbase=modbasefromaddr(addr); LoopsInfo::iterator found=loops.find(DepthModuleRange(depth, ModuleRange(modhashfromva(modbase), Range(addr-modbase, addr-modbase)))); diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index 4c743518..5cdba18a 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -1826,9 +1826,12 @@ CMDRESULT cbBenchmark(int argc, char* argv[]) uint addr=memfindbaseaddr(fdProcessInfo->hProcess, GetContextData(UE_CIP), 0); DWORD ticks=GetTickCount(); char comment[MAX_COMMENT_SIZE]=""; - for(uint i=addr; i (unsigned int)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/* +LZ4_compressBound() : + Provides the maximum size that LZ4 may output in a "worst case" scenario (input data not compressible) + primarily useful for memory allocation of output buffer. + inline function is recommended for the general case, + macro is also provided when result needs to be evaluated at compilation (such as stack memory allocation). + + isize : is the input size. Max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE) +*/ +__declspec(dllimport) int LZ4_compressBound(int isize); + + +/* +LZ4_compress_limitedOutput() : + Compress 'inputSize' bytes from 'source' into an output buffer 'dest' of maximum size 'maxOutputSize'. + If it cannot achieve it, compression will stop, and result of the function will be zero. + This function never writes outside of provided output buffer. + + inputSize : Max supported value is LZ4_MAX_INPUT_VALUE + maxOutputSize : is the size of the destination buffer (which must be already allocated) + return : the number of bytes written in buffer 'dest' + or 0 if the compression fails +*/ +__declspec(dllimport) int LZ4_compress_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize); + + +/* +LZ4_decompress_fast() : + originalSize : is the original and therefore uncompressed size + return : the number of bytes read from the source buffer (in other words, the compressed size) + If the source stream is malformed, the function will stop decoding and return a negative result. + note : This function is a bit faster than LZ4_decompress_safe() + This function never writes outside of output buffers, but may read beyond input buffer in case of malicious data packet. + Use this function preferably into a trusted environment (data to decode comes from a trusted source). + Destination buffer must be already allocated. Its size must be a minimum of 'outputSize' bytes. +*/ +__declspec(dllimport) int LZ4_decompress_fast (const char* source, char* dest, int originalSize); + + +/* +LZ4_decompress_safe_partial() : + This function decompress a compressed block of size 'inputSize' at position 'source' + into output buffer 'dest' of size 'maxOutputSize'. + The function tries to stop decompressing operation as soon as 'targetOutputSize' has been reached, + reducing decompression time. + return : the number of bytes decoded in the destination buffer (necessarily <= maxOutputSize) + Note : this number can be < 'targetOutputSize' should the compressed block to decode be smaller. + Always control how many bytes were decoded. + If the source stream is detected malformed, the function will stop decoding and return a negative result. + This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets +*/ +__declspec(dllimport) int LZ4_decompress_safe_partial (const char* source, char* dest, int inputSize, int targetOutputSize, int maxOutputSize); + + +/* +These functions are provided should you prefer to allocate memory for compression tables with your own allocation methods. +To know how much memory must be allocated for the compression tables, use : +int LZ4_sizeofState(); + +Note that tables must be aligned on 4-bytes boundaries, otherwise compression will fail (return code 0). + +The allocated memory can be provided to the compressions functions using 'void* state' parameter. +LZ4_compress_withState() and LZ4_compress_limitedOutput_withState() are equivalent to previously described functions. +They just use the externally allocated memory area instead of allocating their own (on stack, or on heap). +*/ +__declspec(dllimport) int LZ4_sizeofState(void); +__declspec(dllimport) int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +__declspec(dllimport) int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); + + +/************************************** + Streaming Functions +**************************************/ +__declspec(dllimport) void* LZ4_create (const char* inputBuffer); +__declspec(dllimport) int LZ4_compress_continue (void* LZ4_Data, const char* source, char* dest, int inputSize); +__declspec(dllimport) int LZ4_compress_limitedOutput_continue (void* LZ4_Data, const char* source, char* dest, int inputSize, int maxOutputSize); +__declspec(dllimport) char* LZ4_slideInputBuffer (void* LZ4_Data); +__declspec(dllimport) int LZ4_free (void* LZ4_Data); + +/* +These functions allow the compression of dependent blocks, where each block benefits from prior 64 KB within preceding blocks. +In order to achieve this, it is necessary to start creating the LZ4 Data Structure, thanks to the function : + +void* LZ4_create (const char* inputBuffer); +The result of the function is the (void*) pointer on the LZ4 Data Structure. +This pointer will be needed in all other functions. +If the pointer returned is NULL, then the allocation has failed, and compression must be aborted. +The only parameter 'const char* inputBuffer' must, obviously, point at the beginning of input buffer. +The input buffer must be already allocated, and size at least 192KB. +'inputBuffer' will also be the 'const char* source' of the first block. + +All blocks are expected to lay next to each other within the input buffer, starting from 'inputBuffer'. +To compress each block, use either LZ4_compress_continue() or LZ4_compress_limitedOutput_continue(). +Their behavior are identical to LZ4_compress() or LZ4_compress_limitedOutput(), +but require the LZ4 Data Structure as their first argument, and check that each block starts right after the previous one. +If next block does not begin immediately after the previous one, the compression will fail (return 0). + +When it's no longer possible to lay the next block after the previous one (not enough space left into input buffer), a call to : +char* LZ4_slideInputBuffer(void* LZ4_Data); +must be performed. It will typically copy the latest 64KB of input at the beginning of input buffer. +Note that, for this function to work properly, minimum size of an input buffer must be 192KB. +==> The memory position where the next input data block must start is provided as the result of the function. + +Compression can then resume, using LZ4_compress_continue() or LZ4_compress_limitedOutput_continue(), as usual. + +When compression is completed, a call to LZ4_free() will release the memory used by the LZ4 Data Structure. +*/ + + +__declspec(dllimport) int LZ4_sizeofStreamState(void); +__declspec(dllimport) int LZ4_resetStreamState(void* state, const char* inputBuffer); + +/* +These functions achieve the same result as : +void* LZ4_create (const char* inputBuffer); + +They are provided here to allow the user program to allocate memory using its own routines. + +To know how much space must be allocated, use LZ4_sizeofStreamState(); +Note also that space must be 4-bytes aligned. + +Once space is allocated, you must initialize it using : LZ4_resetStreamState(void* state, const char* inputBuffer); +void* state is a pointer to the space allocated. +It must be aligned on 4-bytes boundaries, and be large enough. +The parameter 'const char* inputBuffer' must, obviously, point at the beginning of input buffer. +The input buffer must be already allocated, and size at least 192KB. +'inputBuffer' will also be the 'const char* source' of the first block. + +The same space can be re-used multiple times, just by initializing it each time with LZ4_resetStreamState(). +return value of LZ4_resetStreamState() must be 0 is OK. +Any other value means there was an error (typically, pointer is not aligned on 4-bytes boundaries). +*/ + + +__declspec(dllimport) int LZ4_decompress_safe_withPrefix64k (const char* source, char* dest, int inputSize, int maxOutputSize); +__declspec(dllimport) int LZ4_decompress_fast_withPrefix64k (const char* source, char* dest, int outputSize); + +/* +*_withPrefix64k() : + These decoding functions work the same as their "normal name" versions, + but can use up to 64KB of data in front of 'char* dest'. + These functions are necessary to decode inter-dependant blocks. +*/ + + +/************************************** + Obsolete Functions +**************************************/ +/* +These functions are deprecated and should no longer be used. +They are provided here for compatibility with existing user programs. +*/ +__declspec(dllimport) int LZ4_uncompress (const char* source, char* dest, int outputSize); +__declspec(dllimport) int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + + +#if defined (__cplusplus) +} +#endif + +#endif //_LZ4_H \ No newline at end of file diff --git a/x64_dbg_dbg/lz4/lz4_x64.a b/x64_dbg_dbg/lz4/lz4_x64.a new file mode 100644 index 0000000000000000000000000000000000000000..896dfcc79ca73e5557b5d1866e1bb666c44adc40 GIT binary patch literal 32138 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 DR%hDd literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/lz4/lz4_x86.a b/x64_dbg_dbg/lz4/lz4_x86.a new file mode 100644 index 0000000000000000000000000000000000000000..3818ca6abf6a075ae04d203fb16c8a33d0415e20 GIT binary patch literal 32062 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 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/lz4/lz4_x86.lib b/x64_dbg_dbg/lz4/lz4_x86.lib new file mode 100644 index 0000000000000000000000000000000000000000..012885afd47be3e2df2901883ac350f450cd1190 GIT binary patch literal 11164 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 literal 0 HcmV?d00001 diff --git a/x64_dbg_dbg/lz4/lz4file.h b/x64_dbg_dbg/lz4/lz4file.h new file mode 100644 index 00000000..be8f0822 --- /dev/null +++ b/x64_dbg_dbg/lz4/lz4file.h @@ -0,0 +1,26 @@ +#ifndef _LZ4FILE_H +#define _LZ4FILE_H + +typedef enum _LZ4_STATUS +{ + LZ4_SUCCESS, + LZ4_FAILED_OPEN_INPUT, + LZ4_FAILED_OPEN_OUTPUT, + LZ4_NOT_ENOUGH_MEMORY, + LZ4_INVALID_ARCHIVE, + LZ4_CORRUPTED_ARCHIVE +} LZ4_STATUS; + +#if defined (__cplusplus) +extern "C" +{ +#endif + +__declspec(dllimport) LZ4_STATUS LZ4_compress_file(const char* input_filename, const char* output_filename); +__declspec(dllimport) LZ4_STATUS LZ4_decompress_file(const char* input_filename, const char* output_filename); + +#if defined (__cplusplus) +} +#endif + +#endif //_LZ4FILE_H \ No newline at end of file diff --git a/x64_dbg_dbg/lz4/lz4hc.h b/x64_dbg_dbg/lz4/lz4hc.h new file mode 100644 index 00000000..1e063bbb --- /dev/null +++ b/x64_dbg_dbg/lz4/lz4hc.h @@ -0,0 +1,175 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Header File + Copyright (C) 2011-2014, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html + - LZ4 source repository : http://code.google.com/p/lz4/ +*/ +#ifndef _LZ4HC_H +#define _LZ4HC_H + +#if defined (__cplusplus) +extern "C" +{ +#endif + + +__declspec(dllimport) int LZ4_compressHC (const char* source, char* dest, int inputSize); +/* +LZ4_compressHC : + return : the number of bytes in compressed buffer dest + or 0 if compression fails. + note : destination buffer must be already allocated. + To avoid any problem, size it to handle worst cases situations (input data not compressible) + Worst case size evaluation is provided by function LZ4_compressBound() (see "lz4.h") +*/ + +__declspec(dllimport) int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize); +/* +LZ4_compress_limitedOutput() : + Compress 'inputSize' bytes from 'source' into an output buffer 'dest' of maximum size 'maxOutputSize'. + If it cannot achieve it, compression will stop, and result of the function will be zero. + This function never writes outside of provided output buffer. + + inputSize : Max supported value is 1 GB + maxOutputSize : is maximum allowed size into the destination buffer (which must be already allocated) + return : the number of output bytes written in buffer 'dest' + or 0 if compression fails. +*/ + + +__declspec(dllimport) int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel); +__declspec(dllimport) int LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +/* + Same functions as above, but with programmable 'compressionLevel'. + Recommended values are between 4 and 9, although any value between 0 and 16 will work. + 'compressionLevel'==0 means use default 'compressionLevel' value. + Values above 16 behave the same as 16. + Equivalent variants exist for all other compression functions below. +*/ + +/* Note : +Decompression functions are provided within LZ4 source code (see "lz4.h") (BSD license) +*/ + + +/************************************** + Using an external allocation +**************************************/ +__declspec(dllimport) int LZ4_sizeofStateHC(void); +__declspec(dllimport) int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize); +__declspec(dllimport) int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); + +__declspec(dllimport) int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel); +__declspec(dllimport) int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); + +/* +These functions are provided should you prefer to allocate memory for compression tables with your own allocation methods. +To know how much memory must be allocated for the compression tables, use : +int LZ4_sizeofStateHC(); + +Note that tables must be aligned for pointer (32 or 64 bits), otherwise compression will fail (return code 0). + +The allocated memory can be provided to the compressions functions using 'void* state' parameter. +LZ4_compress_withStateHC() and LZ4_compress_limitedOutput_withStateHC() are equivalent to previously described functions. +They just use the externally allocated memory area instead of allocating their own (on stack, or on heap). +*/ + + +/************************************** + Streaming Functions +**************************************/ +__declspec(dllimport) void* LZ4_createHC (const char* inputBuffer); +__declspec(dllimport) int LZ4_compressHC_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize); +__declspec(dllimport) int LZ4_compressHC_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize); +__declspec(dllimport) char* LZ4_slideInputBufferHC (void* LZ4HC_Data); +__declspec(dllimport) int LZ4_freeHC (void* LZ4HC_Data); + +__declspec(dllimport) int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel); +__declspec(dllimport) int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); + +/* +These functions allow the compression of dependent blocks, where each block benefits from prior 64 KB within preceding blocks. +In order to achieve this, it is necessary to start creating the LZ4HC Data Structure, thanks to the function : + +void* LZ4_createHC (const char* inputBuffer); +The result of the function is the (void*) pointer on the LZ4HC Data Structure. +This pointer will be needed in all other functions. +If the pointer returned is NULL, then the allocation has failed, and compression must be aborted. +The only parameter 'const char* inputBuffer' must, obviously, point at the beginning of input buffer. +The input buffer must be already allocated, and size at least 192KB. +'inputBuffer' will also be the 'const char* source' of the first block. + +All blocks are expected to lay next to each other within the input buffer, starting from 'inputBuffer'. +To compress each block, use either LZ4_compressHC_continue() or LZ4_compressHC_limitedOutput_continue(). +Their behavior are identical to LZ4_compressHC() or LZ4_compressHC_limitedOutput(), +but require the LZ4HC Data Structure as their first argument, and check that each block starts right after the previous one. +If next block does not begin immediately after the previous one, the compression will fail (return 0). + +When it's no longer possible to lay the next block after the previous one (not enough space left into input buffer), a call to : +char* LZ4_slideInputBufferHC(void* LZ4HC_Data); +must be performed. It will typically copy the latest 64KB of input at the beginning of input buffer. +Note that, for this function to work properly, minimum size of an input buffer must be 192KB. +==> The memory position where the next input data block must start is provided as the result of the function. + +Compression can then resume, using LZ4_compressHC_continue() or LZ4_compressHC_limitedOutput_continue(), as usual. + +When compression is completed, a call to LZ4_freeHC() will release the memory used by the LZ4HC Data Structure. +*/ + +__declspec(dllimport) int LZ4_sizeofStreamStateHC(void); +__declspec(dllimport) int LZ4_resetStreamStateHC(void* state, const char* inputBuffer); + +/* +These functions achieve the same result as : +void* LZ4_createHC (const char* inputBuffer); + +They are provided here to allow the user program to allocate memory using its own routines. + +To know how much space must be allocated, use LZ4_sizeofStreamStateHC(); +Note also that space must be aligned for pointers (32 or 64 bits). + +Once space is allocated, you must initialize it using : LZ4_resetStreamStateHC(void* state, const char* inputBuffer); +void* state is a pointer to the space allocated. +It must be aligned for pointers (32 or 64 bits), and be large enough. +The parameter 'const char* inputBuffer' must, obviously, point at the beginning of input buffer. +The input buffer must be already allocated, and size at least 192KB. +'inputBuffer' will also be the 'const char* source' of the first block. + +The same space can be re-used multiple times, just by initializing it each time with LZ4_resetStreamState(). +return value of LZ4_resetStreamStateHC() must be 0 is OK. +Any other value means there was an error (typically, state is not aligned for pointers (32 or 64 bits)). +*/ + + +#if defined (__cplusplus) +} +#endif + +#endif //_LZ4HC_H diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj b/x64_dbg_dbg/x64_dbg_dbg.vcxproj index 2a5fbc51..d8fdf652 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj @@ -60,6 +60,9 @@ + + + @@ -129,7 +132,7 @@ Windows true true - jansson\jansson_x86.lib;DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + lz4\lz4_x86.lib;jansson\jansson_x86.lib;DeviceNameResolver\DeviceNameResolver_x86.lib;XEDParse\XEDParse_x86.lib;$(SolutionDir)bin\x32\x32_bridge.lib;dbghelp\dbghelp_x86.lib;TitanEngine\TitanEngine_x86.lib;BeaEngine\BeaEngine.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) @@ -144,7 +147,7 @@ Windows true true - jansson\jansson_x64.lib;DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) + lz4\lz4_x64.lib;jansson\jansson_x64.lib;DeviceNameResolver\DeviceNameResolver_x64.lib;XEDParse\XEDParse_x64.lib;$(SolutionDir)bin\x64\x64_bridge.lib;dbghelp\dbghelp_x64.lib;TitanEngine\TitanEngine_x64.lib;BeaEngine\BeaEngine_64.lib;psapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;shlwapi.lib;%(AdditionalDependencies) diff --git a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters index 8d7b6916..95bf599b 100644 --- a/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters +++ b/x64_dbg_dbg/x64_dbg_dbg.vcxproj.filters @@ -31,6 +31,9 @@ {b63305e2-2b10-46eb-839f-5e9080fa8ad8} + + {6a8d58f0-1417-4bff-aecd-0f9f5e0641f9} + @@ -239,5 +242,14 @@ Header Files + + Header Files\lz4 + + + Header Files\lz4 + + + Header Files\lz4 + \ No newline at end of file From 71ac3936686c36a460e7d0560a520e91b8cc5437 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 22:02:22 +0200 Subject: [PATCH 129/676] GUI: do not close the mainwindow before the debugger has finished --- x64_dbg_bridge/bridgemain.cpp | 6 +++++- x64_dbg_bridge/bridgemain.h | 1 + x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 24 ++++++++++++++++++++++ x64_dbg_gui/Project/Src/Gui/MainWindow.h | 3 +++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index f5b0900f..76b53425 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -132,7 +132,6 @@ BRIDGE_IMPEXP const char* BridgeStart() if(!_dbg_dbginit || !_gui_guiinit) return "\"_dbg_dbginit\" || \"_gui_guiinit\" was not loaded yet, call BridgeInit!"; _gui_guiinit(0, 0); //remove arguments - _dbg_dbgexitsignal(); //send exit signal to debugger return 0; } @@ -360,6 +359,11 @@ BRIDGE_IMPEXP const char* DbgInit() return _dbg_dbginit(); } +BRIDGE_IMPEXP void DbgExit() +{ + _dbg_dbgexitsignal(); //send exit signal to debugger +} + BRIDGE_IMPEXP BPXTYPE DbgGetBpxTypeAt(duint addr) { return _dbg_bpgettypeat(addr); diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 7566b02d..1ac42efc 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -473,6 +473,7 @@ struct FUNCTION_LOOP_INFO //Debugger functions BRIDGE_IMPEXP const char* DbgInit(); +BRIDGE_IMPEXP void DbgExit(); BRIDGE_IMPEXP bool DbgMemRead(duint va, unsigned char* dest, duint size); BRIDGE_IMPEXP bool DbgMemWrite(duint va, const unsigned char* src, duint size); BRIDGE_IMPEXP duint DbgMemGetPageSize(duint base); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index b9b535f9..1114966d 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -153,6 +153,30 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi //setup menu api initMenuApi(); + + bClose=false; +} + +DWORD WINAPI MainWindow::closeThread(void* ptr) +{ + static bool closing=false; + if(closing) + return 0; + closing=true; + DbgExit(); + MainWindow* mainWindow=(MainWindow*)ptr; + mainWindow->bClose=true; + mainWindow->close(); + return 0; +} + +void MainWindow::closeEvent(QCloseEvent* event) +{ + CloseHandle(CreateThread(0, 0, closeThread, this, 0, 0)); + if(bClose) + event->accept(); + else + event->ignore(); } MainWindow::~MainWindow() diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.h b/x64_dbg_gui/Project/Src/Gui/MainWindow.h index 0ecb881d..26cda849 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.h +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.h @@ -34,7 +34,10 @@ class MainWindow : public QMainWindow public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); + static DWORD WINAPI closeThread(void* ptr); + void closeEvent(QCloseEvent* event); void setTab(QWidget* widget); + bool bClose; public slots: void executeCommand(); From 5f6a151d32814da3caa6a72bcb0ffd68dcefe303 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 22:55:11 +0200 Subject: [PATCH 130/676] DBG: added various API functions --- x64_dbg_bridge/bridgemain.cpp | 48 ++++++++++++++++++ x64_dbg_bridge/bridgemain.h | 18 ++++++- x64_dbg_dbg/_exports.cpp | 48 ++++++++++++++++++ x64_dbg_dbg/addrinfo.cpp | 92 +++++++++++++++++++++++++++++++++++ x64_dbg_dbg/addrinfo.h | 4 ++ 5 files changed, 209 insertions(+), 1 deletion(-) diff --git a/x64_dbg_bridge/bridgemain.cpp b/x64_dbg_bridge/bridgemain.cpp index 76b53425..7189706f 100644 --- a/x64_dbg_bridge/bridgemain.cpp +++ b/x64_dbg_bridge/bridgemain.cpp @@ -654,6 +654,54 @@ BRIDGE_IMPEXP bool DbgIsBpDisabled(duint addr) return false; } +BRIDGE_IMPEXP bool DbgSetAutoCommentAt(duint addr, const char* text) +{ + if(_dbg_sendmessage(DBG_SET_AUTO_COMMENT_AT, (void*)addr, (void*)text)) + return true; + return false; +} + +BRIDGE_IMPEXP void DbgClearAutoCommentRange(duint start, duint end) +{ + _dbg_sendmessage(DBG_DELETE_AUTO_COMMENT_RANGE, (void*)start, (void*)end); +} + +BRIDGE_IMPEXP bool DbgSetAutoLabelAt(duint addr, const char* text) +{ + if(_dbg_sendmessage(DBG_SET_AUTO_LABEL_AT, (void*)addr, (void*)text)) + return true; + return false; +} + +BRIDGE_IMPEXP void DbgClearAutoLabelRange(duint start, duint end) +{ + _dbg_sendmessage(DBG_DELETE_AUTO_LABEL_RANGE, (void*)start, (void*)end); +} + +BRIDGE_IMPEXP bool DbgSetAutoBookmarkAt(duint addr) +{ + if(_dbg_sendmessage(DBG_SET_AUTO_BOOKMARK_AT, (void*)addr, 0)) + return true; + return false; +} + +BRIDGE_IMPEXP void DbgClearAutoBookmarkRange(duint start, duint end) +{ + _dbg_sendmessage(DBG_DELETE_AUTO_BOOKMARK_RANGE, (void*)start, (void*)end); +} + +BRIDGE_IMPEXP bool DbgSetAutoFunctionAt(duint start, duint end) +{ + if(_dbg_sendmessage(DBG_SET_AUTO_FUNCTION_AT, (void*)start, (void*)end)) + return true; + return false; +} + +BRIDGE_IMPEXP void DbgClearAutoFunctionRange(duint start, duint end) +{ + _dbg_sendmessage(DBG_DELETE_AUTO_FUNCTION_RANGE, (void*)start, (void*)end); +} + //GUI BRIDGE_IMPEXP void GuiDisasmAt(duint addr, duint cip) { diff --git a/x64_dbg_bridge/bridgemain.h b/x64_dbg_bridge/bridgemain.h index 1ac42efc..281521f5 100644 --- a/x64_dbg_bridge/bridgemain.h +++ b/x64_dbg_bridge/bridgemain.h @@ -145,7 +145,15 @@ enum DBGMSG DBG_LOOP_ADD, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_LOOP_DEL, // param1=FUNCTION_LOOP_INFO* info, param2=unused DBG_IS_RUN_LOCKED, // param1=unused, param2=unused - DBG_IS_BP_DISABLED // param1=duint addr, param2=unused + DBG_IS_BP_DISABLED, // param1=duint addr, param2=unused + DBG_SET_AUTO_COMMENT_AT, // param1=duint addr, param2=const char* text + DBG_DELETE_AUTO_COMMENT_RANGE, // param1=duint start, param2=duint end + DBG_SET_AUTO_LABEL_AT, // param1=duint addr, param2=const char* text + DBG_DELETE_AUTO_LABEL_RANGE, // param1=duint start, param2=duint end + DBG_SET_AUTO_BOOKMARK_AT, // param1=duint addr, param2=const char* text + DBG_DELETE_AUTO_BOOKMARK_RANGE, // param1=duint start, param2=duint end + DBG_SET_AUTO_FUNCTION_AT, // param1=duint addr, param2=const char* text + DBG_DELETE_AUTO_FUNCTION_RANGE, // param1=duint start, param2=duint end }; enum SCRIPTLINETYPE @@ -530,6 +538,14 @@ BRIDGE_IMPEXP bool DbgLoopAdd(duint start, duint end); BRIDGE_IMPEXP bool DbgLoopDel(int depth, duint addr); BRIDGE_IMPEXP bool DbgIsRunLocked(); BRIDGE_IMPEXP bool DbgIsBpDisabled(duint addr); +BRIDGE_IMPEXP bool DbgSetAutoCommentAt(duint addr, const char* text); +BRIDGE_IMPEXP void DbgClearAutoCommentRange(duint start, duint end); +BRIDGE_IMPEXP bool DbgSetAutoLabelAt(duint addr, const char* text); +BRIDGE_IMPEXP void DbgClearAutoLabelRange(duint start, duint end); +BRIDGE_IMPEXP bool DbgSetAutoBookmarkAt(duint addr); +BRIDGE_IMPEXP void DbgClearAutoBookmarkRange(duint start, duint end); +BRIDGE_IMPEXP bool DbgSetAutoFunctionAt(duint start, duint end); +BRIDGE_IMPEXP void DbgClearAutoFunctionRange(duint start, duint end); //Gui defines #define GUI_PLUGIN_MENU 0 diff --git a/x64_dbg_dbg/_exports.cpp b/x64_dbg_dbg/_exports.cpp index 87de0309..71eb5a4a 100644 --- a/x64_dbg_dbg/_exports.cpp +++ b/x64_dbg_dbg/_exports.cpp @@ -934,6 +934,54 @@ extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* par return (uint)false; } break; + + case DBG_SET_AUTO_COMMENT_AT: + { + return (uint)commentset((uint)param1, (const char*)param2, false); + } + break; + + case DBG_DELETE_AUTO_COMMENT_RANGE: + { + commentdelrange((uint)param1, (uint)param2); + } + break; + + case DBG_SET_AUTO_LABEL_AT: + { + return (uint)labelset((uint)param1, (const char*)param2, false); + } + break; + + case DBG_DELETE_AUTO_LABEL_RANGE: + { + labeldelrange((uint)param1, (uint)param2); + } + break; + + case DBG_SET_AUTO_BOOKMARK_AT: + { + return (uint)bookmarkset((uint)param1, false); + } + break; + + case DBG_DELETE_AUTO_BOOKMARK_RANGE: + { + bookmarkdelrange((uint)param1, (uint)param2); + } + break; + + case DBG_SET_AUTO_FUNCTION_AT: + { + return (uint)functionadd((uint)param1, (uint)param2, false); + } + break; + + case DBG_DELETE_AUTO_FUNCTION_RANGE: + { + functiondelrange((uint)param1, (uint)param2); + } + break; } return 0; diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 3f8e0095..f99ae6f8 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -290,6 +290,29 @@ bool commentdel(uint addr) return (comments.erase(modhashfromva(addr))==1); } +void commentdelrange(uint start, uint end) +{ + bool bDelAll=(start==0 && end==~0); //0x00000000-0xFFFFFFFF + uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) + return; + start-=modbase; + end-=modbase; + CommentsInfo::iterator i=comments.begin(); + while(i!=comments.end()) + { + if(i->second.manual) //ignore manual + { + i++; + continue; + } + if(bDelAll || (i->second.addr>=start && i->second.addr0); } +void labeldelrange(uint start, uint end) +{ + bool bDelAll=(start==0 && end==~0); //0x00000000-0xFFFFFFFF + uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) + return; + start-=modbase; + end-=modbase; + LabelsInfo::iterator i=labels.begin(); + while(i!=labels.end()) + { + if(i->second.manual) //ignore manual + { + i++; + continue; + } + if(bDelAll || (i->second.addr>=start && i->second.addr0); } +void bookmarkdelrange(uint start, uint end) +{ + bool bDelAll=(start==0 && end==~0); //0x00000000-0xFFFFFFFF + uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) + return; + start-=modbase; + end-=modbase; + BookmarksInfo::iterator i=bookmarks.begin(); + while(i!=bookmarks.end()) + { + if(i->second.manual) //ignore manual + { + i++; + continue; + } + if(bDelAll || (i->second.addr>=start && i->second.addr0); } +void functiondelrange(uint start, uint end) +{ + bool bDelAll=(start==0 && end==~0); //0x00000000-0xFFFFFFFF + uint modbase=modbasefromaddr(start); + if(modbase!=modbasefromaddr(end)) + return; + start-=modbase; + end-=modbase; + FunctionsInfo::iterator i=functions.begin(); + while(i!=functions.end()) + { + if(i->second.manual) //ignore manual + { + i++; + continue; + } + if(bDelAll or !(i->second.start<=end and i->second.end>=start)) + functions.erase(i++); + else + i++; + } +} + void functioncachesave(JSON root) { const JSON jsonfunctions=json_array(); diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index a38b87ac..01d27c73 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -130,6 +130,7 @@ bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); bool commentset(uint addr, const char* text, bool manual); bool commentget(uint addr, char* text); bool commentdel(uint addr); +void commentdelrange(uint start, uint end); void commentcachesave(JSON root); void commentcacheload(JSON root); @@ -137,12 +138,14 @@ bool labelset(uint addr, const char* text, bool manual); bool labelfromstring(const char* text, uint* addr); bool labelget(uint addr, char* text); bool labeldel(uint addr); +void labeldelrange(uint start, uint end); void labelcachesave(JSON root); void labelcacheload(JSON root); bool bookmarkset(uint addr, bool manual); bool bookmarkget(uint addr); bool bookmarkdel(uint addr); +void bookmarkdelrange(uint start, uint end); void bookmarkcachesave(JSON root); void bookmarkcacheload(JSON root); @@ -150,6 +153,7 @@ bool functionadd(uint start, uint end, bool manual); bool functionget(uint addr, uint* start, uint* end); bool functionoverlaps(uint start, uint end); bool functiondel(uint addr); +void functiondelrange(uint start, uint end); void functioncachesave(JSON root); void functioncacheload(JSON root); From cca7aa2cb768658bf5e991cf1939c491e1a03a42 Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 22:56:14 +0200 Subject: [PATCH 131/676] GUI: little error-report possibility in BeaTokenizer --- x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp index 1ace2e61..deb05b23 100644 --- a/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp +++ b/x64_dbg_gui/Project/Src/Disassembler/BeaTokenizer.cpp @@ -186,7 +186,7 @@ void BeaTokenizer::Argument(BeaInstructionToken* instr, const DISASM* disasm, co if(memSizeNames.contains(arg->ArgSize)) AddToken(instr, TokenMemorySize, memSizeNames.find(arg->ArgSize).value() + " ptr", 0); else - AddToken(instr, TokenMemorySize, "??? ptr", 0); + AddToken(instr, TokenMemorySize, QString().sprintf("???(%d) ptr", arg->ArgSize, 0); AddToken(instr, TokenSpace, " ", 0); AddToken(instr, TokenMemorySegment, segmentNames.at(arg->SegmentReg), 0); AddToken(instr, TokenUncategorized, ":", 0); From 3938b71c7ba06f03641a39960d806c52e938833d Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 20 Jun 2014 22:57:17 +0200 Subject: [PATCH 132/676] DBG: removed whitelisted binary files --- .gitignore | 9 --------- bin/x32/BeaEngine.dll | Bin 255283 -> 0 bytes bin/x32/Scylla.dll | Bin 472576 -> 0 bytes bin/x32/TitanEngine.dll | Bin 508928 -> 0 bytes bin/x32/dbghelp.dll | Bin 1255528 -> 0 bytes bin/x32/sqlite.dll | Bin 493568 -> 0 bytes bin/x32/test.dll | Bin 6656 -> 0 bytes bin/x32/test.exe | Bin 6144 -> 0 bytes bin/x64/BeaEngine.dll | Bin 523006 -> 0 bytes bin/x64/Scylla.dll | Bin 517632 -> 0 bytes bin/x64/TitanEngine.dll | Bin 600576 -> 0 bytes bin/x64/dbghelp.dll | Bin 1506920 -> 0 bytes bin/x64/sqlite.dll | Bin 763392 -> 0 bytes bin/x64/test.dll | Bin 36864 -> 0 bytes bin/x64/test.exe | Bin 36864 -> 0 bytes 15 files changed, 9 deletions(-) delete mode 100644 bin/x32/BeaEngine.dll delete mode 100644 bin/x32/Scylla.dll delete mode 100644 bin/x32/TitanEngine.dll delete mode 100644 bin/x32/dbghelp.dll delete mode 100644 bin/x32/sqlite.dll delete mode 100644 bin/x32/test.dll delete mode 100644 bin/x32/test.exe delete mode 100644 bin/x64/BeaEngine.dll delete mode 100644 bin/x64/Scylla.dll delete mode 100644 bin/x64/TitanEngine.dll delete mode 100644 bin/x64/dbghelp.dll delete mode 100644 bin/x64/sqlite.dll delete mode 100644 bin/x64/test.dll delete mode 100644 bin/x64/test.exe diff --git a/.gitignore b/.gitignore index 4956d586..bbea4a76 100644 --- a/.gitignore +++ b/.gitignore @@ -17,15 +17,6 @@ x64_dbg_*/x64/* *.sdf *.suo -#whitelisted bin files -!bin/*/TitanEngine.dll -!bin/*/test.dll -!bin/*/test.exe -!bin/*/dbghelp.dll -!bin/*/sqlite.dll -!bin/*/BeaEngine.dll -!bin/*/Scylla.dll - #files to ignore todo_bridge.txt help/x64_dbg.chm diff --git a/bin/x32/BeaEngine.dll b/bin/x32/BeaEngine.dll deleted file mode 100644 index c6a45f6f3178c33245d97cad62b6362a3e407a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255283 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 diff --git a/bin/x32/Scylla.dll b/bin/x32/Scylla.dll deleted file mode 100644 index c2da5e4411f9067449ca4d69fb97c36e63999b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472576 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

    )CcCXqdxd- zQPSVY4@tH>^*vC31MKFeO`BmqZ^b>;D`U@$&&=Pd-dwIZf_s{aasbOb(7p8*#0aL zZ*AYc1KCE*Pfa@Is#UApq<{bP(@$jQFh2?AvY&ncx4CN78tMa$!}Dkf(My<|4jhMo zIh{d1WZ+Bhz4u^d-{yNN*+Go7NcvZ3o!X%nm(rgly?!rq920;J`uV zf1rI0NG2udm1eVM&D>vp`K1{a7Di?Md(X=c7%;%k|7i^VHzweJ9meMWKL0@s&_1nD zq%frC?bDh!Z{884v;T<%THgV`4bzDrhka{?K7R$)%x{}#4sAA9%pGKYkY+QJn&dS* z*9v-ON@-rqT=+?vdGh#SGbJU(T)cQO&2e+|=+P$jBGEbz)A4~0AFng1&*$N<_vvN# z@Be0AId{O^wQ`dA^|)qcdQ5Ti-DW|5n$o+LF}E$7Y%X86)LgoB8QBr64U!R&kRg{oB9ZGEW~^V=kW5+MF0y$Q;`t=!MhF{#Ntoo@LDbARCzY zjj#Q{zLHJ>JJEy>7cee0fB4}C);_JR&^{|#mmxg-dV}q)GWV?dz+Cll2XpR#D(19q zxv_tQ_K*Z5>?!$fd>!-ri9Lb)UCjCO=RdRkKv*bGYbMlxYM=D|Kp1Gv=`lV0j{ROP z>~C3P?p`{|TsFD6`9c;u%^ zIHAnn9|FDy_n;GQFw@e~OuOAqdK?>5!Yj$#XSGLVq$~LD`PwI)lWc~61qSjZk}PPxT%9Cbo$9XkBCVR%vw)TmK|@$4u0WFQQ__DO&L zJ21dEm7(v12a-XAW0Dt{!9eYk9pSMt{yGe_rWuHPU!L|dQ~R00K<$(Noot=I0|V(a zzBcJfbBwOEmzdfn-#Y18@ULW$S)TTfGT-#yfr0jCQ+wF|Y?A#%b}qp{Yr^Cg^zmWr z4`Y0H?b@|WZc_W$%T2z6zYGJ`Wf@PUHn6Xg?MW~UgYjU}IcdK&!A81Q$BrG@eeC7W z&_3Cpe-#GeC&br?=aWpweo{8);Gk5)u-y$LD*j$IOCnu}S~IdX2yR%9SfK z9AwmKJ^CcIPwV?0-^5>sf%F=pG5Dwg_fGm@Ae(^rp4VUKx3hfh!$GuFsJ|_O zBQVk2BpyTkB$_09jMhrN_~HvT{dE`m zf8zbimaX{PFwnk1AD{8HP4*tmy(ioC{igOw{t*m>2f`60tnGOB3y@qq!V>Wr&sr(@ zosP3abB*+elh9vi9)0!ISAv6C#xX{p04s^g_PIBP? z9P|KmYU3cTZ;PDVpbjND>_^}x#%ANNkB;lmp#z6~X56%QUg4n2 za37_L9QO8dv-(xzz(+Z(@o?a09QL4bSWDrs_mu;UBMsudeJ_H8zRispGX^Q0!{6I* zlO|2#K>Hl{BDZ38Zw~8)9M;r1%mog7oZI;AFb-qL!G`9*qq#+k7IBbY+=>+|IPeG# z_8kXa$sO9cnA^7PM-FSE+|j+OIQT4)e&Vps&OwfH*!RFe=SJGkfwnmKEjiE>2U_Be z9Xrl}W;oCc2i>28{lkGbbFhPv&T*G7oa7*@kuGpoFP`AA4##1i1BZP%9Bdn;D;#VL z4*D~9?bE{~UM^2j0U$4seei{f_jAgD${9 zH^^k9|F8J}Fpv=gZL!cA@NsmGt0R^vUaVM&)ar#^2~Cw^->RuqeYMnUsk!Ln=^Ro_ z_k^UB7o+UU>L8)UqUx7VmwaWRVw_AD( zQi^gVtEf_kX5IpsD_XHzywtXdr=Uk(t|Tgz+Pvv0Xb_z3rKXOqQmfjY0&DJ)ISb@3 zDYdNSDX1YhEp=^`q!w>@3Y3yYP}!suDKgAc&?svNS5kUiYF)2>!^RO!n>FW4mek9a zqa(Wi)+Y#OP*4TLYxn2)aZnyso5{^%*S6rl%@J#l;@>79{vyR7rRbxvh!z>jwZ}6# z=((VlDDgxDq$rw!pDbKZL^iG$cZ++8TZIEXaiTn;VNl#!ilW^Gb%o;0soE^ABSrc3 zM9vQ7+Onr8iaN!1q-d<3c%~G=k>Y++{8NI<6O)^2@x=3_$m0~R(G!KZr?(x7#O5RLw3%au;tqOZ zYExWsiq>5%phizN7@Z%4TFULEt0S?F*6ca961hhnP zfO{iFGyM1>j1%@KGG-L8O}W4i`W7T$e5!J{5e+mn3)ML^@BthK78FsJn~Zp=FLA5A z<40{qpuT8CNzL%Vv-?0vmGJBu@3U{9_lX#PiVvUh6BIGjTkl%$v*8$7ib{^q6iJ>SN)G1_Uuy1zQ)1_Wjh^5_uW^IeOv zyBvojj-UE8z@tH^FBN_C#1{6^UVV%%^@-yuuxEIj|41>E>Dr0?jem1Q{te;?YZU9A zI71&mL=bqQfpXwk#65WSZT05qJr(ml2pFXZ!ZhYI`{Dz7^z1e% zCTbzP*AVY?VQ={8h@kF*h=D}MPnU&ae$-@9tSx|rFiRhbm=}cc^t?+WLNNHo#K#XZ z>wk4{$9Vkn^~Dp7*ux7`1A3C#`y8U@67Dj-_ap{0!ylas76b~V7_>f!A5#$r9!C_| z9CwLUQUGV*$RpN6$ifg?R7wissmAvS?cF0jA;n%cEjd9?iS8QPBPyj@kGSaM#FWI& zsnwzrd+1RqJ*xK<%7!AUOkC&Kl+>27$tei7V=pUI=gT^5F|i206cd{e-RE&WHQZaf z!{1JQJdzrh+9xy>p;+u?5$wfkDI1!AC_?tKjePA@_e3I2sa_LNmJ$=H)l5uCO-_tY zDI40;*Qi{br+;NblRTl75|hIb?G-_bqA8e*z3l6_lh!FdF8a;bKFt%m#{y0nC$)Bx zML`s!qdN;Roy&&CMkQ7QEkdZI(g zWkb{A!lNmyl)Y@{sQ8pv>Vm(&Y{n9Dv4=IvqBxnkuF_0ttqj8%*3*^GmE+18 z#ihKZcEM@A%hcOy9h@!ON9(5d($DI$QO}4oTG?W7j`cd*aoaiD4clE?usx@}u)Pw_ zw0^^0-yUlpVjpe)!d}4fioVMb#A8KUxfHJ?lj44C`v^kJdfb z<2axCcWa1PP%J6xVr_8}PAc9a?iGI#IVqb|9OqCsm)?@zmbL;5W#vk8EjdE&A@`LB z$rErI^8$IL{Ih&Sekf;ES}I+Y5z70@WM!SQMLDFLP)e$yYI$`U&S<^^GyP?py<0<* zv^TW+IBhppOVHlK8N>PXQhHgvnr_jZdL6x~-bwF{({v~3-{3Uewfbh9`h85lsNdH^ zjN(S5(bE`Z95Rj@7mRDhuSQW@dD}a-fjG~(l|9-XXOF9S8?`v zR%=e+>9*A^z9vnN+0+p3_2YXh}(ZL59*C;2*!SYwt^9w$lHwjac)*zq`je1+qT zg9{@*%5h`(uR&!OtoN-Y+Ey{9qK7-PR--$mmX!Ldk;4|qYCz(%UFr8CAMo7h@R z5&Mc$#T6KZJd#!V8Fbf8=9I6L!^%UYvKp!O#97E+su#3(^%0<^TEN8}V-Be46xG`i z2M6Mkmw%mK!(Zc9St?rRTDQs;c3Z1NHMIQ>I?nm$9H%jjW+zFyy|@5Z^xNA=SMiN_C{aBWfZa%x4i;d3AgpNePR3AX4)#* zTiS=&zqkKnw>e@RDULplfsSF0X^w@CWsWtD`;M|s-r3nXz&Q%%YtMEra;|Xhb#gNh z9}|73$k*gs@tyg8{8)Y_zXj*TALLK)XL%R!{VRWuf5Zm~*>IkAL7cx|MyMdXjdRc6 z7rqdV3+Hk2zSYv)@|GpeGSKp+Wu;{&PTC)2ts-_3CyTFx*ZeLOlNEWDyhr{`&Y@IP zEQ*R*m8=X@hAZ=cucOLo<$_W{71erbGj-Mqs$@V4oZT8mAXy*scubn?QcTi8*!R9fz3(;rs!1dU|8D^0lx^m}Ti>9bugW%FKrI(G$hp;#lbuX@#^& zic-2MsmcW96Xl3!hdY194{l2;)O` zQhqL5M_W92P*2;twn5-SV{Gr)CfcUjJ_DV74bHIAw%%6L-q=3UKF&VTKHI*)?y`4r zBsku64smj)JoBtIVi4TrKLN+SClt55YH4GcWBJCi+47RLh&9w&4p9YWSVw`c-ct(V zWc0QU?k2~L1$+zm75ozLu%VXm7K*R1LEa^QsVr2M;=K5y$~DDAB!$;NDXMBy!_-=! z7&>8HV0il(JawQk0z9;UE!1|%)*iSRkNHs8p*uP_3OcJfYdPyV8zP26bLT|hyM2v^W1iQi1-PY9hXDVF-yf#O&(L_R0$N?+x$Ex*0IJ<&c2 z+%cb{tmA#hSB|p|n=>q+_SQ}=e-N=uZXP7r5bId$RO?u2f;3T@B7KaQ5woRv{*&=n zNp0kga(zgcCE&-i)gbK^t-QvC266lG{zc1u`4Ko}h>}CeqvTf#E5()4;4N&@jK9R^6-o%I;6xmc zfry|`-J)1(S&}UGEV&U?qMq0T@?t(BZ}5mD5F_=H21o}OCwW~S3{Jg5zAfic%7BwN zfq^BE1TP_0gdKc4K^=oL^jE6CsBhVLdtK0JOZyi44*PzLS2jm(M}9{|jMzeGAgdj_ z9KSe@J8n5%a#nOsceSm0wF?fp^#74tiTrl!ed(B-Uy+n(rHuNAS`_gj4r`~i*Y$RYYVfW;6eszQh5oTz zKM5&Gr}gJC@*9PreUvsrjc!Jgk!tid`Wa`Sf#k5|vlWJHDQ&acx?tANu+6s3v&{#e zS!7#gTV=~;&x80Gh3&=d6YQamNJke(53j5ljxqia^5%2LJjVjZ63Cn_j@^zUm>n+1 zb;zF}XC7y9=gXLf7N_cTU>3G@zUv(3oZ#H*+~Yjv`W`-Bt11?U=&guIqImIzBvjKO5fr_g=FtsSi2 zTgQqMK}B1|R}izMw)CdtmR^xxlT9TAv!V*7sn5%vEkHS=5|r5w#SHsG_KK5SO9@Vp8-~2dX30afm`O zP5m5N?E-ZPX3s`Mo;U=IoMAC1enm8rKh$8YfL2kf25nb|zFSvo0*$w=)=f*)(zF5E zr-&l4N*e$wOM-qf(%5Y5G!7dljn8eDZA0ym4iM^~AjI*8zQOO~cMD4`TP&w7ZYf+z zSASOBYN&Qs?*`eGZ0~9BYaak>VT66EeXV^nv`Y~dLxf{8@Ve7+&Jpaa;3Vr|l5@Fp zt#iNg4)N>>p1DwhFUMQ??tB`*1op!YM7_Dl&$TSGtV3%%EPE|>YfbChh-|aZdeV9w zns8ynuK7~hDIJ#1OV^~kQjq+*Y>{JN2h5Y*a)|Phazpz~+lV=n%P49zf_B{B7-oz& zW*AG+!yTBLca4{9Wo?ygf~^*Gg?WfCQ`%kuz36WrYM*ES7Syqx@t-~RQ;-)$94~`A z#yMuOIkL#H5|LSUJ8H1`u*G@6dDeM}qRnvJj381kxhec7kRZFDX5-IME-sgoMcI%W$Svh)MEaR3&xQ84 zMZPM(s#M1&i?*;R*CHlTu=*yb&H?@In$}joXH>PlZ~Men#9qU$+CQ~_hqyeKpvlHK z`a7nAliYT=9aWt=BzOzNKpO6x<6Pi82zL^vu7Os%wRu+$J6 zvG_yZiA%+8qFwq?)%P9oZmWEIyX3v65jT}>ju1$58)NQ79vQs z!FlKE(8iHFHe#`lV{7{K+><5FUr4StX@{iDg%^sWfn9XQ_(PD9U$*lzzz@6 zN`P~xX$!!C_CxaVdN+N5J{|IIv;MRGP|s?-YA6iv)0vfB$W{^>BF$Nct+p-B)(6`3 z$F}dG*KUR9!U6oY1@D<*-vAo?1)TjVGzU8)Q)h~^pYuJ~A4{M) z?sJ}iFXI99-yjylEH__-FU8m3YxB+dw_qz=;ByN_1zE5Oql6HPVd)5tl+~(O+aapf zE^wo)Vr6Ip4rl}G#XaIV@gX9Ol?I-gfyeig(xvxdNnDi5$yMY=h@aI7{Jod_K4#S! z`I1~0UW#srGqzbd2>aqbG@+`9nN=Gxv*OhL>WAR!ixEj^pL$mP4VWqbkAdbv49T2Z}IHtKY{v$ z&8TZMHKHIZha1x&1Ij{^sB4>IyJgF2F9zIBwlB0-a8vWlzOFDB zlKm*CYmDV%cr2t7IUtc$o(+$A0aZVE}Qz;D(`BKS*taF{qbN$w{Pmw%Ag z$Un&im6yR~ngJ8pp#K(xoDWrB$IR}k_EA>@4~NwU>ORfAi-2kbO7xrldv8pJFVPcY) zE`B6_FRp_<>;`5_gW_6CgJGd;X7R}iVlIY59u8-o!406cJFwx)DwToZKG3|UK=)p$ z?1E?Ty3zx2tp*@&)qdy=1u-MvfH$l+;!I6OgsH8tcQ0v`^%}Yae^^)W#xeTG`b;K$ z4(h)$`C7qH4TtfT5pN_j2|LHwVBCT~>~)(CoJHE&fHU^DwL#3bgNWEx)KSV&4RT=z zGdw}GuO7My4ylV2C*5{OjyrqTkwi;=KL4=S>1 zs0|R4Zm)Vly$jz#RcJ^0WSg%uTc-94{VAh#!6$C zvDE$m98HE+)rfEx7R-Da7x^S%w9pDs-_9e>8&QY>`=p83LVO1vJH$)i z;-$gC?NUuCQi_ERnhc-v=h6?%pL!Ttz!h-vd(fqd$fe{maz*%;t#Tds+S<$gp$|-# zm&*I)!=R+!179`z2^S z;qUwwJa4VGPy1DSsAbU$!Bea2HJO*LzkboK051=rXOhnV?R50ur>tNX`orQ|Eo8?G z>jB@YVjXN9Z@mXCXt3A=^m7J0x|m#6w#&8A+tzYd`JU1QoTnoEtDk6dv_;UsZ1D9A z*VA?K`yE0gH4Y;r8;y;j#yDdSq|;TSu+3>}XX^!@%Y0aStKmui-S#@X==ET8B!N=q zz}~oR|HB^UXz6GN+j;@C;){+DNT!N_x05r@`8_maz?~G#dF)Qr{i76IP^<)HgI-v4usY+*SW@d z2L4#jSmcJD-(7gu%1H%4`2(Rvi~$GU4S&8%x(*$*fcz?Sh!(JghRMqy7rH=i*atu3 zMdgNa7nV?Q#F9LuR>w@;t2JTp3C15rHd|is=gRPXjkK)*wZ+)?*$;vLUV~+4b*Px1 zjo?WNa%OiHc9wBU&PZpJvxl>fa}4~Dli^SL99rqu@Fp#WZ*?tvN#vJ2>OAlK)yYi= zX8LJf=ma&P6SU)_pGe*RXF_@;}4RdLKGg9-#;#oT`FDs3kNJT40>Ai{bEC zPKNhz#ZRBLkui^4UuQz)ksDBM&lJ1mU@-663 zS(KbgQTUE3D`8mMiBw{hcfi5Zm9LfWl~u}KtZtma{QCobqk`aQ=V6oG(==$bA3=k4 z!6TW~$ZHfdios`42BTQj5FqE+yfC?7%Z+hNa?EsWcI0q|JGVJ^!v5dyJOm%WDMU7PIj=fz!m7JZG(01i zyMs$M#5jEgmR&1Qa!-B;KN^^u%%A74z>X%LbXCNJtqD82BjTFI!!xi(*bU$GHOPTH zmeR1PW8j^B$I=J->L~c}r@yHVR1_rirb-SToZ4L z_r*WN5P0hZF9`F;py)!h9A@=v6ZS1q3gPr{dQq_skY2}D^ z42Ea(6UR4@MJ`89r+{&43Tl4`aDEByvYo8%b-`R=*bW8wO1uL!-JS1+$ef!1YZZ*d zM)4h`7j%P7psdsIdcUN;f*81VwGni&c*MUPt4@cHf2I1PdPKbpoh&CbhDwNESx;-F zbwSM25!(AKw(EM#(9_`4!Fn$6=@PKDUWeDbGi<97`gnaJ=I%H8YJCUz%X##dGqOY1 zFK1|2EoqFEk{HOnQP3u)8($ee7|V>+kiOgCPwNJ36tma1x5garWgm_;g%6Ma0zY4bNR;;5Ogonh1(Y|eY0FG>dC$Tmx{4R*j`;N7zwI5>i&b5|@)o>B9b+cn# zO@l?%2Y%*{rEj4hZ^k;?U076{oE>twEIb>M+#B-uBdl?*h2?M!RFezd!y|EgT zjunbUup)MVOWp+^cvXD^qt#07hS3^=kvgQFRIk7fR18+}Ygjd`3r|@$ZKO68Rx$a0 zc4M3_YPm5&m0$&TWb0isF)qj8U&xD5DQ{FUS{Pk0A|v73oNCN8<{AqzCTopN#&&o* z_Zvrz)8HbvARUT;e>8#5GZD5Kt-j2LrnJj;5;jCNtcfPrQ!$fPLObS81v6iLZoVil z!Dl#^U&im}Phr)#BI3d(VAXhvPz)7k(Adikm?)sJ{&>vFZr#yc`Sc@8_ z6W{t4Yt+}_50cn=V-skOX~q=eV|ct~8}p3$7_mjLXO0_ZjZ0W*xo@~(+t8|1JXVVa z+a|zYyb&X{4|a48dqL>7W$X>0wY7w&lssaiG0&#JyE7Y-;50bSLr8gXVIWIgNB`_~5$<^U6 z>n{(5rSY-+E%smR!#eZ{`7ZS1VoDW7Q)(ijc&ySNR>xT71MJ0^t9+yUp!|e+dJEeA zAIj@k*OB4R?Fet~AjFU!tA4LTuOtlk?^ zY7^p+|ElMM9{Q^BhS7knF?TRJ8wpqyIA|Qhs({O=0xevD9p4?gQ7>3w6tR4r?JOcq z7hz*u5t?aFdp}5%MfMf;o%WyM39sa+?hs+ocvc98JJPXt;k4tP!-O}g5d2Z);g71t zG`r2-eIQwwtS<{YXEq|0=M!pR4v&O1w}Uq}v$V2wf(#!4FK#ugsMLm~o?snd-HiPn z2dqb}x2(b9Yq0MuY<+ixIE_i~l2T>tdlBI?Zz`>kPD@uMQz|YyA-8iXuPOq(B{@|E zGlDGFWYo4_)m zl^I%-9RvEG1a0;!td=anTFEwOK4lIry!E6LK2+F|Za;2)uceVE;>rW zLZ(RJ8=yH}C-|^Cnbzh*5Gh>1eyH})p89!VEiQBuLM`pA$HWp?RsK@?4SwLf@B){{ z+Q?NU74mI@Iu&r8gE#S!npLX;??p2$8dw_xE#zzMdu=r!-3l4EA5!inR)%mNkvIXg^n3E=3t^((Tr&q%Q7oUr;C_cS&|-!ikZg>CrV2!EK2i=MM*_P zNlHmJpS7HMG0(i2Kj8R=7y9^|v)1qW`F@u&aT$(_Qa*FX zv&4D0llk!-d(bcHVXEKB_7zaf8=afI4UnRKk&_~4L~@v=XGC8W=e8tS*~yPSY8vsl ziu_rpzQ%@oknY=~CTRm8u35yW%O-W9Hb=V+^|n(x#1#FDmZbMbu@%fDfjH>~Uhxq1Fb zO!Wy5437wVl66cA&ko;)`cV_!jEmu0ct;vHG?Y6T%WS)xN_^Bk**nOdd3$s_JHhA7 zA5RFbu_9U6m6U&|Ir=1hhE%Th>aR%t`3l~&ZQ-fTpCG%xVH3MGG7ru6P$bzON`0>I z-}blSzdPoKpapkF7e$|nzK8PtX|yRgQO+@w*;em}y~q^P%*M4V_O;lu;>nT|q^PH> zzB*PNhf;Yzd9#VT=~j=a1KC0+YjBl^sz0nf71FwmL^J`&@S#QMcU=)Xb$*gXu)KIsQN^qK&gCaZ~o_D}ISka_Sgcsk#JMt=>p9gK6}QmYgKwHS}d`_>Oc;+f&$ z5KN&IEThh?4(|^q;UIDBk#>RoXPh^W+0XFJe!_QU;HDWv2bt>3WOCTdHv1`Eg{qnU^-zc!Z=icS=`c5ruy?E2A-j{)IBi~Ug1xq;+@SL@H|S?Jyhwg zU}kI%Y8~pnqO>JTPfSGJV2p*VE`~}R#$$OYoov0clqlE-mk)Egk1~Jm^Vi|P+r%8G z;dUG&RMD)8XTvY^{U+Jt9NV3V8okXukKIs5Q@e`p zJkwv~ulI8TD;OVK8%%|K~}Rv)R)Y;P7}$dsq8RyM?Lm zbYq0^1RQL;F`SdX#++u(GZ&)FKVhy#o$rF14?=%GVnxG?(2Z-twbaKBk;myFMZEfY zfsO7%Jq;RmO=J~xs9Bsv*74svs14V{`XX+;MnBiGt+`=-PYo$q{5YznXr=m*ARp%c zJZ#|I*avjFeRxztN-eR}m%2AnEr22|#jElrr_!yKX*X;0wFhyjbg*$8LTfrvAE<|o zV&f{5lo{-dH88zR#%a(z)11Q@J`4wc2A@r{`I&jx{MGDdrJ`-PR=!nWU2M&VDsQ&7 zp#}6XIrR&VLUWlDUdY`&g=4aj`%~-z_F!AJ!*;%12vxd@TbM@2Uu!quGW&sU)ZY>M zs>YlZb;hz$UdEhyk5h|s_mOkZ`37#D>JG&7biS*@&+{Mv| zZ7bPd)dR|@dZg3hq;`tDglGwGdoNC-ePjhGSm{Jsy`f3&qZ5v853T<_+ zdOMqmn4#9F_3S2Z!~S-t?P?c}InlMoYZGu9Ezlm;o<|F7qc$AU`pRzQp=n&Cmq?m5 zN1xApP%SrE$>$veI z^t3&wSs^P8PxLTud@M@HCG@qWOv>L{Mex(>soJyHO4djv_U-UiHj{Q#pu=Qaf81zU z%y>E;ths3V&)P5JVB5_+bp(ISsq7@B&UN@XZ*dklDBJd@*zYd4oO~G?ehR@OGj|3OQ z%-FctTqdSX_@O?AfGQOs$&!+I-!YQ!dIN-E4ioKC^?7ETVcI#w$#n8vXr^n}lIpcD zwKH{5PXt@ImFRew6Zlv^)%YC>peeP~n~gYbB^WPoi)N zzWlS90cD613lpsy&~{#6W8Ea{z(IT@`Di(phwC8AThVb25DUq47S|q6=Fi4Wai9G- zKE$=e!kcU-pW9za?@A#25;tL4iFYW+uAf&>ANneC(b`sfN1)Hu%OKJ4Bur~+-*u$+2iQEVC zTSZ@rN8VWSlMTEktMEl|Hi!Q37N|LayN%qeh>3G6Xj@OPYQM)6j6Y^E%>6a#(EC1` z77S&_4T1vdcV+MwcFCvVO|Qe74xqUngXj(=4+AE*Nw|!JSN>@-@^v(d?_)|!h<9>g zzf4mHv0;u@FIGz=^;?XJ^9q${FY$0lJxep7Oyi-xe`K0iKsTYX4-UCbzDqBPU@AIQW-L3F%Xji&Erob4OJh@F)A?>yY|ng_tiIC!zXr+? zCzBeyjpR}j+0=|Lto8qNd}K$?fsm*XlS=7F@_4^d5GjNs6-P=?h{~YwnnRhAup3k-7@I(YIlv>!0gb7TdR$&y&KMug0DZ_8-%wr506VR-p*23b-6bW zr&cvv?izUpO;GDjuM6@c+_LF>Kk>~*^KHcUIQ|WmFi$k`3ETK|$3L6GC(7j0 z;QdS#PZEa>QYDkhSW#ak&imL5BGFVG)Rz*q4CYyds`#Y3g2|#5C1wlnI9kz$EG-)kQXZA5P@6(kx)ayP66%p~G80c)tG1Jgqa8o3B0bI75K)!QxDan`iC(H# z>T{Vnmg)5*iHN-N!`8^WPjA^ZhdmT%>;)08ofRH10Zt#-8CE~-o~ibhH}Gwkzf zs{(zu9{%0Po3&;rcm^~?xZ`~^&QiNfI^=~vz8a^>3cT^c8Q*}~*~BZI7Q5BngAcKT ziKQEEqBtSxm=}I|;g(nN%KNaB0(K+ek}tz8J6(3ID)`AldRH~>;T2S=TBn{jag9zB zuGtoJl09&w4t6NPk`$bTscr_ZfwFL3<+>^wmye&Yz%9Z*E8?^qA66w!nQC^e6~t_< z8^?{+;&u|TJ+4B$`owC1SBPt~+^eAL2`~3D{4*k7MYf7u72d3Fx}S*H%t)5ZNRf{s z8$~XPOcZ%2vapH>7DQjW^_iFsGh_-?9ZhowuP#b&8lMSQIxzBUqHZOpo<%(}ic+A5OtW;M!gJ%nNl zWLQL2i1&~tkySukEn{o0C9YZ^Hwv3`9_}9zQx!zh3OtBAiJf+I7Dc|V5b+|EmeE8? zC6f*HD7~LDh#x!gL=58AdxD-=udKQKluY(FMGZm2Qq^=$WRRN4sbr(1=JL;>iH!Dn zBQcuou8=p8BD+gvewVX9RH&8g5F*p>WcRxtCA^ycBeFiuc{VVmG|Jp>mf63P(`{o? z>5z4xTUG)^3u!4#E9si33F2)-Hq&ITrg8(0tPi7Qg(zZrDWNWG;VwGhW|>rjTv-ns z?j(<@5J#y#6?tq7G}t7 z_Qyibl`~2FN}NFA1QI8ZIDy0oBu*f40*MnyoIv6P5+{&2fy4a)?Rz9wbx#2?Y)a{+i0;_EEYTdN2371`!KGWQOFy`DdCk4`8LR4k@ZGvQzn5{>o!|fd55gJ$a8E{^`u&W1zn_u6 ztSsYuKe+pzYg1DvWExe!@ZH>Le@F@CoBz-LWPAQG{671W;rx$`^grTzVEwlIuf*?Q z{;lHuf95|gzK8M$#rLlKL*n}b<9mnrF1`1z8mjwzJ@NZ2mZjEY%k>{8mzjCKuq0hN z(K^9mc@S9HOPH}(iZ4NDU3l0ie!IkTlEsp2K|21-Z%g|`fy^tF36>;Fo-9P=sDSvE zUwLWCmZThuWtNg``31esP%LlwXe37ct(s_=l{+f!oBRZv9|6Ae{aqWrry-1&&pm+t z5M0z(+0|H)42$KCYwPa5GkmATvgmCjQ{Ugg_xh0;^FS`w%50XrJ!sUQY_T*U-;MZA z_{+0c+OMsvue%FrqOa()r2u_?>zsUf*Vf&0{|}Jy!KKIy99T-IqVe<*`^y7Zu^<2c z!+#3{J=QH9cGuynZC1-J`YUGxL3X4kg;Kd2sV97jH9S7ZtMDAzW@p`%6`gjOm-2Vf zN5UUV%}Z5Wp49pH+|rRWan{Mh9jEQAvxCpHbt1ETA7TqAgJ;hu# zr^Uj$?`yBH^;E@M38E;qzy`f1>lZN5j(7Lk9M2J1)t{-gqaA;qX*=p&kdKV&WWEWQ zF-nR2_noM)9qGT&ct4Rh#NM|?!;`j7!_Q+c|5BES^i*h~!Kz9D1n~0$wO__69C}%W zcW-z)Ksw6K7{wx;6_KurUwZedUm-_TCG#nfYp6hlmUeqZrxM4UM4H40_39ji$X+y` z^}N=ev}QsLC#2jnjIN|ozs|v3fvwX!xF(bJ?mPU}EEMtV^X{#;=d|}H**d)4^+~L| ziuG0=1}j;Nz7PcHPi?d&?_s;^?icXJ;*Sg{Wx>!3cf6bI%K3M{?mK?>OO&qNGssRg zN2y{HmIG&Eu#7$2-k$n;wue85;ype9j_lLL*iE6nYQ6zhJP_btiF8UaXlG{vQ4kJ5 zb+)6e2gBpb_@|JzM1;P9`=S*zj6=3TO$@U(muh}VR8xHXZY`CXyS1wFcJ_ygE>=EJ z%Ac2IYb~`FeowkV?$rOtfGelHb$d9k`4n|;t?Rz+6#@Q+RW#Mwu4d`JVZUBHX!L=< zh-tDW?U>z#v_Ow=}8kCHbz%pq@Qdi<7_@M!_lB`$eXWboN*lj(wZXn@a=F%oJzg-L1nP1TY3iCU(fMY|Rt8F0$ zh#HG@Os>+zQ)QP|);W=9#_Q}rHJ7nTn!tFjZux{1^OgT zs6itpf8S00k^Fu5MRx7U5&V6>>`xZ8ElZ_R{`*d>ko+y)PvlDMJ@`9y>r_z2v6p3m zNY4sQlr-^9<5#Y*Vh8K=?hD@(WOJ#@-reDA%KB~k%@%f%b}_rvuH9y5w<_9g3cJ;z z-R9VEtE=rcLQJG{vUj)o>FwGSDpskDV?868UZN1y(m;83Ck*M1j>9u;JDN{Tayp$R zi>(<#&!*6@c|Mj|zcNREA=tfl&82MbzOUXx38&|%chF$>PHzX;y~EF+Ku@LEiXoV# z5_Sp8geeFSfmI=+O?h+8TRg_&e?3X0LUZ7(@fzL z!-wS?;REuQ5N)F4))TR@5oDh*lybT?eTQEy=jm8LE7Ii2+~tNCMg!jJH={>#}yyZLGgi+YO`brN#qnTg@ASua5Ur^QWg zU59ooYAIWyG;Nj7mr=Fy@k0G4cx#cBi=^-|wy!^vEkaE)%T&lqub=AQE9#fIzGi#9 zQ>d5D*6X6t5q+$zx_!jp8RK_oC^9e$N=Z(%)}^h>%)H%r3|sTbL`rI{}8 zr{U``SL_d8CFh4hb|%>k#BFUAHPGX+m%W|p9~lZW6u_`v#8OaAs-I6F`MxyMjV=VW z?`XN&dWD~Wlp`L?&&))o@qYdXnXmE7P( z9c+1KTB)C3ixm{>74IV36o8wi`XRdD&{Abf7SUdjW1NdC>rvL`?O8J;R{)?+^@nP11nQzw4gtWI1W-Nd zjS`9Il+(}W%m69#35k7mwp;{y@bkYyt^th1{<4VyenEvu))t61pQ=QgW%ifs1jZBs zhF|wxBvrV3@-tneY&M_y%X|OwJ7>#c$T!f(x~9f73sYU;Y&}0S%?}Dl3$UFaqjdbw z;NfR1mX`MLg+QE}`5Zt+nb;hjrgo|#@6%bLcuO{lOZ{4G@B4v3c+BhZT|j=D*C zKrNb8n@YtAX>0~`AyCRyf>JU-aA%Ty9FbTOLHg zzt6n$1o|Y+G+azHQ-T&rPEik?Etd<{y-}tm_L5jPbgRf}up`^gWW_t&nEzbh;P4CST)8%yb$d!2TM?a+E?cr2S{O*2)UR#^qlM`u> z6~rdhOfXoAIdd-PPci1dcp@g(D_Ma#kE&^cp1iAQ{u>-IzYcmg6Hw099{_0*})j3pFfEPi4V|Y z2;o=LXdqjUm;)&ZTa~}7Ds$S;tgBSz$ea zHdi&fU3^PXQpTo}?hs@-uUWmvoGqWCg%EpB4DvMZC*k{>-Vy^GzO(5qIfhbyk}E3^`q4h`C+epDq}lCF@5xbH#)68eF3qF{ zWU`Cai=siP`5a?MFq!sz{>I!N5t%z%b|914Gk=1rI3qzjRBr&k#5G5OkAW03Gc0;Z~Rwj{}bFv&cjpw$3>09N71 z`z}0N)U=>pK3vL!4$$3ij#G)(tb&MH4?psvn4>eQBRAcoUd$dPn3)pka0P1Ypu!Np z7>YmUP4=vKlf>FGfI967Qk3}JiIpYHYT$?FffmrYVKLKu!%!c}f=pHXdh5WMXjD}0 z=kG$*3+noDC{rRO!2btQBHPmRrzx#eZ(WDXe*X4MKvfKjl>Ri8)>^lT&tCDlOMLDX zpC5_OKJodP_&kJ9qaIEF0zbN2IX zFeKzb@hSZwm#C%NcgV^fCAta)G~XZi+9XUj&k{9gP0j9h(VUoG< zJo5`tu$*6--j>XD3%e!8lj(7uOdUC)9KiZ;af~5peYk?;Q{RaBq|Ym4u(Nd!<`hFc zG-*VP$Evbm&HWg0jJ=w_!fH0MVKzJ7x2(X)uo`Goo zNu?Q}j9nBAc@H>So+czm%vnBsh5nvc+4z)@pIe1Ss$h}-fcJIEqW(#iHgR5-fb&b4 z#hl*f$LCu!E&SIJv-`!yd^`sJ0aWXKLRx{xV0?Zg9byD%5{8Kw{LJd@2sg5g1XYmD zX1l#R)Q~Bmk0eOwi{oH@3i+G>&(4IU{QD+6kk7AUO!G{+9sauiCFkbmOu&Fiq7p07 zVb)9#RdnUFOMA7z=l@N3Bme}?MuJCgrV$$po(KN#;D=^UShw38KuaaYVOYXKG>!3s zf8?1+%s&!1$2C%0#2*E#Lyv^SYdsNm8^$(hQ`3W>|BE0RrXme8#zGnv=<*S0&{){C zqhXAd&*3j+J;(u~iSiBCfp!0_J;9WiC=rQ%d?4uX!iZRFThw{}TFdCwHr`*#d{~LP zF%dbSkGcE-PSzHv(XH)O&ZpZeE4pT5_^E%*1MX4tR~l(>V4BIZ+pFXx@%on_A50Q3 zT>lhHdLho_WEQB60)Sde^keET4D5ySrI@`+Yoj6arFsEoZ=<@qjp_g(D|hLwGz0oE znJAdPXx8%w`lm3T8}pzsI|5PuK&_>e4@2aLb&ebJR29F(sK^vQF@1Dtq|t4GlTHbS z!m0dYc#m7!oh`i>f-dBiAZ@(qC+!3Bebs)b}Tb`MT{~36f zhpN%4i+|@@JirFT|9UkV>td&PI<$IBhF3)zU6$}<*2Q;11p3SPFF^$uEPW+1Zvh37 zHY{YJNcj~~V#-jg?*_d#50Lav)JK%D#%l@z@9JU7-QLq`5iNRsXt(# zpT8{8p7R0bEdDDaqtPBRL;p8KXLv%*Dw5>mkq25(Ur6`4w2EOKhLXl68uBfi%pOwu zXRyVwQg(K#e-gFYpm@8St<6AK)B9ptWc7B{rmeLTt1PnTuCS}gT7$iRV(ttTma2Xm z3{`B2T`L~Sy+}Rh+Gl$Ey#IW8K<9rGGtg=TYwB zArzpL`?ZC3Hc?Z&ixmv=VE=Rzpj8qe?K_xJ$+K0aXp8KiUFh(+w-R^@?dZ!bb^v78 ztblMK@{px?!;^C$U^cYTXWK^lL{n`{JotuRx6a!{kIvS6KwyB@`+(iqQikVwKbPr+ zls?IO%GpYm4fxfXw$clWdP&=J^iaxncRwOh_?zHpWI+7}%AKvRQW>KS)rkqlXs(64 zM6sXhCCu6;;3(~GmUV59)wMy?-X_x9o~O6$W+m1(&qKz;FQPURu8U*uOt>1Uu1RsQ z)bx1EnK9@tHkt+!*jctlV50Q|NU*;!mgf=_90h1Q0YsIL0q6J_DEt(%wF#6mS}Qz4 zA_Swi5c-%MOa?J#FQPFkc0n@3i}{C&PDjjbFXw|5@%bP!0B!$Ve>sX8%Nmm-PJV`V z`gBxTG02mN)W8mMiIcz%GQnU6hrteHN;WJ6COZi2b!=`B)4AjZv$pPjI3hWP??`il zmSmI%GyEuCc{o*SN0KETLXibjL{vyDaqqb-AzEN#vxEfXd@ON`T`K}hWJ6YMXrs@z zjpCEhC-V)y4QjW{+eE*dt&K$bqCUYDHTWslyYqf7GX!J2@dAno-k=v2HNEXQdZ;0z z67h#flE^peMRT!dvkg{cN?i2ytx^`6m1$$xs`#;tH z^Vk31?7xsJetsQXmABF|UG!eIl86tHV&cPioq!Md+Q0|tg`!$k?(izA53yAXvA*$d z6?Wo>K%(NUmS>mW=1)cPMo+R>^a}>prow;>d9GNzJHo4Jd<-UI`&4Nald#N$RvzNKneU0$+Kf}w6U?TX=kO^I1ZV$`L|`X#}O`sJfh zzxaXP8THF|=hQEACD#8<=R>V{5X!h=j9_QfJNp$m-W3WfgftlR^WR{7!ftBr5>loj zCS?}Kq)Zoo52I+Tlb~P)_zswVG2fT+4m?2E7?Y&dsDyuYu7shmMG0?jOKd#{)pd;N zTi;5yMR=x0%en!`x_LxPg?2x`MYIatFCpM8aj_=oA7EaNe1aQ9`$W$mzhpgUth)x4v4j{VNqef3xAF>U`F~RG*xPO zN>8DJ+!k1~fq$q=aO{}c^Z|AfRTe0Iwv&HO6mWfrAL|=Y<=OD(WIhpLr=mQJtHPri zg7fZL!+96?$DGgqt}5`WvXq>t^vFFf8!^4zMhmFFd0-Z_p7{C+fd|`bQa}zl?N|@} znT)m7n(w&gJ5jCa1Nh0;3b&VI%Z=z`t&Q!(>l6Ga1k-zWB1L3rww*OuJYPBPSHop4LzClN!+dN!2i0w6 z>D)I2OECeZwUVb^Z~YxIie~)0=u3>zLv~%Ky2w;?QBo)mgg4SapL4* z+rEy|vDKxOf!&NySRPvhrC>@K^0lov!8?aQo0nu=Y08tE6&OuvexRi{` z!=}7|ef_a)7eP?21WNV%>=Zx$2Otc+gXW&iZa{6#zF`7kRD~2^x7fDBd!X(u!;gS@ zfK9viAmxRb#P(sSKwFSc{yh@LvBzviJGy;|-+1-3Xe!NcD;P>kOq!eW<%{M-`7+k} zfZ}P7fDM|XGqNADm?2${>_x*Rif7U}m_W2&PyKhnc4U1pg%aclD0(Wa(*v9qitIb^ zE+J4a5sjaA^ot1EPcd8wXWR5Y1#3YEGx}XTaBsU993Kn57a08d)7k#iAJ6 z+hl1G!*wa#gu8Z;8J4ZKdydIQ|7`m>PE4WZv(png_s@F(;RA~2jLiBM+b5JY9!e-; z8Q&*#cusqVVzG=OblJ~ef?^9EjZJI@&OtvBBYt;r^C>F4_QHF&Q-=clh=g{G5Ux+nWCX^*tq5*(#*{J_44!f|WtY*)Ohc^hQ;Eev@c79E)sTju*z7Gw-1vkO$;x?@%vkAY@ z$D9*2ndqM0k~t4w>{QT?fSfe#jm-J@$veJATFB189u7oyQ6!g)&zS*#%lYDS)*%9_ z%HBV|_A>Bd6?hK3kQAL_fdCirVUEbzsIw&lFZ9PUS76o)1bbRC@4&+>pfWn8O-Oom zhS|X$&@_8Y0GzXnFa1E^vWv+gks-VDkzZoqX>Rx_zWL8+HW;!xTgZeJ8A@`t3aXUZ z{j~~Q@M$JAfFyi_{#0f*I$KIm5E8QRKRV?x0=Fe|DSn{wB7BkaJ`Dk48Is&kY#m^R ze9g=hqvYqq2gT@zV83+pmuaSfMU#Eb$(KekPO<(*r)-qdS?gSgeY2y>5d}4_6!_*h z0}+_f(C}jzCPo-Q*8{s`*JC3qA27bKzqfxwd0MPApNcrY6O*Uc??k0R#WQuw?~!~G z!PANnI*$NvLQ|HCf{2e+*eFR_0$EMnAW51*h$Kl$54LY2NnNtEkffjV zlO&aYP-~4~{%<2Hr+e*HohJDW9nX$!7v5 zzylHoW60;5!06|M;J)@1KpHKdQGfFQF*%%po#6!=o4=yE@i?0eitg+0l5-r&$&mQT zjvjkC9(t$0NiW%H5q!5z#+#TUA-@ykzt~0~_G>hEQX`_8G2}n!b!R-DdyK^eY=h8X z5r?%tLtCGzta7Pi8DG)=!!vclE41ng%|OofLJlX zEwBrCJ4sIbeRvsJM*qKn7ZG!LT8ScHT@%OcThbBaQpdpU=VbIcKdeMSz;A#po{xDD zL4f114kVGWc%J-yQZAj?Etx@9p8<7s*}%3EW5ZmC)ZZx7-&{}!bY~X6E(^{@?8NIZ zO4VneV8k~(XJkQ?D}=TDDS;tZ07dw^r}Y^*PO_sFFsHtye2aLo$7*Z_Pug+@kqw zoUCEK=aj93*r34GpImR#iqMS1+ZDbuM(H7<^scbqp!6d4F`rD7Gt?ZVy4PIGg7ZuH zGg#w=c>ll0Kn?LTvj|KVd~Oq2$@~z)WgoyORv}ENYeU!VT~!-8N9dSRewBr0BOG7! zv#lbkH4gD-Q77;dS)UgL64Wb19CcbKRBH>>T5HggCTMXrQ072Y{o@Q)U34EwFsP?;s;CwTmgO(Xdwwu46m08AgIUTNytvI>INP* z_@Y(9nOOytj}+-K`nn!%Vksng6(B<6FML6r8iT4ZoZp11{PR8gKvltWsOr8Lj_#CH zb(?{sQsC%qhysbDJm3gM8}H6FiAc)%m`JRxOF$cvke(zPc**?8HaF4NMW{j0mq}xZ zGmM}w1lj)FID6ufT0>jDWS06YD>z;>f`kQR7+fja%&opj@TyD;p^3WyENZk&G*r{aZU)S!sZoCZP&`* zk$evkg78d_R=f?nVQ4#1{vwvSPzCkkUSg3w^>Yo|&o!|9#HSjm z{+Y&|gH-uL_WMrE5oVv6{Zq|19r6wA2&uZ-YfK)15b#A7+vfnli0_>&P#b_+nBshR zwPEzZ(hZc)SGA+!(drw`kHMT1T9HFrm8Pvq*H*c;RoGZH-}~|U9B;YOc&%-p=1)Tc zeW$;bhmPh3=C8Sct)A~WYTH5ii(Fz$I;M%h{E?f}F^p`9gO#SSh4X{X&2=gIoPX2v z2WLah-SM8B*RNBrXx$&awE0F6+;P!+GPt8It<3pUSIfcM!{d@^0bkjLBG<%XcB<{+wt|d$srD`b>69Mx?_n$168? z%|x1~*SXv*-{r#aM>^(|s2rQ#MR`Gg>*DlBi+5}+*L-aVxCSYfWNYeU-M(k7T0xdp zFpGj2{|W7Tdz~#m$9E`l>h876w31o#e6Fx3z`uY6ot4ajJk1Iq*yPVwkYL9)bt4vZ z7rhq#Zr0dV#+T8|Xuf+b_HN6}*8afB-*>pM)z&;EM&|;gV8B-FtuQ{t0ItJy@~lYVm>Nw zDMf(lrT}u$+{x6(pmNOuaD=P==knAmBmH+9AOqIAEAZ;DpD0$K)6(xoMoa%BTOYJ_ zZ&!V?r%$V#6Kp=ZJhCnF!jctBD5jpUFgYVfGCadF_ zM7S++M`)njDI>?mg!lRfrX*Lwrp8i{8R-J3na5~7Qr|pRvwDt4A^#>fUw#m zU@M6!hGZ0tfE{ViLbR8J-z{Y z895UT`+<_B2<{=$36x3FL4OR|X&jWqb2U-UKxu7O5LxaA-2h(f2s{paM|?vh+m4fL zt9!2B4vfQkWX#WlG(S5de?ns{gbBLuzJqgE{)KL>;t*+QZ&G^kkhf#abacqm;fKZc zI1hk7iR}M{-ujMPfw5&7x_u%mnxz#VZ{6-}X{0wrSt!Hu+*&a=`vb$yLl8)7sWX0z zs?fyxjJ}+aUAc`_K#%0ILuHi9=+8ptJ7g=&uvQGAA(n@20`-JuPY0rWeM4n_z7?%P zJ-&!?_y*B+bQ>KckvMx4{R_1)#=j7vIr`q6ifi9USM+$aK5drSbARcx|rCBgAGMaDQnzfn~pFDKe`2=NT0!4N11mp?0H+x zwKL%8TbqW2i<`eArrQg)ND%<-mw2Cbt2S1c&Q{HbW2d+m)=VfDtL6pxr#nz%g_5&h z&z})Jc|xn`!)&@8It}zG=d0aNyC7PeoAXktLCn{Ji*gQPf`uZ&qPdf?o(zGlE@XZ; zs9p2D6X~KkHd?$*{SuYh%HLtd?Rx%%XwLqVM{@RS<=aH99oWra)S9!M>istAjdWn< zC50!~y2i~4GuTR(1JkymRcu35RJWMFqs8s&r>uCJt@s^+`8vQ{2Hw5HV);U=7}6?^ z3!p#ZrJHH+`(TFm1DQM<>n%uny(&X57aH5X`WzSmJJ(+0*((J<44ARgZ47gthXN}X z8~R#%I1~Ds@n*7o1I~1s`WhWJ!Wy>-b?t{~)zQKfEc|bWTkbV$CExRJs7Z`l0=+=b zEDJd|H>A))q#8b`OIalZTn9Aj+~qd+T8FKRt#I2`zkZhkNY#C4EVwNGGS3BV!}>2%~?3^i>b#ycD1ovlQ==U}9l zVW)x{x@DT?NAL)gk8lb#vS^zK-Oa03^09Z4vc^OhD{`bPbYy?Hu%vSc|Prr@pwG&@;EKM|baKKJ+Jv*yg13 z)gG;2Id=jA(sB~Ce2jk1{vd2niw*5LTg|0`g@M-41Fkl7?o}iNZtR4=Xki+Atq)ac z8|jnqyOHRjAE-`euW|8)J_(5%X@>V64Hp9QA<(E?_021b?avH=T50`f+nZbGSnIYe z%wQ`VwiSx^cWcHqFUdsdcC;WDfBSDwbma*yV2enJxh|%}e2Xn2B__iFK5b+)cvvwa z!Mj*#de0&e6h6{pN%GpKup-30JG@KWB*;e`SYf`$7E8Q$jP+hboWey_;GlCQu8o0) zt#kz1bOW?0BN+uT*9F+p$O_WgiutTz9xKUY`#iyn1i?b~{hC#`TU@qIKP$)x`1#{l z0H7GzCY+o7Zr!2j_8qLmf%O=cd!XhtSQdfx{UnRYN)dn-^dxZV+}w*AAOTpug1w;g z1eM?zh=L5~tDk7g6$hSR!BF&kE5zn;J^x0Tqa32KM@tf@F$lx6-Y(;Z zy7_f*lfXd#)oFZn%lIFx8P4+YVyhvU=%LNWE%j0;%hvCRwSGCe3RN(@Iakc6ZliSw zvZp#*_J{4-16f@F_uH`oS4ePY7*sO#ExCO4%PANVtRP)$$chmy`Vaql8FWKikW^mO zHJ9DuK$F)R(t5Ir1uela-GE^V9|s>4{Kb|dI5=X^`7EjRin(<&@=#t>&0;oGbUu^P zVp^Xp7VDD`dnk{Vd=K&02Z5$R(n(0`@D5>8^9}m3ypwiQ^)94(y8YVXIsDA4G>TH8 zTAa-m=LMlS2^I8~Irv42-B2kj%Z@2jfQ6J!D_)M!G$jmVbdo|1UKBFT79a0_T8@UX zK68)>Lp`pkLxiGS)uEaTFYIlZ1LgQUv~oj`|87 zMF+<6uZBph7_lmGJJcxu>YslrMiCgK#Z>VC$?$LDS^YOzj?`)12tT4ZQU?FT{GV}% zP5)|C2B=mjCmWvHhPoUye%9`9pI8eEI95dt*317eS*r$NBj> ztz|H;5MF>d^k#u+dAoRn#fRw^YOPZ3OM*g+M8NWI3I_t+7bxC zeV>li-Wht^{T#)Su|e@=8-$Qtnwe$V8gN!l+}PmRi9mr_#w$ve$Ci#nGdQ;IWA#_+i+7cg zG9Uc}fI{x!ERsRk8;oD$SOqq-*L{lN$W@2yJ&4~eA1*63UtfZG&mYU2ieK>3QN`VL zpD=Y8@&#)Luj;C=fV?oOEW`rUd_)1ZR~Eq}C@i$>sQ&I2(BrX}<-O-h$5 z0yq4D-E&YsDzAG9#)w>>qy8@R5j{Z%$^vE+3n;Wd);3HDgOPq|ux7{f#&_baoH1Kb z-!Yp|VNN(6`QG512uG)=3DK0-=TO(7U1!Uc7zUsv{B86@LVHYqHv=><)zsI3@8b5NNPiO6^cvm|c@H!ei2WQeDtvg~{yDZzy=WKQw&hy{pNFltuw(Z{ z=hzyzk?B$0CPosqoY7ZalH{#uUxzRO7!Ka?9$@9$)M=OkkXsK=-er@6P6OP&j1_Oe zDR;dA+7HYFKpjcK#&;~vCy3$&Du3hI;(?sUkG&i%e@70*<*fV-)&)kO^Hl(u-e5?mK@sclH9Os( z$6&D8DY_ObcBR~p(Adt7p*~0gv{5E7SYu}V5j8|^o;>2 z{Lk|L_=AXtCIjz=E^~JT;<068IR`P1mBtz?LSsl+Xf&3~|6MkgO;z7ZJd8+#C>i)3 zOsSv7*28A94?<2`d1Dsdz^u0+T=h_S^O&fx6naw z)JKFF#^P-d{zN~CSdhdFKYDH4vKum|1Vp|#^# zsmu0>ckfzHjMES1Y-a^Unj$LvRt#1G6sI}?)~QlF*n$}dukb8!+j{$VGaTnGdY~15 zk+XdsBNXXR(x>WnZhkTo9cYFd$I_&^4ih<5v&by!ZzHe9DcR7ba8d&Bvmq_7fls^6nRGs776YM zoyPJS7=+*ZQJPaC90Wh87rL$0;fm_PJemGEkopE3(`?7cXpCh{YUU>Vn+!(cDN9CqC-w)DEJ zQiOo|hWT;Ce4uTXKNWF!PBJDU3p^6bCxKrxw3R8dkf5!cluenIPMxLOry`KeD1pFH zh;75>9749Kvt*%c@;NWfo)zHJs8zf|{YDyWT-wrXvx->xvG^g2*86bV96UEv5yXVR z(cEM@vsqQ()R*gWpF^Bz$Wy^2Xb52|t=P0;VJF!X%2}JP!;Kw8+(I7A%oOs{O>Y|^ z=AatP^meYXW08KQxslUdL(bMVdRy!uYd*+#NE~)-+ezgJr)1R*1;}W>QPifEvs7wD z_YL`L?V%v-<6npu;k&S&Fy2uaTbG|+QYo3*iY50DS^NDch478DvSd@^Sxfj^-p1qV zW&Ibx<`6=70DSQLRR}f`L+T;h=iUm%`S1*4fO5tAsR&B3Qq0LHi-eFbis%6J44B`G zhrJzY3eHp#<_rYuO($^3SRX76iHPlZcZSiOU?|odb^PpuMnE*yMrOaT+s}_YAI5t$ zECN$d(D`(i>`===1a7NCh*=yRP!0HU+G`vTc{L=JUdq6emP(&k8`czkn&NuNg&!}u z=_8XqvhYzO($eT>I(^K-hc<;?_axJMP=Q5DjTfZ)`D8y~50+aS&KENmLWCc(S7YG{ zU2jBue9l3`5i&?YIXBT++4%4Fo(x}&J!UQn&M{)*FNU?)1w*nMN#w_1ABtULgyJC8 zBGM2r$v!+sM4)|~#5fFiMNrar5DIjoi2aGhO^uHIxda0a7ZG-2md0a$&?9P14r?My ziMq}Wi-yrIia4yC_NuP3Ah{wCjR%2mttB^(aP&+kphIjBG5jaOS0s9T(qw*+hV=LZ z*$^^C)fDWLLwyhn2^S(s{KAFfX^m|;ZXUP;Yb-f|({9KW_yzPE34UycT!j>QuMY?f zV&JEl%aMXF%8IX*@+)6{72ylp2mSb>fv-k}rFf?8hCj`0!c*do!*irVBIeiSnOX2R%);)&IY4kgdn%K_#r{Ro?1bi03KUTH2yW^hpZ$_xa}*K# zKyO7k3AAYRUq&^0BN~0pirtC=X$cn#VSguT!`8)T;PEEvAiALO7)Z})2j7#(!g+b( zOk+fUk2n^Uq#mhcQQKf`x($b<9`ch5P)g76q~=DVSSwE6^bPiZ7CVVKM)h$DWL@W; z2Y{1I8p?88#_)OnAjWOU;db)JO|nu~t)55$(8c>dLS?~AHXn$I+ET@%}l`3i(POMMKo!Xxf1 z*m4kWX}eQwQzj-=3S~!(J8fA`a2-yeqwHyB9eAMyPdFC+C0ax;pdU=!NPunc@#^HY zB`#bW6%AhwK_^eh55TDUYt+l8h&uRVIJFh#X4tN(L$i+Gt%Wddae_bmM@!{x z4!H4X5pFaS9ZKBzDPY14PHPBB^3;EUNeQ-Yzs^7zq}(H9Y>+jf1irF3&dvLani59*-<}|BixK}=W{qvZO}xK| zh-A$Bi?B>F4G9JWg1_W_UD)qW1!+Gi0UzL2IS>#Wqp$4x3pn%~m+Bp_0XTzgWBo(@ zi1+aNl<)&(A$^Mj6|+xRx98)nbVf9bR{S{jbvxLN%R3k_?}D3ooS_6TL) zu*}}}I2|0ZA(Y(q%w&2~sA!K6LFu;MRv}{K*{LMu2KefV+`^ z)t(d}w-LN;OhCPnKyG_d0Ny5`7OQxTiRU%~q?CjCELE(llKjyWKM>#VO4j0YC|tW| zkR6~sukGgD1lVHY@oFg@(Ik0S0RlP}HbdKr-ekrWJg5WcJ^Yr;xFCQs>DVG`z}bek z*x4nefigZGODkw?sAtq(Op{4fg|}vio%$Aj-@lGzP{0p}v8bm**IRJMp@r(j5h^pFBweDAE<6sROyx8)4!eoc1qhlyZPjAH!OIaYq{|TUy-uQVHoiJk@T8tY% zJUHPZDYtwW0i3-Zr;=>jZQBF>5O1KKEw+1XY!XUQRqp00Ef_C}6F~MLe{S*c+Qs_( zjquD7Fl3!8^)sAza)YdZ4*TdyfCO%{=>n281o9Qwt74G!keSfWe+u~vnh~f6;yG|a z_GK4KVH5oTh(CeuCl&-(#77K+l*{ z2dD!$M;F?ulYa}q7#w?2Jt74Eg|x)$8nMkz7X% z$VPuL%t?_1{CPTpG{|!Vxj|nGA~0_*@JNZZHf6#n~;K3bXoXmpFG&l_PIxQQ< zJ6gu$AhI25e_XumlJXoJaIQcn7b;n4L*Z&{L_Wz^Ped0*Hul&JBsOf1-9VB=x8LAR zRWKc_Nzuf2(-smW7Ih-O7GFjYIY}o@7*s!uxKa$lj{8$`FpzU*uqJQ7?t0xCYUG$&rS2mhi-o zZBM`-*Fcy&22DVXm7UTv)i}P!f*d)F;X?%K!yJF4kYJn58~J-y%&#sfqYwg zZHWH^wm%^Z1N}VVY@wrGJw1`3yPT2vc=Y2K-Ho+(<1(0EK#ons$@?{LKzR!k@UKt` z${TQV9b52gQr`6PjR+{g;`tT)qG&N^%PF*7Yo*iJqo1(dp58$4@W)81S@nByMmts9 zjfz1~wRh90{`%7dTq(D{EE89j@oK1!VhqB`nD_dVSeIXKrCfe~9J;$4o(b%X_U=1K z?04&;e*sQMA{S&iSIkLv{uoO1uOCf_T`o9sX zz0f3k?rkTbV@oE*3RG#>GC^--zYK$gN<3&5jy`W%u1LC=I61(=;E3o!R{xM{D#)jxAo z=7$qACqcrAg7z0)p@!!%oJ9&egmi>uRvhPZug1m!5Xel=lwae0{zyCS@bDe?*ZdN1`JyY#;Py^;T*t@w0DD2UYF*@PcKx{b z9s|Ai)5t6=!_sOsDkpI)P7?%S+8%763ypfdrqkFIgoj;F#*aQrBVn(?;$B4iLan-8 zJQ%-Ys;PKDdn6)pG16ud!Ods)j!&6D|ZjEM@icZO4qA zH`hnjH(0{ik@b*`SJRy0=d)>!BPn_@3?K;2D`^OXf~EWtbST7&C6Hx2-+nTj3njj%yt$6^L6%(Q)M+imNP{4mXelhECWNKB_=hF}|TpjM0XkzM%24aMV7 z4qm6f?C(#$WPjw-C_z=BVBhXyk`JW~FiAQoa`K1k zY^S|Fbr;in98m--Agl>#K?LA*@g^Ko)lWCVxk_Foag|O-FfJZ1A@zo z-A50LsK!EfE}mQ7r+#fme-SD!cc?&*f<=Ty2^Vxj9rb_BrEr#`x7E3hg7AZ=6mAK8 z$O`NJfQ0nO{D&>!DnbSDP;EQn+`Jo+R4mv)(Va{v^0r>|WjtH64mVzR*G(mG(Tji( zfH~Xw+c@CHh`%g%W2cesaPb?AZU8>&#zO4pAy^4QZ=u`ya0sLT5k%6`6({u={SgTt z2mF{Zm(*fzSOTISIX95)mabbA!O9t+sdUg7S=_{&^rRrrVuz>OwimbLO(R;uNqjKn z7At-j)B?O3;zcBq{)pi7GTtKFyN%lWR46|rea*QDhE>@f(Qh`mZx(8+Mh0wKXvZ~> zB%v|wi`M1pr`)BbczWQwO~PrLXvzV9E_M!xsUwKX5)Pp~kvx+92p*QY3G_!?xZo)~ zj4(V1o#}+FGwd_w3$(1;y{K?E3>y+jm>#Ht^OVN5y2kV{Sl20zS)-Xi++#!!H2ZwI z!K}*Yf49+nbodH!oQe^NkA3qEAo~H`jw_kyPk=>8l#t@JV1zVz zy$RCfZ5k}$(wK};4I#A<@fa>cTPtu-i*2a+Cb9EiQRIh^DDxvfL{rxzR`)+>TLZwvTX5YYQdQ>nsY!I|t?yj=+ zR%#QlbDNk1nf>mZ?LhVW*njMzO|^sJ$qVzmJL*o1sBxG%+E{rSm_eJsHj1izsA^xO z=89D{lHfu#;D_79fa?uO(DRbm*_w8;-0_Em4S@7wM~|>CfNi5yT{T~bw-x5waAwVM zk#b8c<$@XqL?@1ZHB-zQFd`PzK$oV5_$BhKJX@#j_@RADTG7h6b`(A340<8*ix=2xCKgyM6K!!43v(o^xakq|H~vQ>tK1} zL;|6!ksY3YLg^|t8euKw9a@uzb8)ZHR;ASx{EInq%gZNaym&( zj>3o15yh5`>(za@2Fj`eQ_j|#kp;AdSpb#gw0Dzt71me>>RnCo9+<5Ia7@ih0^#o1 zLY3>Qts5>{D54T}Z&*4x+H@)uPHsB2P)*)~x-9Is)b>`&nfo{aurA5g0Vjx>Vl8&y z7$46mnoki(s;DpK;uPqK@Td|X?I?jbSh#qpUjRYDecqKC&PQMC$T>J~MtE9nRZtv) z&;Jw~CY!z@i9IelyOr8X5)i6MHf$!L7C~6*@vDHso7642Xwhs;oDPb{2#GmSEQ|6G z)uI8e^P^FfXtc48!YGh(z4{>ym%t&NUqoK=a;oiw&^6DP_Y)!xB^TjHtfOEVyFi6& z$0)OpP}Mlx*7~pNhenhrO)FFwbaXuTr$op~KpNy#@$Fj8sLQKL7Rbm%qrdy`3ZuD@IO!2J9t5ZBnx5Uzlbx`m1Edk=(X3avy> zzoFL3hA?+$@G`1>C2pTZ?fu!%rd$E%<~CC0b@vScwnJX7Sc=OP{~2pqTu?H#wBPF2 z9XIf;@M1)|?NRt$oUPxDP5qM5Wq$%qxJE4){ubLzs34IP#Dt8=0L}*?l0IfTWdqy; zIGmfGpoYQ9koLxlGF;pFZM00=j}q2kvVNF|9FHXUuWFFda96>3a|eDw!WaqUziL2= z;lDb9i=OAf0?1Coy)zF(#83Z_K(oU`-x3BCs3053nuQq;IGWmgQjDk9jXO`^<)OT7 z&ryU#2zUEtiRBWUUu|fS{z`FrXc4vYHDofL{dmSYN|;!2olvI!j(80iXW`AUm;LZE zEk{}0Urd|gp30n$WVD)xFZimcYXI`K6&#)E+u& zV#cT-9r@;9~12jjvv3 zTHm2y`l0=1Z0W$t>x)e=#bW$1_}}0>c2ZH!a~}IEF9J?FkNs^l1Q6|{{L;9?{X%5hd z$fVD@n~8#~HJO-Z^{4m3wkQY*p+=>e%K2-Lpn^AFfodM3oi{0y{_d}lru+JcaP&8j zg2N9$0IZzD)ucVW4Jle{FFwf@YLJRf^?*{2xQSBU{VDz0%@cDuUO?j0^s1CMJcMFCx`|n9r7Un52@1hs2t;0QQdM}*=TMpA&jP#< z1)16g~2lLex2J`7`xdC!A-n+TM; z4(S&4GL~@5gV&Jv@ub-Or!u#3A8f+?ry?Eq!SCS?fnIe~1*EN%Sxp zEdET>e~N|R*6qNB{w5XB-~9y=j=ijlm39PoleSV0P}9p7g0_M%%Tce=$PipSL}xNX zYvs>|P4F>n!u%3s**#)5BZag_%x7rB0;L#-Xgd7-!Us^|dQgpbE}2@?ujG9^sWhs5rNsn;9gIK_B z1iSN*-2h}1t$aqX8MLw&&*sHDl?k*0{Ujdfc2j~r5l{Ya(90zTz32wLi2KR}z4R|O zk{&|eVkA@@@!o{B?QT97Od~Vkp0nNjO7Zg@8p5B6A^I!Ggr$M#Mv+>79nvuYlj~YB zq!W!iZa5&yDy{DEePyv~jeVd#L@a=|zTh@c3&d1S7Rj8B7WBy3WNY_z%bPMf<$e7=KE zX4S?U?{1D|BGVogBGV22&i3=CNHB>isIG4B5%q9DNGtptH(rGgSK*d5csjiwhc9FkaqdJNwwDjH$(l=44nr!8xUrv!<3rm`z|?jRwg)CH zfQX6tZ{PX>unbS;jy$+BarD*YA+~SdSMNh2+=NZjr>bzk|MvbQ+{Zu%jv_ea0?ad} zKY2~upA75w7!eabWrG5*i>t>sNXFT=RQlBB(rED05T_(ty2EQ;5_Dn_LJ0yy!yejm zh=yj;16&$?4@}>M8nBG@V{H`FOI#B3YXRC=nBPLJCTJT%x3wd7Ou;U`LmK?fYwFE; zuKZ9b4#yHR+@BB?Vd4Bp>yMZ5}9``-Qkv=E=|ZU|gR zchBAjQkpv{4@)I7U>%ot<_a=cJAU8c$c`w^H|@mG6SXjRH|$fQ`-nO%AI7#Q++w(= zKZPyrwzKixeK3+NQM?oD?d*d7FDb*s`Y8yo#5x^U(D;-pO)-0e#q!7$GGENALK!26 z*%$hj^e4}Y2%XcZ<&nS9sTV|_1}{IFJC{fsed3YrQBSY!2wNb!WJk2A=#g(2PIYu= z2X*Hpb*BU7?IPJ7OaGVb5`#klv! ztU#Ql3SYcSX6}J>2W`okdJ2f0M|yyXKIl|?VjD9u;*R^lSp|wG1uTbi7M7NU_!Xc~ zgaaUsAtfQypp2(}59ujvz1=ee5e}z6Gz7H%&7iwKO6)Lsjtrrv z`=g|ulLD!Mi>26P^OCA7KtQH!nHuxgV<&`}8a`@XCnYtgX=Gnvo0_ z=JoU{g@Q&X)&nnWr{!4v5ptBs$~T}pBD(u+oKcQg5e;^;gj=TsnUW2i`}v!)fCx)i z$51OY$`3ubX!* zXFLdngmJhFVZD3!ePrvydo-wAtti!t-cji)y zNJpcXOga#eHAb^0`$_pE#abKIDV7dJu)_RbT90_47T_}L!zsobv#0X?a^z;0#T#?V7s;6ET;u>!VD z$ZH2q>G6Au9QBvOkd0lKKrj`aMTG0B(x#3m%$w0aU>kA(={OI>sMK69Z;Hn+ics!z z*bmWNm`MuE{YHR*Iy`_S))EJRV1uH!10#AX#metAbr8u{A^ymltxhYYjw*gSTjTd2 zM5c5X+O7S!!Me;>L&+6g8)QXvHdZ~Z6TxAf{d@F(q!^oc>=3FFi&b1q*~Qt9QL4;d z%AY5xiK_Y2^neX`+o*1f=43qy6eF$EaT!SRw@hh1{lz5#3!G~{m!FrTJaAQ01AUl( zRBf>=BA=&*Yk-&8(bDX8gxI8N7<}Atnu~<~>GOP!aH@FrPEaq#Teo3^g0upvvwNpHTMrO7u2JTRt9R8ax_?Y(ynIq5^*m|{H!}M2g_malgcZegcm7-N7caIt9~p9gy-jy5*#9l_=Cl1?M2X3tgH9eBA(ip;uFB^nucV-5A1_??4Z(Bq}U|*oLkouQRq* zC0-k~=C_(Se~mS{p%UCy+I;%9XV+Tl3R#6)e_K#|BlO>4ppmZGlN9g9#Pi$} z!fbxR`!OTxr3)MVg>|9<3jW)VO{qGo7O!%3MM}lsV3)AKnwU=VJH8 zSS)1dhc&{m-S=IPe;=J7Yo}e>2b?YcNK8~<*KAP0v@)8>w8cubChnq!zgb`Gpk*SK z8MiQ}9nLfvi z7cD*%;K%L}Gfd9*K!Cs13}vCF19Fjhf zA?()e#|%XWG{U|Rz8-oVlqGy%gy~b!iyYOOxQiYEqm$V*9g=&p{(xOr1?k`nVZntZ z0?H6peEeldj&maEr^efd&gu%nhG)mja~+HtMe5NJCKZ}bVdPYrkI;g*`S%b~a>a|A zqp@y3|B4qPuqZ=V^)5f1+mIPw@t$TySnZx-tDsY#(pT7V80ZWVDc9ivr*F9!Vq<6` zs88`8RgWWb@p=kKnEbz~dms3!sw>g|{!K37!nu(IqDH+yRA{h*0VM?NPtWx- z8Wocuk^8=DpL>(=$F}qSe14x_;M{Z0KKswwd#}Cr+H0-7HeWBo9Kw77#5i){CEGi4IfP~+g7ciHwp})ct z-O}%gj3Z6C)gwp+BUYBhV$#bPtIYj?$ZTfi(mf)|P8D*;@w)(6r z8%H=mrWRfq!6-kBT=|s_e!|(ZUHA#`xn+k89#ju4tmIewF}&C)^~E94g%%Lh)njJj zfLZrj%OXey*|cZPK++dwuS>M7JJN8%dgQMLk)WI1b=?XHGl`@4#R@S6Gw1tWn?LFG z`G}%6$4zV>E!@3V9D+Jd(2OrMD> zHuysBUi9c&dd$UHOs3IFw#&`J-nQse_%c}kgW)V$Pv%6f5b;@;2iE^%3Kqu8rMP$h z_2t$xxS*7@)d|j*ja156MwVE^4zBcRe`FyO;IymvQtTD^qOo3+G7jv$+2IIr5O@N7 zq9bV;5F%3$SRUmNals89{q`d!M9YPGA~=xv@+(3F`TkW7D)&2nC-O2FgOI0&MLFW_ zmn@tcIK=dDu`CN&+yP2z^Y+3)>Z)g@^y|aV3&&9^8*Aa|hBkkXMovBW7XElG8LsJw zTtvLJ2+oy!4VaaPki#Q9g-*oD<%s@#l}Y(1>n;b|U&`4_s_Y+SpuwUwmc}m$+if) zBYJ9YfT>lZR<>j(LL|+s@m0&AC>!Lhgu#lu_c!swUIhOvX_h2(@s}&kBT6QvN z>|m{5J2+lWGG0!q@$wdmv()-3WBB;byU_d<)q5C#Rus{%sVk%Ix51lgOIt-i!wGS7 z@2QNe?y>&5LzIdhIar{L7%%pwz1eYl zf$og1K4jI4`hc`kr8}y{numpBB-8qu2oQuK`}0fiqTB;sK_He#oK}mya7&3e2FqoY zSS7_4zgli>vWsQI=LL$zTT8U;1ag6H>xZjTU0T(RK)@z}qtR+6=i$`N9v=sW_P^i( z^E~1%?t#x?qfz;M?gnw$H~wdKiL1Tkkr{c! z9JW_{j_ehWT$ZJN1z)UpPz4!kw|F?$QftBfqSJ67KNOHHu`t3s`dSW}`>NoGd>dsv zBY^v~=2_hAO|k00fw3!yVJo#zT42K`Ugn&GfvK)gcf{jTe8CaSf~M|i08@8!<}K&< z%zY=E)9TDipY05LW_xshKuLP{`qluOq3dFjT9Db=D2 z+AHGbB%WAJ`&75B!3Osm>~O%D7Kc9JeW2g^t_3Z{0I%v~!9iHQOw%zJ&C)5zR2o=~ zHH3*2Z2()d5lA51hp%eW(uZOBG{F4kjJubRc(kuj0^h&3dwE#C^t zkW-EyDmjIyrY;xmS6l-r*Ua|LX8TZ&1 zQXS)LAL~j{p&{pMIF8u5(t2=j5=q1R%&Oxc_;T~KHBAshjql~STy>i4p|(DkFg&?3 z+JCT44H{)RE7-y0%OB$cIW0DlSZl=u6{>tjy%4dY~>VR{> zo|Ges@JOSf$E|y3uI|_W$}AZeOmadc!54EX$%)}fPN*a&^=qRg{n(n{X!@cMjVNt~ z=Kh6urMtSRmg=tY$?oEmxv|Cv9sq2<6>O)TGmwG)5yH)+DoNy@k2Uh-U zbzhCUC%VAL4s;7|+=kTGoFh&ts5OdpyAoH4(+#^%sXfBa^5yKCkPY!t>65Ak1NzPI zmv;OsFW64W=&3fk2K}F1)f13Tt6N<63{~}Nr7yLylj`PRgI1(l+Kz9j`oc3SA!Gnf zHNV)uHousmR_sfL4c1!C&*I;wx~A|l8F;sUZJ&(lls+Ok^cKDozP>emaCCpEaT}vM zuW?)4ivjAgS75EB$7T4OhUk`?o#jlpR)Q&JzR?vbQaRWEW{_(fEZ!auxyiv`UM3?) z`BsUf$*4Gf{=kT&+e0Jq3L{Kw{#WS@Mync4a5Kfn#h1$QNP0zS`EnIUpN0VUXAT#( zhu#@-`c_ugX2w!0^+R7zl%c=aG07d2%Ov(SX zyq~u7ev+H*|Kz@=-#P;S&gF2P{deyB*w2nhJb43341`Yd79H)T3FTUN|S z{M*rFIPDq)=NVZzx{Mte{ z=ZIY|B)|rEG9@HyaigsFQg7i;lL=-?0mdb4#=7-b%3Dj8iNUFP45N0oBoA2s%t$jws;2RpclhGt=yVm|W1fm<2(jJd zE9%giH|J29Ld3rNQ}3t@EjfLL(M(rOYF``m)y*k z^^x}tbw8<*J$#ityZwbLeRk&Ibh9%u*BAc|+~IQiTmI2v*;8c=a3FH6W$X+8u_*y{OG9EZ>giHDOZHg7KU6#4Xviw^18 zmLY8>VtaaY^jeATbFdh_McT+btQV8BLfp$z7@?0=<1tAn!oBR}j$e_Y5Mz>l+z3n& ziT`9pgp<{QFqD3;Vue82Z zp_r(~tpN4M@Y}?e)gr$F`x@4aT??5b*(#Ode`P$;3V{f^r$FO(p*U_tAIQa&7{rHo zr0A<~*PvkpyhSF0wy{Dq3?tczl?sW>^9??$Q9AS^`8!dDu--2BePRBiB!5=tLj|C; zAW#NDGLYg1pNF#lU5eIRG$e1asZaP*RYjXB4HI@t6>~(=E!5S2A68ZNbNJJw@q>hC zDzgWMXNtmpm~5Q$1lrV3gq#gNHGW?+`{2T*k;*jD)RQgdCX0$-%#N-1aQkEXw)-_O#_&JCQcmR0!f$HCZ>WkYI{$)YPc zUu{wzfMBOHHq474M@j%8whIXUkf&OAEKW&?%7%n~C(t|%qc*=2c`%ZQOyv}%++3g4+`DO!StNtOYL|_HF6DG0UNIQAI_Pj!LWB` zX`Viw!^|!>PTdjC+1E%^PAm+M-uEL?@uW42vR2!*;Jyh)TmPJXdASQC9|y~;R}ZS? z)sx)nyz6fHZ{mjJSM0bzKC!lgkQFNAhl3$$>&jJ#IV_}9g=`)c5>g@G91KZcH&caF z4Thwxo2o+Qr$WrcbYLjqS|PA-ZQ;6y>k+OexE$&BpEG$+-CU`MFSxtU3HO}y{^wr3 ze=frR%Y73J54e5Qa8HXHw$0nBfCd!rzaUN>E%u3I4)BcR{LBvWTm?{sJ54I~8YgJMp zH-Fp}_VN@T`M5JYn!}StvXm6up&RpSI~PwyG!uy2^DwZOl>u{p*2Jp*i5w&&F(VH? zLU2UwYN;(;oTGmwT0MQa^)>=iP7r%YVM8|1YdgmvKt+SJn-`;VUA483C@Pdyg;h_e z5}|ZNOV-tJ7(5^08wwJQcT9EMeszi;P|D4GpL=mY+nH4uUAoRHRC!lUU0C#4eYdu2 zevZ+dUK+l#G<>mPxxypyeq!eopHSyncOT%y19fTZTI3;}fzYS`468UeN4Vp1bL{r6 zM+nq*riaR-%bXR_1=k_eK7yoO+o?H6N4HL|u{^|Yt(?*LHg>9k#?KJ)K1m}``sI7B zWhR!k_t_x}s;%#y9fEdj-B}^x zf5kU=erMyB-vk|6Q!d3p=L4L?y@jTzvE=MgNQbs_!Eb`4M!!$H>jaA) zEH%i9T?#%X+wOMkx25fFu7LbZ95B&RT3+|#(HPe z7sGmk%E8xoM}Z?ex$a9f)=na~&M%NYbm^YD>*5)xJUn&N&l3*^4!2&^ZsiQIq4wf1F4U>5JI zB!8YQ!an92;BvVC|MTZmpt{tr4R`W4HGhVODHCxDRTf~jl0!`MA`MS;70YVCk!0bH zY|dV*Sgz#3DCTSsM08BWa>7c6Y+Uym{Vx3v@Nq{WfJYc}W7bCJr4CYAm5eVYBazj2 zGdV_9--jEIvWFv8k3@!Ve!PQ_Gj<}x;^>p4KONd{B(c<0Z6?i|(1&6{< zf(TXOQmD$pM5(4cBGy=Mw3NYcbX&e@z=Z(-=iF;edB`fYT_dBO7b(G!-|p@Hxi^5< zA>3RX*LFHgfAgl5UhJFt^)H#}KU0v7H?{>G`lY?amM@%rW#Uc7y1OQlZas3fG%^!1 zqyWpP9Pz3V5Xc)bQ+}Emt>{SDuWG_{{R`fE+nwPB=Hb30efudp6!s@VfkbJR)^aZ& z%@Fe%9n_;z1j4?@XKKy2^FiL>_D9ZXBayb_Hi=7lRTimD%?#yW=G|{S%E}ELqkIYF zz{lV+gM=X(+Rv&bE9#)B@wQPH5@%@du9Q5Eca~h2XbrKM!Y}3!(gA2i(cUAGJ3*#B z+|h)vfUAQSXe-AN=yK~0xF6$LeEe%ouenq%ts$o*e^ip=O{D4s9*WRc;-VgzTAfqd zc?bo~^76{+3hTz9#1E6Wub3r-%Mt!-idBXwJ#~)d+RjREIVtSqE<2%jDB*2VYE{29 zp~n#}I45b^P*S&@^m)Z;DS#&pB@H^*;8o>YZY?e#JCMU8$dOKj^N{0Q#6X0F6mkER z^dQ}JEIc)_h%Wq{lYHg|S_3Ur3BU_Q<_1(R2g7NN4T)gf!>>;>equ+q6T63|hHnQ~c_?p79lX_Y$g8BF|0y9+LB1zfi zASFL~W-4+rhd7SUPKYO#W_niY;&grP>gKuD^pric z+Z%|z&I=}N^Y#FSL)yoNNNc(nxnB|*3G$Iiwgffww2?$JR`Np4C}Zj6F*zo1wUdnd{mW7~1bC9M^1khXE_G)GJI431wYnU-iR5e`UWsMeZU z#gkT$>xk-HZRcE1OUd=x&I)f!^$onGfxayzGYJTMsp<^{c1!hC1+Q8kZa?uDAP$@2 zASp=gt8$oiIGDW>lftqmS<6*N%I=Gl-H+cXyiP$|?#56K=Dzrm$m+);RgXs+e$m_R z3Nts|N4*nqzfivn^~OA;-*1-P%_fD?oJcgx=g10d#r%c(liMb)U6X7|HL0weL6vFL z)Ou|7V`kOkbyFf$O-xjf3+s|9ko|yY?}wXMn9VBJhG!!U2UtawV^;PMwQ^Xm2ZerR z3H_4OzRU+Co>}%JbKcYC_$tnqCayYQ?$77g#%BYQIcTx?AqE?xwfQ+RFv}h>7v=UH z?rjHi{zU?w&wn{m_JsSTqOvUQt`awB`k7{!@}=rwv-4YRYR-HK12FgV?)`54iHN>C zK02j;H;bPz%UZ-y7y3?@`B7cSEAcU?flfz?pNN#TSTk>uV()uO8RA5$b6Sz9-QR*P zylLX0i7$YY3ylsZ%W}cc$kIThIxAA#RMc>w{-4a^hs=gwnEGzj*ha&X42~ayb?$yA zyhFn;jH<_RuA^y9jSLCn8EFcazNoMGX+Us=CoC&$IK!Dt?u34(qX? zG^3BGjR>p4*+kj~mp~)dxyr3O?XO6pii&BJX_7lt4Ew&-E47Qe+usEXf5AbNZvEj% z@$P8z%@k1%yAg?go2SSF>-n{=5Wb`A5%9csZZ0$06X8+4B{R~6!+Ao6ky(8I#Nwvb zrBltS`ywS-EK}&NiLXSe1K+29yk=HC?i7yaA=iNxVwF8%oN{Z;FG