|
Hi All,
I'm currently working on determining the location of variables. I can find globals and constants in .data and .rdata.
I'm looking for a better way to determine if a variable is located on the stack. Currently I am using inline assembly to pull it out of the ETHREAD structure (intel/nt specific). I'd like to find an API to determine the Top/Bottom of the stack. Does anything come to mind? I did not see it in VirtualQuery[Ex]().
Thanks,
Jeff
void main()
{
int i;
....
}
PBYTE pStackTop = NULL;
PBYTE pStackBottom = NULL;
__asm
{
push eax
mov eax,fs:[18h]
mov eax,dword ptr [eax+4h]
mov pStackTop, eax
pop eax
}
pStackBottom = pStackTop - pNTHeader->OptionalHeader.SizeOfStackReserve;
if( pStackBottom < pAddress && pAddress <= pStackTop )
{
return "stack";
}
|
|
|
|
|
Im feeling generous again today! So I modified your function. I am using an undocumented technique here! Its a hack!
BOOL InsideStackHack(LPVOID p)
{
PVOID pStackTop = NULL;
PVOID pStackBottom = NULL;
__asm
{
push eax
push ebx
mov ebx,fs:[18h]
mov eax,dword ptr [ebx+4h]
mov pStackTop, eax
mov eax,dword ptr [ebx+0xe0c]
mov pStackBottom, eax
pop eax
pop ebx
}
return (pStackBottom < p && p <= pStackTop);
}
Perhaps you would rather use my second creation, this one is not quite as hacktastic.
BOOL InsideStackNoHack(LPVOID p)
{
PNT_TIB lTeb = (PNT_TIB)NtCurrentTeb();
PVOID pStackTop = lTeb->StackBase;
MEMORY_BASIC_INFORMATION MemoryBasicInformation;
VirtualQueryEx(GetCurrentProcess(),p,&MemoryBasicInformation, sizeof MemoryBasicInformation);
PVOID pStackBottom = MemoryBasicInformation.AllocationBase;
return (pStackBottom < p && p <= pStackTop);
}
Good Luck,
-David Delaune
|
|
|
|
|
Hi David,
I stumbled across NtCurrentTeb() in WinNT.h after the post. According to the header, I know it works for _M_IX86 and _M_AMD64. Do you know about _M_X64 and _M_IA64?
Jeff
|
|
|
|
|
Hi,
I would like to display a variable list of users in a simple text control. How can I display multiple text lines with "..." at the end of the last line (if the client area is too small for the whole text)?
I tried a CStatic with m_users.ModifyStyle(0, SS_ENDELLIPSIS) , but unfortunately this sets the control to show a single line.
Thanks
/Moak
modified on Friday, March 14, 2008 9:54 AM
|
|
|
|
|
won't it be annoying the user seeing the ellipsis at each line? won't it be looking clean if you add scroll bars?
|
|
|
|
|
Maybe I wasn't clear... the output should look like this:
-------------------
|user1 user2 user3|
|user4 user5 user6|
|user7 |
-------------------
and if the text becomes longer than what would fit into the client area:
-------------------
|user1 user2 user3|
|user4 user5 user6|
|user7 user8... |
-------------------
|
|
|
|
|
Is using either WS_VSCROLL or ES_AUTOVSCROLL not possible?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Could be an alternative... right now I wonder if this would be possible at all, if such a control exists?
Some background: My user list is already inside a resizeable dialog, basically it fills up an empty space. When I designed this dialog I thought it would look nice and clean to have no scrollbars and instead let ellipsis indicate that there are more users to display. If the user is interested to see more he can resize the dialog.
|
|
|
|
|
Moak wrote: If the user is interested to see more he can resize the dialog.
You can still do this, just let the scroll bar(s) indicate more users. When the dialog is resized and the edit control grows, the scroll bar(s) will disappear.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I have not tried this to prove it works but I would try painting it myself using GDI+ DrawString, StringFormat and StringTrimming[^] just to see if it works.
led mike
|
|
|
|
|
|
hi to all
Why HRESULT function is not accept in windows vista in these function in this function can run only Windows XP/NT .suppose when i change that function Windows vista what i can do ..?
in this function contains winerror.h
*****THANKS N ADVANCE****
Mathen.K
(I WILL TRY MY LEVEL BEST )
|
|
|
|
|
rowdy_vc++ wrote: what i can do ..?
Post an understandable question.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
rowdy_vc++ wrote: (I WILL TRY MY LEVEL BEST )
Is that your level best to describe your problem? You really really need a career change. Please consider it.
Nobody can give you wiser advice than yourself. - Cicero
.·´¯`·->Rajesh<-·´¯`·.
Codeproject.com: Visual C++ MVP
|
|
|
|
|
When I don't have classes I do this to export my entry points:
//########################
//C++
extern "C" __declspec(dllexport) int __stdcall SumUp_unmgdCPP(int a, int b, int* c)
{
c[0]=4; c[1]=3; c[2]=2; c[3]=1;
//########################
//C#
[DllImport("NameOfDLL", CallingConvention = CallingConvention.StdCall)]
public static extern int SumUp_unmgdCPP(int a, int b, int[] f);
public int SumUp(int a, int b, ref int[] f)
{
return SumUp_unmgdCPP(a, b, f);
How do you do it in a C++ dll-project with classes? I did this:
class FMS
{
public:
extern "C" __declspec(dllexport) int __stdcall SumUp_unmgdCPP(int a, int b, int* c);
private:
float m_WheelSpeed; // 1
}
It complains about the string "C" above being part of the declaration above. I don't think this is the way you do it when you have classes. Just paste the equivalent of what I'm doing in at the top in a dll-project with no classes but now instead in a C++ dll-project with classes and I will be very thankful.
/Lars
|
|
|
|
|
See here.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hi,
I could not get the link file path using IContext. I hope if I could read the property of that file I can get it.
Because In this articalhttp://www.codeproject.com/KB/shell/shellextguide5.aspx[^]">The Complete Idiot's Guide to Writing Shell Extensions - Part V, you set the link file path in a static control. I just want to get using InvokeCommand() or using any technique but with right click on my menu item not property item of file.
|
|
|
|
|
Hi, Im a MFC bigginer and neeed help to understand the crash which is caused by my program. I have created a Dialog i MFC and in the method OnInitDialog, I create a class which it creates a function in a thread and there is a loop in the method which sends the values to dialog via a interface. When I try to update the dialog by UpdateData(FALSE)the application crashes.
Please help me out of this problem
Thanks in advance.
M.H
BOOL CThreadDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
Thread1 *pThread = new Thread1(this);
return TRUE; // return TRUE unless you set the focus to a control
}
void CThreadDlg::setValueAlt1(int inValue1, int invalue2)
{
m_Value1.Format("%.3d", inValue1);
UpdateData(FALSE);
}
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
ISetValue * pISetValue = (ISetValue *)lpParam;
int a=44;
int b = 45;
for (int i=40; i<100; i++)
{
pISetValue->setValueAlt1(i, b );
Sleep(10);
}
return 0;
}
Thread1::Thread1(ISetValue *pISetValue)
{
DWORD dwThreadId;
HANDLE hThread;
LPVOID param = pISetValue;
m_pISetValue = pISetValue;
//pISetValue->setValueAlt1(44, 99);
//return;
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
param, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
}
|
|
|
|
|
You can't access the user interface from another thread than the main thread. What you need to do instead is send a message to your window with some specific information.
|
|
|
|
|
Please, can somebody show me how I can do that?
Thanks
M.H
|
|
|
|
|
merh wrote: Please, can somebody show me how I can do that?
Sure. Joseph M. Newcomer can: Threads and Processes Article Series[^]
Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all. Douglas Adams, "Dirk Gently's Holistic Detective Agency"
|
|
|
|
|
Try this:
the thread function:
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
CWnd * pDlg = (pDlg*)lpParam;
int a = 44;
int b = 45;
for (int i=40; i<100; i++)
{
pDlg->PostMessage(WMU_SETVALUE1, (WPARAM)i,(LPARAM)b);
Sleep(10);
}
return 0;
}
in the dialog.h file
#define WMU_SETVALUE1 (WM_USER+1)
in the message map add following line:
ON_MESSAGE(WMU_SETVALUE1,OnSetValue1)
And add following function:
LRESULT CSurveyUpdateDlg::OnSetValue1(WPARAM wParam, LPARAM lParam)
{
setValueAlt1((int)wParam, (int)lParam);
}
|
|
|
|
|
First of all thanks a lot.
It dosent work. I have the following interface
you mentioned that I could use pDlg->PostMessage(WMU_SETVALUE1, (WPARAM)i,(LPARAM)b);
where is comming pDlg? I have got error at CWnd * pDlg = (pDlg*)lpParam; and pDlg->PostMessage(WMU_SETVALUE1, (WPARAM)i,(LPARAM)b);
I have copied all files maybe you can see my problem better
Thanks
M.h
// ThreadDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Thread.h"
#include "ThreadDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifndef GLOGAL
#define GLOBAL
int Globalvariable;
#endif
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CThreadDlg dialog
CThreadDlg::CThreadDlg(CWnd* pParent /*=NULL*/)
: CDialog(CThreadDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CThreadDlg)
m_Value1 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CThreadDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CThreadDlg)
DDX_Text(pDX, IDC_VALUE1, m_Value1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CThreadDlg, CDialog)
//{{AFX_MSG_MAP(CThreadDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WMU_SETVALUE1,OnSetValue1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CThreadDlg message handlers
BOOL CThreadDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
Thread1 *pThread = new Thread1(this);
return TRUE; // return TRUE unless you set the focus to a control
}
LRESULT CSurveyUpdateDlg::OnSetValue1(WPARAM wParam, LPARAM lParam)
{ setValueAlt1((int)wParam, (int)lParam);
}
void CThreadDlg::setValueAlt1(int inValue1, int invalue2)
{
m_Value1.Format("%.3d", inValue1);
UpdateData(FALSE);
}
void CThreadDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CThreadDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
void CThreadDlg::setValueAlt1(int inValue1, int invalue2)
{
CThreadDlg::PostMessage(WMU_SETVALUE1, (WPARAM)inValue1,(LPARAM)invalue2);
/*m_Value1.Format("%.3d", inValue1);
UpdateData(FALSE);*/
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CThreadDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
ThreadDlg.h
// ThreadDlg.h : header file
//
#if !defined(AFX_THREADDLG_H__5BBFDBD6_3EF8_4FD2_8DAD_0C3E22DD797B__INCLUDED_)
#define AFX_THREADDLG_H__5BBFDBD6_3EF8_4FD2_8DAD_0C3E22DD797B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ISetValue.h"
#include "Thread1.h"
#define WMU_SETVALUE1 (WM_USER+1)
/////////////////////////////////////////////////////////////////////////////
// CThreadDlg dialog
class CThreadDlg : public CDialog, ISetValue
{
// Construction
public:
CThreadDlg(CWnd* pParent = NULL); // standard constructor
void setValueAlt1(int inValue1, int invalue2);
void setValueAlt2(int inValue1, int invalue2);
afx_msg void OnTimer(UINT nIDEvent);
CTime tmeSet;
HANDLE hEvent1 ;
// Dialog Data
//{{AFX_DATA(CThreadDlg)
enum { IDD = IDD_THREAD_DIALOG };
CString m_Value1;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CThreadDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CThreadDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnSetValue1(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_THREADDLG_H__5BBFDBD6_3EF8_4FD2_8DAD_0C3E22DD797B__INCLUDED_)
IsetValue.h
#ifndef _test_
#define _test_
//#include <afx.h>
class ISetValue {
public:
//Backend sends the value to GUI
virtual void setValueAlt1(int value1, int value2) = 0; // set value
};
#endif
//////////////////////////////////////////////////
//
// CPaApp.cpp: implementation of the CPaApp class.
//
//
#include "stdafx.h"
#include "Thread1.h"
#include <stdio.h>
//#include "CPaPort.h"
//////////////////////////////////////////////////////////////////////
// Other Member Functions
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <conio.h>
static int TestNum = 0;
int PaAppTestNum = 0;
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
CWnd * pDlg = (pDlg*)lpParam;
int a=44;
int b = 45;
for (int i=40; i<100; i++)
{
pDlg->PostMessage(WMU_SETVALUE1, (WPARAM)i,(LPARAM)b);
Sleep(10);
}
return 0;
}
Thread1.CPP
// set port address
Thread1::Thread1(CDialog *pISetValue)
{
DWORD dwThreadId;
HANDLE hThread;
LPVOID param = pISetValue;
m_pISetValue = pISetValue;
//pISetValue->setValueAlt1(44, 99);
//return;
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
param, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
}
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ISetValue.h"
Thread.h
class Thread1
{
protected:
public:
//Thread1(ISetValue *pISetValue);
Thread1(CDialog *pISetValue);
virtual ~Thread1(){};
private:
//ISetValue * m_pISetValue;
//ISetValue *pISetValue;
ISetValue* m_pISetValue;
ISetValue *pISetValue;
};
|
|
|
|
|
You can see I didn't test this ...
That should have been:
CWnd * pDlg = (CWnd*)lpParam;
If that doesn't work, I'll test it myself!
|
|
|
|
|
Hi Thanks,
It still dosent work. I get the following error
'CSurveyUpdateDlg' : is not a class or namespace name
'WMU_SETVALUE1' : undeclared identifier
If you have a email adress I can send you my workspace which you can test it easier. For your information I have VC++ 6.0
Thanks
M.H
|
|
|
|
|