Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

322 lines
7.9 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: extag.c
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 6-17-96 RichardW Created
//
//----------------------------------------------------------------------------
#define UNICODE
#include <windows.h>
#include <wchar.h>
#include <stdio.h>
WCHAR ExportTag[] = L"Export Version";
WCHAR DomesticTag[] = L"US/Canada Only, Not for Export";
WCHAR OldDomesticTag[] = L"Domestic Use Only";
DWORD DefLang = 0x04b00409;
#define BINARY_TYPE_UNKNOWN 0
#define BINARY_TYPE_CONTROLLED 1
#define BINARY_TYPE_OPEN 2
#define BINARY_TYPE_CONTROLLED_OLD 3
BOOL
CheckIfControlled(
LPWSTR Path,
DWORD Flags)
{
PUCHAR pData;
DWORD cbData;
DWORD Zero;
PWSTR Description;
WCHAR ValueTag[64];
PDWORD pdwTranslation;
DWORD uLen;
cbData = GetFileVersionInfoSize( Path, &Zero );
if ( cbData == 0 )
{
return( BINARY_TYPE_UNKNOWN );
}
pData = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT, cbData );
if ( !pData )
{
return( BINARY_TYPE_UNKNOWN );
}
if ( ! GetFileVersionInfo( Path, 0, cbData, pData ) )
{
LocalFree( pData );
return( BINARY_TYPE_UNKNOWN );
}
if(!VerQueryValue(pData, L"\\VarFileInfo\\Translation", &pdwTranslation, &uLen))
{
pdwTranslation = &DefLang;
uLen = sizeof(DWORD);
}
swprintf( ValueTag, L"\\StringFileInfo\\%04x%04x\\FileDescription",
LOWORD( *pdwTranslation ), HIWORD( *pdwTranslation ) );
// L"\\StringFileInfo\\040904b0\\FileDescription",
if (VerQueryValue( pData,
ValueTag,
&Description,
&cbData ) )
{
if (wcsstr( Description, DomesticTag ) )
{
LocalFree( pData );
return( BINARY_TYPE_CONTROLLED );
}
if (wcsstr( Description, OldDomesticTag ) )
{
LocalFree( pData );
return( BINARY_TYPE_CONTROLLED_OLD );
}
if ( wcsstr( Description, ExportTag ) )
{
LocalFree( pData );
return( BINARY_TYPE_OPEN );
}
LocalFree( pData );
return( BINARY_TYPE_UNKNOWN );
}
return( BINARY_TYPE_UNKNOWN );
}
VOID
Usage( PWSTR Me )
{
printf("%ws: usage\n", Me);
printf(" %ws file\tCheck file for export / domestic tags\n", Me);
printf(" %ws dir\tCheck all files in directory\n", Me);
}
int
__cdecl
wmain(
int argc,
WCHAR * argv[] )
{
DWORD Result;
PWSTR Path;
WCHAR FullPath[ MAX_PATH ];
WCHAR SearchPath[ MAX_PATH ];
PWSTR FilePart;
DWORD Attrs;
WIN32_FIND_DATA Results;
HANDLE SearchHandle;
DWORD Error;
DWORD FileCount;
DWORD FileErrors;
DWORD FileControlled;
DWORD FileExport;
DWORD FileUntagged;
if ( argc < 2 )
{
Path = TEXT(".");
}
else
{
if ((wcscmp(argv[1], L"-?") == 0) ||
(wcscmp(argv[1], L"/?") == 0) )
{
Usage( argv[0] );
return( 0 );
}
Path = argv[1];
}
//
// Expand it:
if( GetFullPathName(Path,
MAX_PATH,
FullPath,
&FilePart))
{
Path = FullPath;
}
Result = wcslen( Path );
if ( Path[Result - 1] == '\\' )
{
Path[Result - 1] = '\0';
}
Attrs = GetFileAttributes( Path );
if ( Attrs == (DWORD) -1 )
{
Attrs = 0;
}
if ( Attrs & FILE_ATTRIBUTE_DIRECTORY )
{
//
// Yikes!
//
printf("Searching path %ws ...\n\n", Path );
FileCount = 0;
FileErrors = 0;
FileControlled = 0;
FileExport = 0;
FileUntagged = 0;
swprintf( SearchPath, TEXT("%s\\*.*"), Path );
SearchHandle = FindFirstFile( SearchPath, &Results );
if (SearchHandle == INVALID_HANDLE_VALUE)
{
return( 0 );
}
do
{
if ( Results.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
continue;
}
FileCount++;
swprintf( SearchPath, TEXT("%s\\%s"), Path, Results.cFileName );
Result = CheckIfControlled( SearchPath, 0 );
switch ( Result )
{
case BINARY_TYPE_UNKNOWN :
Error = GetLastError();
if ( Error )
{
FileErrors++;
if ((Error == ERROR_RESOURCE_DATA_NOT_FOUND) ||
(Error == ERROR_RESOURCE_TYPE_NOT_FOUND) )
{
printf( "File %ws: expected resource data not found\n", SearchPath );
}
else
{
printf( "Error %d while accessing %ws\n", Error, SearchPath );
}
}
else
{
FileUntagged++;
}
break;
case BINARY_TYPE_CONTROLLED:
printf("%ws is DOMESTIC USE ONLY\n", SearchPath );
FileControlled++;
break;
case BINARY_TYPE_CONTROLLED_OLD:
printf("%ws is DOMESTIC USE ONLY (Old Style Tag)\n", SearchPath );
FileControlled++;
break;
case BINARY_TYPE_OPEN:
FileExport++;
printf("%ws tagged as okay for export\n", SearchPath );
break;
}
} while ( FindNextFile( SearchHandle, &Results ) );
FindClose( SearchHandle );
//
// Dump Stats:
//
printf("\n%d files scanned in directory %ws\n", FileCount, Path );
printf(" %5d file(s) were tagged as export controlled\n", FileControlled );
printf(" %5d file(s) were tagged as okay for export\n", FileExport);
printf(" %5d file(s) were not tagged\n", FileUntagged );
if ( FileErrors )
{
printf(" %5d files(s) could not be checked due to errors\n", FileErrors );
}
}
else
{
Result = CheckIfControlled( Path, 0 ) ;
switch ( Result )
{
case BINARY_TYPE_UNKNOWN :
Error = GetLastError();
if ( Error )
{
if ((Error == ERROR_RESOURCE_DATA_NOT_FOUND) ||
(Error == ERROR_RESOURCE_TYPE_NOT_FOUND) )
{
printf( "File %ws: expected resource data not found\n", Path );
}
else
{
printf( "Error %d while accessing %ws\n", Error, Path );
}
}
else
{
printf("Image untagged\n");
}
break;
case BINARY_TYPE_CONTROLLED:
printf("%ws is DOMESTIC USE ONLY\n", Path );
break;
case BINARY_TYPE_CONTROLLED_OLD:
printf("%ws is DOMESTIC USE ONLY (Old Style Tag)\n", Path );
break;
case BINARY_TYPE_OPEN:
printf("%ws is okay for export\n", Path );
break;
}
}
return( Result );
}