Silviu-Marius Ardelean's blog

a software engineer's web log

Finally, I got Windows 10

Finally, I got the Windows 10 for my laptop… Even if this task is trivial, it was a surprisingly experience this time. But let me tell you the story of Windows 10 installation on my Samsung RC 710 laptop.

Back in August I tweeted “That’s all I have within #Windows10 X64 Ent setup on Samsung RC710 with SSD”. By that, I meant that my setup process was stuck in the boot phase using the installation of this Windows brand new version. That was reproduced within Windows 8.1 x64 upgrade tentative or with clean Windows 10 installation.
I tried few Windows 10 .ISOs and a friend’s DVD but no chance. The setup has started and stuck within few seconds.

win10_setup_stockes

Because the laptop got some hardware upgrades from the original configuration, I tried to restore to the initial configuration but nothing new. Reading this article where is specifying “For 64-bit installations, a small number of older PCs may be blocked from installation because they do not support CMPXCHG16b, PrefetchW, and LAHF/SAHF“, I tried an x86 .ISO but I got the same situation. Also, I tried some BIOS changes without any improvements.

Getting online contact with Microsoft it offered me no new things. I got only typical support trivial answers.

During the time on the same laptop I was running fine Win XP, Win 7 and Win 8.1 OSs without any such bad experiences. To me it was clear that Windows 10 has some backward compatibilities issues.

So, I took it on my own googling for my situation. Reading different forums I realized this is a common issue for Samsung old laptops and it is generated by the WiFi card.

The solution in my case was buying a brand new Atheros AR5B22 WiFi card and replacing the old WiFi card with that.

If you’re in a similarly situation and you you’re looking for instructions how to disassemble your laptop here it is a brief presentation.

By the way, you’re doing on your own risk. If you’re not confident, please contact a specialist.


samsung_laptop_to_win10_3samsung_laptop_to_win10_4samsung_laptop_to_win10_6samsung_laptop_to_win10_5upgrading_windows_on_samsung_laptop

With this new WiFi card plugged-in, the upgrade from Window 8.1 x64 to Windows 10 x64 became a trivial task.

It would be nice if Microsoft would get more in count such behaviors and would improve the Windows 10’s backward compatibility, especially because the old computers are included within their OS target.

Update 02.06.2016: Samsung admits they are lame: “Don’t Install Windows 10 Because We Suck At Making Drivers”. Sad…

You can find additional information here. That’s why, most probably I will never buy a Samsung phone or any other gadget made by them, anymore.

Share

SubclassWindow() method issues in projects base on MFC Feature Pack

The Problem
Trying to paint a background image into client area of a MDI application build in VC++ 6.0 to VC++ 2005 IDE it’s not a difficult task.
In case you need, you can find easily good references. For instance, there are two references from Microsoft (KB129471 and KB103786) and one I prefer: a FAQ wrote by a friend of mine.

Unfortunately things are changing radically in case you’re following the same steps in a Visual C++ IDE that has MFC Feature Pack support. If you’re building from the scratch a VC++ 2008/VC++ 2010 a MDI project that has MFC Feature Pack support and you’re trying to apply sub-classing steps, you will have a big surprise in the moment you’re starting your application in debug mode. Effectively your application will crash in the moment you are trying to call SubclassWindow() in CMainFrame::OnCreate().

Problem details
Starting with MFC Feature Pack CMDIFrameWndEx is the new CMainFrame’s parent class instead of CMDIFrameWnd and the problem acts inside of Attach() method:

and the issue appears in the second ASSERT() macro

because CWnd::FromHandlePermanent(HWND hWnd) looks up into a permanent handle map and in returns existing CWnd pointer.

CHandleMap is the wrapper that implements the mapping mechanism between the pointers of MFC wrapped classes and the Windows object handles. Internally, this class has to dictionaries (m_permanentMap and m_temporaryMap) implemented as CMapPtrToPtr, m_nHandles – the number of handles, m_nOffset – the offset of handles in the object and it has a m_pClass pointer of CRuntimeClass (a run time class associated with all MFC classes).
In case you’re interest in more details, you can find more information here.

We have a pointer to a CHandleMap instance that is assigned with the returned pointer of a handle map returned by afxMapHWND(). The returned pointer pWnd it’s assigned with the result returned by pMap->LookupPermanent(hWnd). LookupPermanet() effectively search into a the permanent hash map for exiting HANDLEs and in our case it find it.

where

If the item having nHash key was found into m_pHashTable then the condition if (pAssoc->key == key) is TRUE because the attribute m_hWndMDIClient of CMDIFrameWnd is used yet.
So, effectively what LookupPermanent() has found in m_permanentMap map is m_hWndMDIClient. And because pMap->SetPermanent(m_hWnd = hWndNew, this) is one of the next call into Attach() method those ASSERTs are a must.
Even if those ASSERT() calls from Attach() are available only in debug mode (because of ASSERT() macro behavior) a release build would not save the situation. Soon or later you’ll get conflicts and the application will crash.

