Author Archives: Nicolas Riousset

How to determine the operating system at runtime ?

Ever wanted to determine the operating system at runtime ? That’s possible using the GetVersionEx() Microsoft API function.

Microsoft gives an example of how to use this function a t the address : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getting_the_system_version.asp.

Below is a copy of the sample function :

#include <windows.h>
#include <stdio.h>
#define BUFSIZE 80
#define SM_SERVERR2            89
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
int main()
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
BOOL bOsVersionInfoEx;
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
{
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
return FALSE;
}
switch (osvi.dwPlatformId)
{
// Test for the Windows NT product family.
case VER_PLATFORM_WIN32_NT:
// Test for the specific product.
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
{
if( osvi.wProductType == VER_NT_WORKSTATION )
printf ("Microsoft Windows Vista ");
else printf ("Windows Server \"Longhorn\" " );
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
{
// Use GetProcAddress to avoid load issues on Windows 2000
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle("kernel32.dll"),
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
if( GetSystemMetrics(SM_SERVERR2) )
printf( "Microsoft Windows Server 2003 \"R2\" ");
else if( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
printf( "Microsoft Windows XP Professional x64 Edition ");
}
else printf ("Microsoft Windows Server 2003, ");
}
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
printf ("Microsoft Windows XP ");
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
printf ("Microsoft Windows 2000 ");
if ( osvi.dwMajorVersion <= 4 )
printf ("Microsoft Windows NT ");
// Test for specific product on Windows NT 4.0 SP6 and later.
if( bOsVersionInfoEx )
{
// Test for the workstation type.
if ( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
{
if( osvi.dwMajorVersion == 4 )
printf ( "Workstation 4.0 " );
else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
printf ( "Home Edition " );
else printf ( "Professional " );
}
// Test for the server type.
else if ( osvi.wProductType == VER_NT_SERVER ||
osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
{
if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
{
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
printf ( "Datacenter Edition for Itanium-based Systems" );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
printf ( "Enterprise Edition for Itanium-based Systems" );
}
else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
printf ( "Datacenter x64 Edition " );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
printf ( "Enterprise x64 Edition " );
else printf( "Standard x64 Edition " );
}
else
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
printf ( "Datacenter Edition " );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
printf ( "Enterprise Edition " );
else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
printf ( "Web Edition " );
else printf ( "Standard Edition " );
}
}
else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
printf ( "Datacenter Server " );
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
printf ( "Advanced Server " );
else printf ( "Server " );
}
else  // Windows NT 4.0
{
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
printf ("Server 4.0, Enterprise Edition " );
else printf ( "Server 4.0 " );
}
}
}
// Test for specific product on Windows NT 4.0 SP5 and earlier
else
{
HKEY hKey;
char szProductType[BUFSIZE];
DWORD dwBufLen=BUFSIZE;
LONG lRet;
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
0, KEY_QUERY_VALUE, &hKey );
if( lRet != ERROR_SUCCESS )
return FALSE;
lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL,
(LPBYTE) szProductType, &dwBufLen);
RegCloseKey( hKey );
if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) )
return FALSE;
if ( lstrcmpi( "WINNT", szProductType) == 0 )
printf( "Workstation " );
if ( lstrcmpi( "LANMANNT", szProductType) == 0 )
printf( "Server " );
if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
printf( "Advanced Server " );
printf( "%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
}
// Display service pack (if any) and build number.
if( osvi.dwMajorVersion == 4 &&
lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
{
HKEY hKey;
LONG lRet;
// Test for SP6 versus SP6a.
lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
0, KEY_QUERY_VALUE, &hKey );
if( lRet == ERROR_SUCCESS )
printf( "Service Pack 6a (Build %d)\n",
osvi.dwBuildNumber & 0xFFFF );
else // Windows NT 4.0 prior to SP6a
{
printf( "%s (Build %d)\n",
osvi.szCSDVersion,
osvi.dwBuildNumber & 0xFFFF);
}
RegCloseKey( hKey );
}
else // not Windows NT 4.0
{
printf( "%s (Build %d)\n",
osvi.szCSDVersion,
osvi.dwBuildNumber & 0xFFFF);
}
break;
// Test for the Windows Me/98/95.
case VER_PLATFORM_WIN32_WINDOWS:
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
{
printf ("Microsoft Windows 95 ");
if (osvi.szCSDVersion[1]=='C' || osvi.szCSDVersion[1]=='B')
printf("OSR2 " );
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
{
printf ("Microsoft Windows 98 ");
if ( osvi.szCSDVersion[1]=='A' || osvi.szCSDVersion[1]=='B')
printf("SE " );
}
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
{
printf ("Microsoft Windows Millennium Edition\n");
}
break;
case VER_PLATFORM_WIN32s:
printf ("Microsoft Win32s\n");
break;
}
return TRUE;
}

