|
Hmm
Sounds as if you want to do some very very low level tracking, and monitoring at OS Level. Also sounds like heavy stuff, like intercepting at OS Level, and surrepticiously maintaining the Intercept link. Matt Pietreck and 'SoftIce' would be where I would start my research on this.
It also occurs to me that it is one of those things one is not supposed to do, meaning that:-
1: Your Compiler/OS combination has an alternative method to achieve your ultimate goal.
2: If you are successful, and rely on what you develop this way, Whatever resulting code you may arrive at, is NOT guaranteed to work at any configuration other than your own. So, if you ship your code, you have a built in time bomb, because the chances are that at some time in future, on some of your clients machine, things will work out ever so slightly different, and come to grief.
I Strongly suggest that you re-design your code in such a way so that the question you ask does not arrise. DOS ran away with all of us, because it was so easy to modify and extend. Everybody had a go at any aspect they did not like. Win32 is different. It has a larger mission, the OS provides documented services, which allow code to run on diverse platforms, often from Win95 to Vista.
In Short, Tinkering inside the OS Calls is not the way to develop code!
Regards
Bram van Kampen
|
|
|
|
|
Hi Bram,
Bram van Kampen wrote: re-design your code in such a way so that the question you ask does not arrise.
This is kind of tough. I'm working to extend Crypto++'s secure allocator. At this point, the Crypto++ allocator zeros memory. But the memory can be paged out. In my minds eye, the next step is a secure heap with no paging. The secure heap is easy enough through AWE extensions.
However, verifying correctness is more difficult. I've begun assembling tools. WinDbg or cdb (SoftICE is no longer around), a raw disk editor, etc.
Bram van Kampen wrote: ... tinkering inside the OS Calls is not the way to develop code!
Pietrek does it all the time to develop an understanding of undocumented behavior
Jeff
|
|
|
|
|
That's Fine, Yo go that way, that's your project! Just do not be surprised if it refuses to run on any other machine other than your own!
I now understand where you come from. You are trying to implement a security system and to match it with the WindowsOS security system. The Bottom Line is: No Chance. Known Criminals in Northern Ireland have escaped prosecution, because the assembled forces of MI5, and GCHQ had to give up after five years of trying to decript MS encripted disks.
Microsoft is unlikely to give up it's market advantage it got in the european market by employing their proprietary encription mechanism.
Microsoft in Europe uses a Swiss encription algoritm, Invented in Switzerland, and which is much stronger than the American version but not subject to American export controls. (It did not Orriginate in the USA).
You appear to be intend on designing some encription taking place at base level. (i.e. Page Saving) Unfortunately, you'll have to write your own Encription/Decription, and it appears that you will have to write your own Device Managers to Implement the code. This is a Very Hard One to do, even at just your own computer! Unless you proceed very very Carefully. e.g. After you install the Encription/Decription handler, Unless it is able to establish which file is stored encripted, you may loose your entire disk!!
Believe me, I've been there. After you make it work at your own computer, you now want to makle it run on your customers'computers. This typically comprises of a mottly crew ranging from ancient Win95 Machines, NT, Win2000, etc, each updated to their service packs,
This was my Long Answer.
My Short Answer is:
Merry XMas, I Wish you Luck.
Regards
Bram van Kampen
|
|
|
|
|
Hi ALL,
I am using property page in my project. In Property page class i used pagePAth object of CStringArray class. I store paths in pagePath object. Now I want to retreive paths by using pagePAth object in CMyView class which is derived from CView class. I am unable to acces pahePAth object in CMyView class. Please send me solution if u have.
Thanks in Advance
am
hi
|
|
|
|
|
You may:
(1) declare it public .
(2) make a public accessor method to it.
(3) change is scope (relocate it and make it available to both classes).
(4) ...
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.
|
|
|
|
|
Does CMyView own (i.e., bring up) the property sheet? If so, make pagePAth a member of CMyView . Then when you construct the property sheet, pass it a pointer to pagePAth .
"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
|
|
|
|
|
See the problem an other way: Your CStringArray in the wrong scope (class).
It belongs to a place where both can see it. A common parent or prefer a settings object.
Greetings from Germany
|
|
|
|
|
Atul23 wrote: I am unable to acces pahePAth object in CMyView class.
What Exactly happens! How do you try to Access it. As a Member Variable?, or how else;
What do you get? a Compiler Error or garbage Data?
regards
Bram van Kampen
|
|
|
|
|
Hi, I'm trying to start using VC++2005 instead of an VC++6.0.
I'm trying to write a small application where I added some files (.cpp and .h) from VC++ 6.0 applications and reuse them!
When I tried to compile I've got all this errors and warnings about using new functions types (secured ones...).
But conversation of typs is what I cant deal with. E.g.: in my code line
"Column.pszText=bfields[i].label;", 'Column' is LV_COLUMN and 'label' is char*.
At first error about conversion(error C2440: '=' : cannot convert from 'char *' to 'LPWSTR') I added '(LPWSTR)': "Column.pszText=(LPWSTR)bfields[i].label;" it compiled ok but at run time this didn't put label I provided but some squares! Why? When I place brake_point on this line I noticed this is not working right. Instead of placing a text 'Id' it placed several odd looking squares.
I think the conversion is bad, how to fix this?
Thanks
|
|
|
|
|
Your problem arises because VC++6.0 default builds were ANSI while VC++2005 ones are UNICODE. You can fix it either:
(1) Changing the project properties to make an ANSI build (i.e. modifying the character set property). This way you'll obtain a buld close to the old VC++6 one.
(2) Modifying you code to be UNICODE (or, better, generic text mapping) compliant. Maybe a major effort, maybe it is worthy. You must be careful though. For instance you cannot simply cast character arrays, as you've done in the following sample:
josip cagalj wrote: Column.pszText=(LPWSTR)bfields[i].label;
It is a bad mistake.
You can either dinamically convert ANSI strings to UNICODE ones (see, for instance [^]) or simply replace ANSI data with UNICODE counterpart or, better, generic ones (i.e. TCHAR instead of char, T_("foo") instead of "foo" and so on.. ).
Hope that helps
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.
|
|
|
|
|
You were right, I set Character set to 'Use Multi-Byte Character Set' at project properties, project defaults.
It compiled fine and everything works ok.
Next thing I tried is to connect to mysql database. With VC++6 all i needed is to add 'libmysql.lib' (under Object\library modules) and specified lib path (under Additional library path). In VC2005 I can find where to place lib path(under 'Additional Library Directories' in project properties in 'Linker->General'), but where to insert 'libmysql.lib'?
P.S.
I also incude "mysql.h":
#include "d:/msdev/mysql/mysql.h"<br />
<code />
|
|
|
|
|
josip cagalj wrote: but where to insert 'libmysql.lib'
Into (Project Properties) Linker->Command Line, Additional Options text box.
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.
|
|
|
|
|
Warnings tell me to: "To disable deprecation, use _CRT_SECURE_NO_WARNINGS." How can I use this? (#define or #using...)
Thanks!
|
|
|
|
|
Yes, you may do:
#define _CRT_SECURE_NO_WARNINGS
or use the compiler /D _CRT_SECURE_NO_WARNINGS option.
Anyway have a look at http://msdn2.microsoft.com/en-us/library/8ef0s5kh(VS.80).aspx[^]
before doing so.
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.
|
|
|
|
|
When I:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
I'm getting warning:
warning C4005: '_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES' : macro redefinition.
The previous definition is in crtdefs.h(431)!
Big thanks for your help!
|
|
|
|
|
I have a very strange problem.
I have an MFC application that open a modal CDialog and using opengl to render to it using timer
I initialize opengl and timer in OnInitDialog();
it look something like this
<br />
void initComponent(){<br />
<br />
int desktopWidth = GetSystemMetrics(0);<br />
int desktopHeight = GetSystemMetrics(1);<br />
SetWindowPos(NULL,0,0,desktopWidth,desktopHeight,SWP_NOZORDER);<br />
<br />
initOpenGL();<br />
<br />
SetTimer(1,15,NULL);<br />
<br />
} <br />
My application have no problem so far on NVIDIA and ATI hardware.
but on intel(integrated chipset) , it wont show the dialog unless I pressed "Alt" key(and then the program work fine).
I tried calling SetFocus , set property to foreground windows , move
initialize opengl into OnCreate but it still the same on intel hardware.
My Dialog is
1.a popup modal dialog.
2.has no border.
3.initialize OpenGL and Timer in OnInitDialog.
4.draw image in timer.
5.work fine on NVIDIA and ATI hardware (test on 8 PC)
6.Had to press "Alt" key for dialog to show up on intel hardware.(test on 3 pc)
Thank in advance.
|
|
|
|
|
Why VC6 set default struct member alignment's value is 8? I think 4 is better. Because now windows is 32bit.
|
|
|
|
|
All Microsoft Compilers have set default alignment to 8 for as long as anyone can remember. Changing it now could break oodles of older source code beside it has nothing much to do with 32bit Windows 8 bytes is 8 bytes it used to be 4 words now it's 2 and in the 64bit world only 1. Just our luck that 8 byte alignment works nicely for all 3 then isn't it.
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
Use #pragma pack and set it to whatever suites you best.
All my Header files start with #pragma pack(1).
I allign my data for Data Files Manually on an 1,2, 4 or 8 byte boundary (as suites me) and hey presto, where's the problem. Take care though, NOT to use ints and longs, use BYTE,WORD,DWORD and QWORD for structures saved on file. This combined with a byte packing boundary, will future proof your data against any compiler allignment changes.
For structures not saved on file, and not exchanged between processes, allignment issues are immaterial, as long as they are agreed between the processes. The Microsoft Default of 8 bytes probably gives the fastest raw acces. The question is: Is it worth the bother. The important reflection is that: At least it is something we can quite easily choose ourselves to suit our purposes.
Regards,
Bram van Kampen
|
|
|
|
|
Hi All,
I am having an application where a structure will be directly written into HDD in binary format at a particular time interval.
But if PC gets turned off due to some abnormal problems, during file write, after the next restart the entire file has only 0's. it is getting corrupted.
How can i avoid this problem (apart from taking backup and restore in case of corruption).
Any help would be appreciated.
Thanks.
Selva
|
|
|
|
|
If the file is very big one way could be dividing the data to be written in small packets, opening file, saving a packet, closing file and repeating.
It will be slower, but closing the file sometimes during the process should make to save the already sent content, you will lose only the packet you are sending in the moment the computer crashes.
BTW It is just a guess, never tried it.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
“The First Rule of Program Optimization: Don't do it. The Second Rule of Program Optimization (for experts only!): Don't do it yet.” - Michael A. Jackson
|
|
|
|
|
An alternative to Nelek's suggestion of Open, Write, Close is to call a Flush after every write.
There always is a window of opportunity for disk files to get trashed. Even using the suggestions you've received, there is a chance that the machine will power down before the disk cache is written to disk. The only way to make that window smaller is to use something like the commit function, which is a pretty low level C function. It instructs the OS to issue the actual write commands to the disk. The one case you can't guard against is someone powering off a machine while the actual physical write is in progress, but from what little you said, it sounds flush should give you what you need.
Judy
|
|
|
|
|
SelvaKr wrote: after the next restart the entire file has only 0's. it is getting corrupted.
I sense that you are after a way of writing mission critical data in an guaranteed safe way, so that integrity is maintained, even during a powerfailure halfway tru the write. I have done quite a bit of research on this,and came to the following design conclusions.-
1. It is Not possible to guarantee a successfull write under above circumstances
2. It is possible as Second Best, to maintain a consistent state. This means that under such circumstances, the transaction is either completed in full, or you are returned to the state prevailing before the transaction commenced. This is not a guaranteed write, but, atleast, you have not the corruption of a partially completed transaction.
My system requires two identical file sets, marked Primary and Alternate.
There is also a single third file, the State file, which holds only One Byte. This Byte assumes one of the following Values:-
STATE_NORMAL, STATE_MOD_PRIMARY, STATE_MOD_ALTERNATE.
When we start, Both Primary ad Alternate Sets are Identical.
Step 1:
The Write Operation commences by opening the State File, and Writing STATE_MOD_PRIMARY to it, after which it is closed. This indicates that the Primary Set is now entering into a potentially unstable State, but the Alternate holds a consistent backup.
Step 2:
Carry Out All your Writes to the Primary Set. When the Write is Completed, Close All Files.
Step 3:
Open the State File, and Write STATE_MOD_ALTERNATE to it, after which it is closed. This indicates that the Alternate Set is now entering into a potentially unstable State, but the Primary Set holds the New Dataset.
Step 4:
Delete All Alternate Files, and replace them with copies of the Primary Set.
Step 5:
Open the State File, and Write STATE_MOD_NORMAL to it, after which it is closed. This indicates that the Data Set is Once again in a Stable state.
When your Excecutable starts, it must investigate the FileTime's of the State File, the Primary Set, and the Alternate Set. A Prima Facia Consistent state is indicated by FileTime(Primary)<filetime(alternate)><filetime(state) but:="" see="" below,="" this="" relation="" state="" may="" not="" hold="" if="" you="" breakdown="" again="" during="" recovery.<br="" mode="hold">
Another Consistency test is that the State File contains STATE_MOD_NORMAL
If any of this fails, you can figure out from the above description, where things went wrong, and what todo. The two Possibilities here are RollBack: Copy the Alternate to the Primary, or, Complete: Copy the Primary to the Alternate.
I have developped a custom API to implement the above.
It works with:
HFILESET OpenFileSetForWrite(DWORD Flags,int NrOfFiles, LPCSTR[] FileNames);
ERRCODE WriteFileSetFile(LPCSTR Buf,int size,int count,HFILESET hfs,int FileIndex,int* WrSize);
ERRCODE CloseFileSet(HFILESET hfs);
Another aspect is that I included a 64 byte code in the State File to help the App recover to where things went wrong. If at all posible the user is brought to the starting screen of the aborted transaction.
Note.: Powerfailures and Hardware failures(broken tracks in boards etc) are notoriously hard to simulate. It is essentially 'Out of Spec Behaviour. What attracted me to your question was that you suggest to have a hardware way of testing your code. Could you suggest to me how to test this. I used a method involving a USB Device which was fired via a (semi)random timer, triggered by the WriteFileSet() funtion, to cut the Power to the PC. What did you use to test your software.
Regards,
Bram van Kampen
|
|
|
|
|
Hello all,
I have a code which is compiling in multibyte character set but giving some errors in unicode character set like:
1) error C2664: 'CStdioFile::Open' : cannot convert parameter 1 from 'char[260]' to 'LPCTSTR'.
2) error C2664: 'GetTempPathW' : cannot convert parameter 2 from 'char [260]' to 'LPWSTR'
3) error C2664: 'CStdioFile::Open' : cannot convert parameter 1 from 'char [260]' to 'LPCTSTR'
4) error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [3]' to 'const wchar_t *'
can anybody please help me in this....
Thanks in advance
|
|
|
|
|
I think ther first three ones can be resolved by type-converting.
(4) should use _T("") macro or L prefix.
|
|
|
|
|