1 /* @(#) $Id: file_op.c,v 1.32 2009/06/24 18:53:08 dcid Exp $ */
3 /* Copyright (C) 2009 Trend Micro Inc.
6 * This program is a free software; you can redistribute it
7 * and/or modify it under the terms of the GNU General Public
8 * License (version 3) as published by the FSF - Free Software
13 /* Functions to handle operation with files
20 /* Vista product information. */
22 #ifndef PRODUCT_UNLICENSED
23 #define PRODUCT_UNLICENSED 0xABCDABCD
24 #define PRODUCT_UNLICENSED_C "Product Unlicensed "
27 #ifndef PRODUCT_BUSINESS
28 #define PRODUCT_BUSINESS 0x00000006
29 #define PRODUCT_BUSINESS_C "Business Edition "
32 #ifndef PRODUCT_BUSINESS_N
33 #define PRODUCT_BUSINESS_N 0x00000010
34 #define PRODUCT_BUSINESS_N_C "Business Edition "
37 #ifndef PRODUCT_CLUSTER_SERVER
38 #define PRODUCT_CLUSTER_SERVER 0x00000012
39 #define PRODUCT_CLUSTER_SERVER_C "Cluster Server Edition "
42 #ifndef PRODUCT_DATACENTER_SERVER
43 #define PRODUCT_DATACENTER_SERVER 0x00000008
44 #define PRODUCT_DATACENTER_SERVER_C "Datacenter Edition (full) "
47 #ifndef PRODUCT_DATACENTER_SERVER_CORE
48 #define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C
49 #define PRODUCT_DATACENTER_SERVER_CORE_C "Datacenter Edition (core) "
52 #ifndef PRODUCT_DATACENTER_SERVER_CORE_V
53 #define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027
54 #define PRODUCT_DATACENTER_SERVER_CORE_V_C "Datacenter Edition (core) "
57 #ifndef PRODUCT_DATACENTER_SERVER_V
58 #define PRODUCT_DATACENTER_SERVER_V 0x00000025
59 #define PRODUCT_DATACENTER_SERVER_V_C "Datacenter Edition (full) "
62 #ifndef PRODUCT_ENTERPRISE
63 #define PRODUCT_ENTERPRISE 0x00000004
64 #define PRODUCT_ENTERPRISE_C "Enterprise Edition "
67 #ifndef PRODUCT_ENTERPRISE_N
68 #define PRODUCT_ENTERPRISE_N 0x0000001B
69 #define PRODUCT_ENTERPRISE_N_C "Enterprise Edition "
72 #ifndef PRODUCT_ENTERPRISE_SERVER
73 #define PRODUCT_ENTERPRISE_SERVER 0x0000000A
74 #define PRODUCT_ENTERPRISE_SERVER_C "Enterprise Edition (full) "
77 #ifndef PRODUCT_ENTERPRISE_SERVER_CORE
78 #define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E
79 #define PRODUCT_ENTERPRISE_SERVER_CORE_C "Enterprise Edition (core) "
82 #ifndef PRODUCT_ENTERPRISE_SERVER_CORE_V
83 #define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029
84 #define PRODUCT_ENTERPRISE_SERVER_CORE_V_C "Enterprise Edition (core) "
87 #ifndef PRODUCT_ENTERPRISE_SERVER_IA64
88 #define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
89 #define PRODUCT_ENTERPRISE_SERVER_IA64_C "Enterprise Edition for Itanium-based Systems "
92 #ifndef PRODUCT_ENTERPRISE_SERVER_V
93 #define PRODUCT_ENTERPRISE_SERVER_V 0x00000026
94 #define PRODUCT_ENTERPRISE_SERVER_V_C "Enterprise Edition (full) "
97 #ifndef PRODUCT_HOME_BASIC
98 #define PRODUCT_HOME_BASIC 0x00000002
99 #define PRODUCT_HOME_BASIC_C "Home Basic Edition "
102 #ifndef PRODUCT_HOME_BASIC_N
103 #define PRODUCT_HOME_BASIC_N 0x00000005
104 #define PRODUCT_HOME_BASIC_N_C "Home Basic Edition "
107 #ifndef PRODUCT_HOME_PREMIUM
108 #define PRODUCT_HOME_PREMIUM 0x00000003
109 #define PRODUCT_HOME_PREMIUM_C "Home Premium Edition "
112 #ifndef PRODUCT_HOME_PREMIUM_N
113 #define PRODUCT_HOME_PREMIUM_N 0x0000001A
114 #define PRODUCT_HOME_PREMIUM_N_C "Home Premium Edition "
117 #ifndef PRODUCT_HOME_SERVER
118 #define PRODUCT_HOME_SERVER 0x00000013
119 #define PRODUCT_HOME_SERVER_C "Home Server Edition "
122 #ifndef PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT
123 #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E
124 #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT_C "Essential Business Server Management Server "
127 #ifndef PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING
128 #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020
129 #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING_C "Essential Business Server Messaging Server "
132 #ifndef PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY
133 #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F
134 #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY_C "Essential Business Server Security Server "
137 #ifndef PRODUCT_SERVER_FOR_SMALLBUSINESS
138 #define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018
139 #define PRODUCT_SERVER_FOR_SMALLBUSINESS_C "Small Business Edition "
142 #ifndef PRODUCT_SMALLBUSINESS_SERVER
143 #define PRODUCT_SMALLBUSINESS_SERVER 0x00000009
144 #define PRODUCT_SMALLBUSINESS_SERVER_C "Small Business Server "
147 #ifndef PRODUCT_SMALLBUSINESS_SERVER_PREMIUM
148 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019
149 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_C "Small Business Server Premium Edition "
152 #ifndef PRODUCT_STANDARD_SERVER
153 #define PRODUCT_STANDARD_SERVER 0x00000007
154 #define PRODUCT_STANDARD_SERVER_C "Standard Edition "
157 #ifndef PRODUCT_STANDARD_SERVER_CORE
158 #define PRODUCT_STANDARD_SERVER_CORE 0x0000000D
159 #define PRODUCT_STANDARD_SERVER_CORE_C "Standard Edition (core) "
162 #ifndef PRODUCT_STANDARD_SERVER_CORE_V
163 #define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028
164 #define PRODUCT_STANDARD_SERVER_CORE_V_C "Standard Edition "
167 #ifndef PRODUCT_STANDARD_SERVER_V
168 #define PRODUCT_STANDARD_SERVER_V 0x00000024
169 #define PRODUCT_STANDARD_SERVER_V_C "Standard Edition "
172 #ifndef PRODUCT_STARTER
173 #define PRODUCT_STARTER 0x0000000B
174 #define PRODUCT_STARTER_C "Starter Edition "
177 #ifndef PRODUCT_STORAGE_ENTERPRISE_SERVER
178 #define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017
179 #define PRODUCT_STORAGE_ENTERPRISE_SERVER_C "Storage Server Enterprise Edition "
182 #ifndef PRODUCT_STORAGE_EXPRESS_SERVER
183 #define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014
184 #define PRODUCT_STORAGE_EXPRESS_SERVER_C "Storage Server Express Edition "
187 #ifndef PRODUCT_STORAGE_STANDARD_SERVER
188 #define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015
189 #define PRODUCT_STORAGE_STANDARD_SERVER_C "Storage Server Standard Edition "
192 #ifndef PRODUCT_STORAGE_WORKGROUP_SERVER
193 #define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016
194 #define PRODUCT_STORAGE_WORKGROUP_SERVER_C "Storage Server Workgroup Edition "
197 #ifndef PRODUCT_ULTIMATE
198 #define PRODUCT_ULTIMATE 0x00000001
199 #define PRODUCT_ULTIMATE_C "Ultimate Edition "
202 #ifndef PRODUCT_ULTIMATE_N
203 #define PRODUCT_ULTIMATE_N 0x0000001C
204 #define PRODUCT_ULTIMATE_N_C "Ultimate Edition "
207 #ifndef PRODUCT_WEB_SERVER
208 #define PRODUCT_WEB_SERVER 0x00000011
209 #define PRODUCT_WEB_SERVER_C "Web Server Edition "
212 #ifndef PRODUCT_WEB_SERVER_CORE
213 #define PRODUCT_WEB_SERVER_CORE 0x0000001D
214 #define PRODUCT_WEB_SERVER_CORE_C "Web Server Edition "
220 /* Sets the name of the starting program */
221 void OS_SetName(char *name)
228 int File_DateofChange(char *file)
230 struct stat file_status;
232 if(stat(file, &file_status) < 0)
235 return (file_status.st_mtime);
238 int IsDir(char *file)
240 struct stat file_status;
241 if(stat(file,&file_status) < 0)
243 if(S_ISDIR(file_status.st_mode))
249 int CreatePID(char *name, int pid)
256 snprintf(file,255,"%s/%s-%d.pid",OS_PIDFILE,name,pid);
260 snprintf(file,255,"%s%s/%s-%d.pid",DEFAULTDIR,
261 OS_PIDFILE,name,pid);
264 fp = fopen(file,"a");
268 fprintf(fp,"%d\n",pid);
275 int DeletePID(char *name)
281 snprintf(file,255,"%s/%s-%d.pid",OS_PIDFILE,name,(int)getpid());
285 snprintf(file,255,"%s%s/%s-%d.pid",DEFAULTDIR,
286 OS_PIDFILE,name,(int)getpid());
289 if(File_DateofChange(file) < 0)
298 int UnmergeFiles(char *finalpath, char *optdir)
300 int i = 0, n = 0, ret = 1;
304 char final_name[2048 +1];
309 finalfp = fopen(finalpath, "r");
312 merror("%s: ERROR: Unable to read merged file: '%s'.",
313 __local_name, finalpath);
319 /* Reading header portion. */
320 if(fgets(buf, sizeof(buf) -1, finalfp) == NULL)
331 /* Getting file size and name. */
332 files_size = atol(buf +1);
334 files = strchr(buf, '\n');
338 files = strchr(buf, ' ');
349 snprintf(final_name, 2048, "%s/%s", optdir, files);
353 strncpy(final_name, files, 2048);
354 final_name[2048] = '\0';
358 /* Opening file name. */
359 fp = fopen(final_name,"w");
363 merror("%s: ERROR: Unable to unmerge file '%s'.",
364 __local_name, final_name);
368 if(files_size < sizeof(buf) -1)
376 files_size -= sizeof(buf) -1;
379 while((n = fread(buf, 1, i, finalfp)) > 0)
385 fwrite(buf, n, 1, fp);
394 if(files_size < sizeof(buf) -1)
402 files_size -= sizeof(buf) -1;
416 int MergeAppendFile(char *finalpath, char *files)
427 /* Creating a new entry. */
430 finalfp = fopen(finalpath, "w");
433 merror("%s: ERROR: Unable to create merged file: '%s'.",
434 __local_name, finalpath);
443 finalfp = fopen(finalpath, "a");
446 merror("%s: ERROR: Unable to create merged file: '%s'.",
447 __local_name, finalpath);
452 fp = fopen(files,"r");
455 merror("%s: ERROR: Unable to merge file '%s'.", __local_name, files);
461 fseek(fp, 0, SEEK_END);
462 files_size = ftell(fp);
464 tmpfile = strrchr(files, '/');
473 fprintf(finalfp, "!%ld %s\n", files_size, tmpfile);
475 fseek(fp, 0, SEEK_SET);
477 while((n = fread(buf, 1, sizeof(buf) -1, fp)) > 0)
480 fwrite(buf, n, 1, finalfp);
491 int MergeFiles(char *finalpath, char **files)
493 int i = 0, n = 0, ret = 1;
501 finalfp = fopen(finalpath, "w");
504 merror("%s: ERROR: Unable to create merged file: '%s'.",
505 __local_name, finalpath);
511 fp = fopen(files[i],"r");
514 merror("%s: ERROR: Unable to merge file '%s'.", __local_name, files[i]);
520 fseek(fp, 0, SEEK_END);
521 files_size = ftell(fp);
523 /* Removing last entry. */
524 tmpfile = strrchr(files[i], '/');
534 fprintf(finalfp, "!%ld %s\n", files_size, tmpfile);
536 fseek(fp, 0, SEEK_SET);
538 while((n = fread(buf, 1, sizeof(buf) -1, fp)) > 0)
541 fwrite(buf, n, 1, finalfp);
554 /* getuname; Get uname and returns a string with it.
555 * Memory must be freed after use
559 struct utsname uts_buf;
561 if(uname(&uts_buf) >= 0)
565 ret = calloc(256, sizeof(char));
569 snprintf(ret, 255, "%s %s %s %s %s - %s %s",
582 ret = calloc(256, sizeof(char));
586 snprintf(ret, 255, "No system info available - %s %s",
597 /* goDaemon: Daemonize a process without closing stdin/stdout/stderr..
608 merror(FORK_ERROR, __local_name);
617 /* becoming session leader */
620 merror(SETSID_ERROR, __local_name);
629 merror(FORK_ERROR, __local_name);
650 /* goDaemon: Daemonize a process..
662 merror(FORK_ERROR, __local_name);
670 /* becoming session leader */
673 merror(SETSID_ERROR, __local_name);
681 merror(FORK_ERROR, __local_name);
690 /* Dup stdin, stdout and stderr to /dev/null */
691 if((fd = open("/dev/null", O_RDWR)) >= 0)
703 /* Closing stdin, stdout and stderr */
710 /* Openining stdin, stdout and stderr to /dev/null */
712 open("/dev/null", O_RDONLY);
713 open("/dev/null", O_RDWR);
714 open("/dev/null", O_RDWR);
727 m_uname = getuname();
730 merror(MEM_ERROR, __local_name);
735 /* We check if the system is vista (most be called during the startup. */
736 if(strstr(m_uname, "Windows Server 2008") ||
737 strstr(m_uname, "Vista"))
740 verbose("%s: INFO: System is Vista or Windows Server 2008.",
751 /** get uname for windows **/
754 int ret_size = OS_SIZE_1024 -2;
758 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
759 typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
762 /* Extracted from ms web site
763 * http://msdn.microsoft.com/library/en-us/sysinfo/base/getting_the_system_version.asp
765 OSVERSIONINFOEX osvi;
769 BOOL bOsVersionInfoEx;
772 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
773 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
775 if(!(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)))
777 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
778 if (!GetVersionEx((OSVERSIONINFO *)&osvi))
782 /* Allocating the memory */
783 os_calloc(OS_SIZE_1024 +1, sizeof(char), ret);
784 ret[OS_SIZE_1024] = '\0';
786 switch(osvi.dwPlatformId)
788 /* Test for the Windows NT product family. */
789 case VER_PLATFORM_WIN32_NT:
790 if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
792 if(osvi.wProductType == VER_NT_WORKSTATION )
793 strncat(ret, "Microsoft Windows Vista ", ret_size -1);
796 strncat(ret, "Microsoft Windows Server 2008 ", ret_size -1);
799 ret_size-=strlen(ret) +1;
802 /* Getting product version. */
803 pGPI = (PGPI) GetProcAddress(
804 GetModuleHandle(TEXT("kernel32.dll")),
807 pGPI( 6, 0, 0, 0, &dwType);
811 case PRODUCT_UNLICENSED:
812 strncat(ret, PRODUCT_UNLICENSED_C, ret_size -1);
814 case PRODUCT_BUSINESS:
815 strncat(ret, PRODUCT_BUSINESS_C, ret_size -1);
817 case PRODUCT_BUSINESS_N:
818 strncat(ret, PRODUCT_BUSINESS_N_C, ret_size -1);
820 case PRODUCT_CLUSTER_SERVER:
821 strncat(ret, PRODUCT_CLUSTER_SERVER_C, ret_size -1);
823 case PRODUCT_DATACENTER_SERVER:
824 strncat(ret, PRODUCT_DATACENTER_SERVER_C, ret_size -1);
826 case PRODUCT_DATACENTER_SERVER_CORE:
827 strncat(ret, PRODUCT_DATACENTER_SERVER_CORE_C, ret_size -1);
829 case PRODUCT_DATACENTER_SERVER_CORE_V:
830 strncat(ret, PRODUCT_DATACENTER_SERVER_CORE_V_C, ret_size -1);
832 case PRODUCT_DATACENTER_SERVER_V:
833 strncat(ret, PRODUCT_DATACENTER_SERVER_V_C, ret_size -1);
835 case PRODUCT_ENTERPRISE:
836 strncat(ret, PRODUCT_ENTERPRISE_C, ret_size -1);
838 case PRODUCT_ENTERPRISE_N:
839 strncat(ret, PRODUCT_ENTERPRISE_N_C, ret_size -1);
841 case PRODUCT_ENTERPRISE_SERVER:
842 strncat(ret, PRODUCT_ENTERPRISE_SERVER_C, ret_size -1);
844 case PRODUCT_ENTERPRISE_SERVER_CORE:
845 strncat(ret, PRODUCT_ENTERPRISE_SERVER_CORE_C, ret_size -1);
847 case PRODUCT_ENTERPRISE_SERVER_CORE_V:
848 strncat(ret, PRODUCT_ENTERPRISE_SERVER_CORE_V_C, ret_size -1);
850 case PRODUCT_ENTERPRISE_SERVER_IA64:
851 strncat(ret, PRODUCT_ENTERPRISE_SERVER_IA64_C, ret_size -1);
853 case PRODUCT_ENTERPRISE_SERVER_V:
854 strncat(ret, PRODUCT_ENTERPRISE_SERVER_V_C, ret_size -1);
856 case PRODUCT_HOME_BASIC:
857 strncat(ret, PRODUCT_HOME_BASIC_C, ret_size -1);
859 case PRODUCT_HOME_BASIC_N:
860 strncat(ret, PRODUCT_HOME_BASIC_N_C, ret_size -1);
862 case PRODUCT_HOME_PREMIUM:
863 strncat(ret, PRODUCT_HOME_PREMIUM_C, ret_size -1);
865 case PRODUCT_HOME_PREMIUM_N:
866 strncat(ret, PRODUCT_HOME_PREMIUM_N_C, ret_size -1);
868 case PRODUCT_HOME_SERVER:
869 strncat(ret, PRODUCT_HOME_SERVER_C, ret_size -1);
871 case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT:
872 strncat(ret, PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT_C, ret_size -1);
874 case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING:
875 strncat(ret, PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING_C, ret_size -1);
877 case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY:
878 strncat(ret, PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY_C, ret_size -1);
880 case PRODUCT_SERVER_FOR_SMALLBUSINESS:
881 strncat(ret, PRODUCT_SERVER_FOR_SMALLBUSINESS_C, ret_size -1);
883 case PRODUCT_SMALLBUSINESS_SERVER:
884 strncat(ret, PRODUCT_SMALLBUSINESS_SERVER_C, ret_size -1);
886 case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
887 strncat(ret, PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_C, ret_size -1);
889 case PRODUCT_STANDARD_SERVER:
890 strncat(ret, PRODUCT_STANDARD_SERVER_C, ret_size -1);
892 case PRODUCT_STANDARD_SERVER_CORE:
893 strncat(ret, PRODUCT_STANDARD_SERVER_CORE_C, ret_size -1);
895 case PRODUCT_STANDARD_SERVER_CORE_V:
896 strncat(ret, PRODUCT_STANDARD_SERVER_CORE_V_C, ret_size -1);
898 case PRODUCT_STANDARD_SERVER_V:
899 strncat(ret, PRODUCT_STANDARD_SERVER_V_C, ret_size -1);
901 case PRODUCT_STARTER:
902 strncat(ret, PRODUCT_STARTER_C, ret_size -1);
904 case PRODUCT_STORAGE_ENTERPRISE_SERVER:
905 strncat(ret, PRODUCT_STORAGE_ENTERPRISE_SERVER_C, ret_size -1);
907 case PRODUCT_STORAGE_EXPRESS_SERVER:
908 strncat(ret, PRODUCT_STORAGE_EXPRESS_SERVER_C, ret_size -1);
910 case PRODUCT_STORAGE_STANDARD_SERVER:
911 strncat(ret, PRODUCT_STORAGE_STANDARD_SERVER_C, ret_size -1);
913 case PRODUCT_STORAGE_WORKGROUP_SERVER:
914 strncat(ret, PRODUCT_STORAGE_WORKGROUP_SERVER_C, ret_size -1);
916 case PRODUCT_ULTIMATE:
917 strncat(ret, PRODUCT_ULTIMATE_C, ret_size -1);
919 case PRODUCT_ULTIMATE_N:
920 strncat(ret, PRODUCT_ULTIMATE_N_C, ret_size -1);
922 case PRODUCT_WEB_SERVER:
923 strncat(ret, PRODUCT_WEB_SERVER_C, ret_size -1);
925 case PRODUCT_WEB_SERVER_CORE:
926 strncat(ret, PRODUCT_WEB_SERVER_CORE_C, ret_size -1);
931 ret_size-=strlen(ret) +1;
934 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
936 pGNSI = (PGNSI) GetProcAddress(
937 GetModuleHandle("kernel32.dll"),
938 "GetNativeSystemInfo");
942 if( GetSystemMetrics(89) )
943 strncat(ret, "Microsoft Windows Server 2003 R2 ",
945 else if(osvi.wProductType == VER_NT_WORKSTATION &&
946 si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
949 "Microsoft Windows XP Professional x64 Edition ",
954 strncat(ret, "Microsoft Windows Server 2003, ",ret_size-1);
957 ret_size-=strlen(ret) +1;
960 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
962 strncat(ret, "Microsoft Windows XP ", ret_size -1);
964 ret_size-=strlen(ret) +1;
967 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
969 strncat(ret, "Microsoft Windows 2000 ", ret_size -1);
971 ret_size-=strlen(ret) +1;
974 else if (osvi.dwMajorVersion <= 4)
976 strncat(ret, "Microsoft Windows NT ", ret_size -1);
978 ret_size-=strlen(ret) +1;
982 strncat(ret, "Microsoft Windows Unknown ", ret_size -1);
984 ret_size-=strlen(ret) +1;
987 /* Test for specific product on Windows NT 4.0 SP6 and later. */
990 /* Test for the workstation type. */
991 if (osvi.wProductType == VER_NT_WORKSTATION &&
992 si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_AMD64)
994 if( osvi.dwMajorVersion == 4 )
995 strncat(ret, "Workstation 4.0 ", ret_size -1);
996 else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
997 strncat(ret, "Home Edition ", ret_size -1);
999 strncat(ret, "Professional ",ret_size -1);
1002 ret_size-=strlen(ret) +1;
1005 /* Test for the server type. */
1006 else if( osvi.wProductType == VER_NT_SERVER ||
1007 osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
1009 if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==2)
1011 if (si.wProcessorArchitecture==
1012 PROCESSOR_ARCHITECTURE_IA64 )
1014 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
1016 "Datacenter Edition for Itanium-based Systems ",
1018 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
1020 "Enterprise Edition for Itanium-based Systems ",
1023 ret_size-=strlen(ret) +1;
1026 else if ( si.wProcessorArchitecture==
1027 PROCESSOR_ARCHITECTURE_AMD64 )
1029 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
1030 strncat(ret, "Datacenter x64 Edition ",
1032 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
1033 strncat(ret, "Enterprise x64 Edition ",
1036 strncat(ret, "Standard x64 Edition ",
1039 ret_size-=strlen(ret) +1;
1044 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
1045 strncat(ret, "Datacenter Edition ",
1047 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
1048 strncat(ret,"Enterprise Edition ",ret_size -1);
1049 else if ( osvi.wSuiteMask == VER_SUITE_BLADE )
1050 strncat(ret,"Web Edition ",ret_size -1 );
1052 strncat(ret, "Standard Edition ",ret_size -1);
1054 ret_size-=strlen(ret) +1;
1057 else if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
1059 if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
1060 strncat(ret, "Datacenter Server ",ret_size -1);
1061 else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
1062 strncat(ret, "Advanced Server ",ret_size -1 );
1064 strncat(ret, "Server ",ret_size -1);
1066 ret_size-=strlen(ret) +1;
1068 else if(osvi.dwMajorVersion <= 4) /* Windows NT 4.0 */
1070 if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
1071 strncat(ret, "Server 4.0, Enterprise Edition ",
1074 strncat(ret, "Server 4.0 ",ret_size -1);
1076 ret_size-=strlen(ret) +1;
1080 /* Test for specific product on Windows NT 4.0 SP5 and earlier */
1084 char szProductType[81];
1088 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
1089 "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
1090 0, KEY_QUERY_VALUE, &hKey );
1091 if(lRet == ERROR_SUCCESS)
1095 lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL,
1096 (LPBYTE) szProductType, &dwBufLen);
1097 RegCloseKey( hKey );
1099 if((lRet == ERROR_SUCCESS) && (dwBufLen < 80) )
1101 if (lstrcmpi( "WINNT", szProductType) == 0 )
1102 strncat(ret, "Workstation ",ret_size -1);
1103 else if(lstrcmpi( "LANMANNT", szProductType) == 0 )
1104 strncat(ret, "Server ",ret_size -1);
1105 else if(lstrcmpi( "SERVERNT", szProductType) == 0 )
1106 strncat(ret, "Advanced Server " ,ret_size -1);
1108 ret_size-=strlen(ret) +1;
1110 memset(__wv, '\0', 32);
1113 (int)osvi.dwMajorVersion,
1114 (int)osvi.dwMinorVersion);
1116 strncat(ret, __wv, ret_size -1);
1117 ret_size-=strlen(__wv) +1;
1122 /* Display service pack (if any) and build number. */
1124 if( osvi.dwMajorVersion == 4 &&
1125 lstrcmpi( osvi.szCSDVersion, "Service Pack 6" ) == 0 )
1131 memset(__wp, '\0', 64);
1132 /* Test for SP6 versus SP6a. */
1133 lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
1134 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
1135 0, KEY_QUERY_VALUE, &hKey );
1136 if( lRet == ERROR_SUCCESS )
1137 snprintf(__wp, 63, "Service Pack 6a (Build %d)",
1138 (int)osvi.dwBuildNumber & 0xFFFF );
1139 else /* Windows NT 4.0 prior to SP6a */
1141 snprintf(__wp, 63, "%s (Build %d)",
1143 (int)osvi.dwBuildNumber & 0xFFFF);
1146 strncat(ret, __wp, ret_size -1);
1147 ret_size-=strlen(__wp) +1;
1148 RegCloseKey( hKey );
1154 memset(__wp, '\0', 64);
1156 snprintf(__wp, 63, "%s (Build %d)",
1158 (int)osvi.dwBuildNumber & 0xFFFF);
1160 strncat(ret, __wp, ret_size -1);
1161 ret_size-=strlen(__wp) +1;
1165 /* Test for the Windows Me/98/95. */
1166 case VER_PLATFORM_WIN32_WINDOWS:
1168 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
1170 strncat(ret, "Microsoft Windows 95 ", ret_size -1);
1171 ret_size-=strlen(ret) +1;
1174 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
1176 strncat(ret, "Microsoft Windows 98 ", ret_size -1);
1177 ret_size-=strlen(ret) +1;
1180 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
1182 strncat(ret, "Microsoft Windows Millennium Edition",
1185 ret_size-=strlen(ret) +1;
1189 case VER_PLATFORM_WIN32s:
1191 strncat(ret, "Microsoft Win32s", ret_size -1);
1192 ret_size-=strlen(ret) +1;
1197 /* Adding ossec version */
1198 snprintf(os_v, 128, " - %s %s", __name, __version);
1199 strncat(ret, os_v, ret_size -1);
1202 /* Returning system information */