Quelques notes sur la Presentation de Visual Studio 2005 et SQL Server 2005

Lundi dernier, j’ai assisté à une présentation des versions 2005 de Visual Studio et SQL Server réalisée par le GUVSM (Groupe d’Usagers Visual Studio a Montreal) . Les lignes ci-dessous présentent quelques unes des nouveautés de l’un et de l’autre.

Les contrôles base de données en ASP.NET peuvent être alimentés directement par une abject source, et pas seulement par une BD.
ASP. NET 2.0 : une API de gestion des usagers est livrée en standard. Elle remplace les librairies développées par chacun en fournissant les bonnes méthodes de gestion des usagers (cryptage des données,…). C ‘est la Member Ship API. Les utilisateurs sont stockés dans une base SQL server, Active Directory, ou autre… La gestion des roles est définie. Mise en place de “Login controls” personnalisables.
Stockage des profils utilisateurs standardisé. Smart Client Technologies permettent d’accéder à des
ressources sur le poste client (web Cam,…)
Click Once permet simplement la mise à jour des applications chez les clients (mises à jour automatique).
En 2004, 15% des développements échouent, 51% ont des problèmes (surcoût, retards,..), 34% sont des réussites. Visual Studio. Team system vise à favoriser la communication entre les membres de l’équipe afin d’améliorer le suivi des projets et les taux de réussite. Visual Source Safi est maintenu, mais on assiste à l’apparition de Team Foundation Server, qui s’appuie sur SQL Server. Ce nouvel outil est dimensionable sur WAN contrairement à Source Sa fe. 3-tiers ASP. NET web service.
Intérêt de TFS par rapport à subversion ou CVS : intégration dans Visual Studio.
Visual Studio 2005 définit précisément le rôle de testeur. Outils de collecte des résultats de test,…

SQL Server 2005 (dernière version précédente : SQL serve 2000).
Analyseur de requête et manager sont regroupés et intégrés dans le manager.
Requêtes récursives autorisées Support natif du XML, XQUERY (XML queries)  autorisées.
Support natif pour les services Web HTTP end point object
Les procédures stockées peuvent être codées en C# ou VB.NET.
Report Builder permet à l’administrateur de concevoir ses propres rapports sans passer par Visual Studio. (Info-SSBK dans SQL Server 2000).

Microsoft Logparser and Windows 2000 Server issue

Microsoft Logparser allows you to analyze log files in a generic SQL way. You can analyze your own log files, and even binary log files. For the latter, you need to provide a com object implementing an interface so that the Logparser can read your binary log file.

However, it looks like there is a compatibility issue with Windows 2000 (I’m running the service pack 4). When declaring TIMESTAMP fields or integer fileds, and initializing the variant object in the GetValue method with the V_I8 or V_DATE values, Logparser gives a “Error retrieving field: Bad variable type”.

Using the same version of Logparser (2.2.10) and the same COM DLL on a XP or a 2003 Server machine, everything works fine…

Any clue for a solution ?