Trying to find where this has happened is not so complicated as long as we take in consider our CMainFrame class it’s derived from CMDIFrameWndEx a class that extends CMDIFrameWnd. If we are looking into CMDIFrameWndEx class implementation (AfxMDIClientAreaWnd.cpp) we will see that into this class SubclassWindow() method it’s called jet:

Subclassing a CWnd derived instance that has already a mapped HWND item is an error and these ASSERTs try to avoid this from development moment. Having two different CWnd-derived objects with the same HWND is not possible – the only exception is CDC instances that have 2 HWNDs (m_hDC and m_hAttribDC).
Related to my issue, according to Steve Horne from Microsoft, “anything that uses the MFC Feature Pack will be using CMDIFrameWndEx which is a very different beast. It has this feature built it as you’ve found out”.
The worst part is that “If you were able to subclass the Ex client area, you’d probably end up breaking a lot of the FluentUI features.”
The VS 2008 / VS 2010 wizard generates and use a lot of Feature Pack FluendUI items.

A bad solution
An approach might be trying to adapt sub-classing idea directly into CMainFrame class. So, the steps might be:

  • No CMDIClientWnd instance is needed (as in existing tutorials). So no more SubclassWindow() call in CMainFrame::OnCreate().
  • Handle WM_ERASEBKGND, WM_SIZE and WM_PAINT on CMainFrame.
  • CWnd::FromHandle() acquires a pointer to an MFC object pointer from CHandleMap via afxMapHWND().

    At the very first time everything looked nice. But unfortunately I have to admit Steve Horne’s observations. In different situations (most on resizing or moving messages) some of the FluentUI items were not correctly painted (some Ribbon items painting issues – different cases).

    So, a better solution is needed.

    A good but not perfect solution
    In my research, for projects base on MFC Feature Pack, there is no perfect solution for this issue. I mean something similarly with the good solutions that I mentioned in the beginning of this article but acts fine until the first IDE that use MFC Feature Pack.
    As we have seen on top trying to subclass a window with an already mapped is not a good idea.
    The solution is based on Joseph M. Newcomery’s idea, a well-known book writer and Microsoft Visual C++ MVP. Joe proposes “temporary” remapping only for the case we need – in my case painting actions. For the rest of the action the mapping process inside of framework continues in the classic way. It’s a “gross and ugly” solution but until having a better solution from Microsoft or others I consider it fine for my needs.

  • First step is to define a class CMDIClientWnd derived from CWnd and add WM_PAINT and WM_ERASEBKGND handle methods.
  • Catch the WM_PAINT message in CMainFrame via PreTranslateMessage() before the message is dispatched for execution and calling our redraw method.
  • Here is the RedrawClientArea() public method.

    So we create locally an instance of CMDIClientWnd and we attach it internally to ChandleMap::m_permanetMap via Attach(), not before detaching m_wndClientArea (an CMDIClientAreaWnd instance, attribute in CMDIFrameWndEx and as we have seen before it subclass the CMDIFrameWndEx in CMDIFrameWndEx::OnCreateClient()).

    The idea is that our CMDIClientWnd instance temporary replace m_wndClientArea instance of CMDIClientAreaWnd right before effective WM_PAINT message is dispatched via PreTranslateMessage().

  • Include your new class header (ex. MDIClientWnd.h) in MainFrm.cpp and call RedrawClientArea() in CMainFrame::OnSize().
  • If the child frames window is not tabbed style (when all client area is hidden) and the client area is still visible than we have to call RedrawClientArea() method from WM_MOVE and WM_SIZE handler of CChildFrame and we have to include MainFrm.h into ChildFrame.cpp.
  • Additionally, in order to make sure the painting message is received by main frame at application’s starting moment and your image is correctly painted from the beginning, please call pMainFrame->Invalidate() after pMainFrame->UpdateWindow() in InitInstance() method of your application class. Otherwise, if your application it’s starting with no opened document (for instance new document), your picture will appear only in the moment a WM_PAINT message is generated in CMainFrame (for instance when you resize your application, select the menu, etc).
  • A disadvantage of this approach is that the interest message (WM_PAINT) is not handled inside the class of m_wndClientArea, but the good point is that the rest of the messages are left at the correct class of the framework and will work correctly.
    Demo application (1606)

    Share

    Simple Pictures Unifier 1.1 application is up!

    At the beginning of this year I have launched an application that helps you to organize the pictures of your important moments. The application helps you specially if you have photos from different sources (different cameras of friends) and you want to have a fluent images story.

    From the moment I have launched the first release until now I made up to 12GB pictures (3200+ pictures of 10 MB) and honestly I never found time in order to organize the pictures. Always I said that I will complete my application and finally I found time to implement export by date time folders and so on.

    Simple Pictures Unifier 1.1 allows merging and exporting pictures in one folder or in date time folders. The application comes with a better user friendly experience and few internal improvements.
    The Start Export button launched a new wizard dialog that allows the selection of the preferred export method.

    Export Wizard dialog

    If the user chooses the default export to date time folders the Export wizard window shows a list with detected time folders.

    Selecting Finish button the pictures merging is realized and the files are copied to the destination folders. If the user wants to abort the export process it can just press Stop button or close the application with now damages.

    Feel free to add comments, suggestions or bugs reports. Any constructive feedback is sincerely appreciated.

    Share

    Flexible changes for product version properties – Visual C++ binaries

    Manually editing of binary files version in the resource editor of Visual Studio IDE is not a viable solution. If we have dozens of projects in our solution, then for each kit building we should need manual resources file edit. Otherwise, we can use a special tool that does this thing for us.
    Unfortunately this approach is not the most flexible and could fail.

    For our flexible binaries properties changes and in order to avoid manual edit for each rebuild we can create and include a header file (version.h) that contains some constants of product version and file version of our project (.rc files).

    We have to include only these constants into this file (version.h):

    Then, for each .rc file wherever we have FileVersion and ProductVersion we have to use this constants.
    When we will build a new kit, we have to change only these constants and then to start the kit building process. Everything is fine until we add new controls in our projects resource files. Then, because of Visual Studio IDE automation we can get an unlikely surprise: the FileVersion and the ProductVersion properties could be reset to 1.0.0.0.

    In order to avoid this issue and edit the version only in a single place I propose the following workaround:

  • Create a version.h header file that have to contain these constants only (as on top). I should recommend to create it into the root solution in order of being easy included in all the projects.
  • Include this file in the project you need to use.
  • Use a text editor (ex. notepad.exe) and include next code section at the end of .rc2 resource file of your project (res\your_project.rc2) – this section contains the include version.h file section, too.
  • Edit “040904e4” block code with same data as if we should edit in a resources editor and use the version.h‘s file defined constants. As you can see in my example, for the FileVersion and ProductVersion properties I use my version.h constants. These properties will not be edited anymore.
  • Delete “// Version” section from default resource file your_project.rc (including comments – recommended).
  • Insert next lines into your_project.rc file after “3 TEXTINCLUDE BEGIN” and before “#define _AFX_NO_SPLITTER_RESOURCES\r\n“:
  • That code block looks like this:

    Don’t forget to edit .rc2 file name with the right file name of your project.

  • In your_project.rc file the section “// Generated from the TEXTINCLUDE 3 resource.” have to contain only next declaration:
  • The rest of the section’s lines have to be deleted.

  • We save both resources files: your_project.rc and your_project.rc2.
  • Rebuild the project and check the new generated binary properties. In the FileVersion we will have the major version (in my case 4.0.0.0) and in ProductVersion we have the current build version (4.3.2.198).
  • Observations
    Once you apply these steps, the product version properties will not possible from the Visual Studio IDE resource editor, anymore (only as edit text file or an external text editor). If we didn’t define something special in our project’s String Table we will see only IDS_ABOUTBOX.

    Demo application - AutoProductVersion (985)

    Share

    Simple Pictures Unifier – first version

    Have you just returned from vacation and you have a lot of pictures? You just downloaded your taken pictures and you got your friends pictures, too? Then, probably, the pictures are scattered, with a random order in your computer.
    Would you like seeing pictures from all sources in order of events happening?
    If so, try to sort your photos using Simple Pictures Unifier tool! 🙂

    Simple Pictures Unifier application

    Please, feel free to add comments, suggestions or bugs reports to this application.
    Any constructive feedback is sincerely appreciated. Thanks you!

    Share

    File size fast detection

    Many times in our job, we need to work with files and need to know file properties.
    One of the most important properties is file size. Of course, there are a lot of API that allows finding this property, but most of them needs additional file operations: open file, find file size and close file.

    A direct and fast way in order to detect the file size without these operations means the CRT run-time library’s function _tstat64() and stuff.

    In the header file or on .cpp file please add next macros definitions:

    Then, write next function:

    If you’re using WinAPI there is an even faster way in order to get file size.

    Finally, call these functions wherever you need.

    Share

    Release space on a Windows partition – SpaceMonger

    Few time ago I observed that my laptop’s first partition (48 GB size) free space reduced to 4 GB.
    There are a lot of file managers application (Windows Explorer, Total Commander, Far Manager, etc). All of them provide folder and file lists, but have not intuitive display of most important detail: the size.
    Of course, there are some known paths that store not useful data (see bottom folders list) and with each file manager you can delete major not useful data. But, you can miss some old huge file (some forgotten video files, etc).

    Fortunately there is a tool witch display folders and files size graphically called SpaceMonger. I used it and now my laptop free space is approximately 20 GB. 🙂 At the end of this process I applied the same story on my old workstation, too.
    Using this visual tool is easy to observer big files, folders and is easy to clean Windows temporary files, Windows updates install files, easy to observe hibernate and virtual memory files (if you have enough RAM memory you can disable this feature), etc.
    Unfortunately SpaceMonger project development was stopped. Fortunately the free version 1.4 runs fine on Windows 7, even if it was written for Windows 9x OSs.
    On my workstation (Windows XP SP3 station with 1792 MB RAM) I observed some troubles when I selected a huge folder in order to delete. SpaceMonger application crushed few times. I recommend individual file delete actions.

    If you decide to follow this tutorial for your station is your responsibility. I am not responsible for any damage of your operating system or if you’re loosing your personal data. Do it only if you know what you do. You need a user with administrator rights.
    You can download and unzip last freeware SpaceMonger application, 1.4.0 version from:
    SpaceMonger v1.4.0 -> Free Software tab -> SpaceMonger v1.4.0 -> Download it! button.

    Start running SpaceMonger application. Press Open button, select partition driver and wait partition scanning process. Your scanning results should look like this:

    You can see how much free space you have, and all big files and folders. With this tool you can find forgotten huge files, too.
    On each Windows partition there are two huge files that can be deleted in some circumstances: hiberfil.sys and pagefile.sys.

    Disable hibernate feature – hiberfil.sys
    Normally this file is located at C:\hiberfil.sys and file size can vary from 250MB to over 2GB. Trying to delete it it’s not a good idea if you don’t understand what means this file.
    This file is used by Windows hibernate. This feature is used instead of shutting down when we need a faster Windows start. Windows takes a snapshot of current operation Windows state, copy everything on this file and turns off most of your hardware. To wake up from hibernation you normally move the mouse or hit the spacebar on the keyboard.
    If you are using Windows 7 or Windows Vista, you can easy disable hibernate feature in command prompt window typing powercfg -h off on and press Enter.
    If you are sure that you don’t need this feature you can disable it in Windows XP following next steps:
    – Go to Control Panel (Start -> Control Panel) and select Power Options feature.
    – Click the Hibernate tab, uncheck the ‘Enable hibernate support‘ check box, and then click Apply.
    – You need to restart your computer and hiberfil.sys should be automatically deleted.
    Later, if you need hibernation feature, you need to go back to Hibernate tab from Power Options and check Enable hibernate support.

    Disable virtual memory – pagefile.sys
    This file is used by Windows virtual memory extension. Virtual memory is allowing your computer’s operating system pretend that you have more RAM than you actually do and run the Windows application smoother.
    Usually this file size is 1.5 times than your actual physical memory size and might consume a huge disk space of your computer hard drive space.
    Be carefully if you want to delete disable virtual memory feature. You need to have enough RAM memory.
    In order disable virtual memory follow next steps:
    – Go to Control Panel and run System.
    – Click on Advanced tab and click the Settings button on Performance.
    – Click Advanced button and Virtual Memory window appears. Select “No paging file” item and click the Set button if you want to remove pagefile.sys.
    – In order to apply these changes you need to restart Windows.

    Delete individual files
    Using SpaceMonger application you can easy delete temporary file, updates installer files and other huge files. But, BE CARFEFULL WHAT YOU DELETE. Don’t delete Windows files, Program Files files, or other important files.
    This application provides zoom in/zoom out features in order to have a complete overview of what you intend to delete.
    Some paths that could be deleted are:

  • \Windows\Temp
  • \Documents and Settings\user_name\Local Settings\Temp
  • \Documents and Settings\user_name\Application Data\Microsoft\Office\Recent
  • \Documents and Settings\user_name\Local Settings\Temporary Internet Files
  • \WINNT\TEMP
  • If you are using Windows Vista or Windows 7 and you are tempted to remove \Windows\Winsxs, forget this idea. The Winsxs folder, stores multiple copies of dll’s in order to let multiple applications run in Windows without any compatibility problem. These are actually, different versions of the same files which are being stored; as different programs may require different versions. Winsxs is Win 7 and Vista’s native assembly cache. Libraries which are being by multiple applications are stored there. So, don’t delete WinSxS folder!

    Because many application creates own temporary files, I should recommend to you the running of another nice freeware tool, CCleaner. It’s easy to clean all other temporary data and registry, too.
    You can use SpaceMonger tool on other non-system partition, too.

    Share