//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: UPKNOWN.C // // Contents: This tool will add the three OLE2 DLL's to the known list // for wow. //---------------------------------------------------------------------------- #include #include #include void FindAndDelete( char *psz, char *pszDeleteString ) { char *substr; char temp[1024]; char *pstr; if ( psz == NULL ) { return; } while ( TRUE ) { substr = strstr(psz,pszDeleteString); if ( substr == NULL ) { break; } pstr = substr; if ((substr > psz) && (substr[-1] == ' ')) { substr--; } *substr=0; strcat(psz,pstr+strlen(pszDeleteString)); } } void FindOrAdd( char *psz, char *pszAddition ) { char *substr; char temp[1024]; char ch; strcpy(temp," "); strcat(temp,pszAddition); substr = psz; while ( TRUE ) { substr = strstr(substr,temp); if ( substr == NULL ) { break; } ch = *(substr+strlen(temp)); if ( ch = ' ' || ch == '\0' ) { break; } } if ( substr == NULL ) { strcat( psz, temp ); } } int _cdecl main( int argc, char *argv[] ) { HKEY WowKey; long l; DWORD dwRegValueType; CHAR sz[2048]; ULONG ulSize; l = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\WOW", 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &WowKey ); if ( l != 0 ) { printf("Failed to open HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\WOW\n"); printf("Do you have administrator privleges?\n"); exit(1); } ulSize = sizeof(sz); l = RegQueryValueEx( WowKey, "KnownDLLs", NULL, &dwRegValueType, sz, &ulSize ); if ( l != ERROR_SUCCESS ) { printf("Failed reading [WOWKEY]\\KnownDLLs\n"); printf("Do you have administrator privleges?\n"); exit(1); } if ( dwRegValueType != REG_SZ ) { printf("Internal error, [WOWKEY]\\KnownDLLs is not a REG_SZ (string)\n"); exit(1); } printf("\nKey was: \"%s\"\n\n", sz ); switch (argc) { case 1: FindOrAdd( sz, "compobj.dll" ); FindOrAdd( sz, "storage.dll" ); FindOrAdd( sz, "ole2.dll" ); FindOrAdd( sz, "ole2disp.dll" ); FindOrAdd( sz, "typelib.dll" ); FindOrAdd( sz, "ole2nls.dll" ); break; case 2: if( (strcmp(argv[1],"-r") == 0) || (strcmp(argv[1],"/r") == 0)) { FindAndDelete( sz, "compobj.dll" ); FindAndDelete( sz, "storage.dll" ); FindAndDelete( sz, "ole2.dll" ); FindAndDelete( sz, "ole2disp.dll" ); FindAndDelete( sz, "typelib.dll" ); FindAndDelete( sz, "ole2nls.dll" ); } else { printf("Unknown parameters\n"); exit(1); } break; default: printf("Too many parameters\n"); exit(1); } printf("Key is now: \"%s\"\n\n", sz ); ulSize = strlen( sz ); l = RegSetValueEx( WowKey, "KnownDLLs", 0, dwRegValueType, sz, ulSize+1 ); if ( l != ERROR_SUCCESS ) { printf("Error setting value (l=%ld,0x%08lX)\n",l,l); printf("Do you have administrator privleges?\n"); exit(1); } l = RegCloseKey( WowKey ); return(0); }