From 3b3779b260707c5ae22c5d85a85ddf800115ec0f Mon Sep 17 00:00:00 2001 From: Noomen Hamza Date: Tue, 20 Jun 2000 20:49:53 +0000 Subject: [PATCH] OleConvertOLESTREAMToIStorage fails (returns REGDB_E_CLASSNOTREG) when the CLSID of the OLE object is not found in the registry. Fixed. --- dlls/ole32/compobj.c | 25 ++++++++++++++++++----- dlls/ole32/storage32.c | 49 +++++++++++++++++++-------------------------- include/winerror.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 90 insertions(+), 38 deletions(-) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index a83c065bb1e..81d2280a79f 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -457,6 +457,24 @@ HRESULT WINAPI CLSIDFromString16( if (!s) s = "{00000000-0000-0000-0000-000000000000}"; + else { /* validate the CLSID string */ + + if (strlen(s) != 38) + return CO_E_CLASSSTRING; + + if ((s[0]!='{') || (s[9]!='-') || (s[14]!='-') || (s[19]!='-') || (s[24]!='-') || (s[37]!='}')) + return CO_E_CLASSSTRING; + + for (i=1; i<37; i++) + { + if ((i == 9)||(i == 14)||(i == 19)||(i == 24)) continue; + if (!(((s[i] >= '0') && (s[i] <= '9')) || + ((s[i] >= 'a') && (s[i] <= 'f')) || + ((s[i] >= 'A') && (s[i] <= 'F'))) + ) + return CO_E_CLASSSTRING; + } + } TRACE("%s -> %p\n", s, id); @@ -473,9 +491,6 @@ HRESULT WINAPI CLSIDFromString16( /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ - if (strlen(s) != 38) - return OLE_ERROR_OBJECT; - p = (BYTE *) id; s++; /* skip leading brace */ @@ -933,13 +948,13 @@ HRESULT WINAPI CLSIDFromProgID16( sprintf(buf,"%s\\CLSID",progid); if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) { HeapFree(GetProcessHeap(),0,buf); - return OLE_ERROR_GENERIC; + return CO_E_CLASSSTRING; } HeapFree(GetProcessHeap(),0,buf); buf2len = sizeof(buf2); if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) { RegCloseKey(xhkey); - return OLE_ERROR_GENERIC; + return CO_E_CLASSSTRING; } RegCloseKey(xhkey); return CLSIDFromString16(buf2,riid); diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c index 08000a0c241..b0a37e9ee19 100644 --- a/dlls/ole32/storage32.c +++ b/dlls/ole32/storage32.c @@ -6401,11 +6401,7 @@ HRESULT OLECONVERT_CreateCompObjStream(LPSTORAGE pStorage, LPCSTR strOleTypeName /* Get the CLSID */ hRes = CLSIDFromProgID16(IStorageCompObj.strProgIDName, &(IStorageCompObj.clsid)); - if(hRes != S_OK) - { - hRes = REGDB_E_CLASSNOTREG; - } - else + if(hRes == S_OK) { HKEY hKey; LONG hErr; @@ -6422,34 +6418,29 @@ HRESULT OLECONVERT_CreateCompObjStream(LPSTORAGE pStorage, LPCSTR strOleTypeName } RegCloseKey(hKey); } - if(hErr != ERROR_SUCCESS) - { - hRes = REGDB_E_CLASSNOTREG; - } } - if(hRes == S_OK ) + /* Write CompObj Structure to stream */ + hRes = IStream_Write(pStream, IStorageCompObj.byUnknown1, sizeof(IStorageCompObj.byUnknown1), NULL); + + WriteClassStm(pStream,&(IStorageCompObj.clsid)); + + hRes = IStream_Write(pStream, &(IStorageCompObj.dwCLSIDNameLength), sizeof(IStorageCompObj.dwCLSIDNameLength), NULL); + if(IStorageCompObj.dwCLSIDNameLength > 0) { - /* Write CompObj Structure to stream */ - hRes = IStream_Write(pStream, IStorageCompObj.byUnknown1, sizeof(IStorageCompObj.byUnknown1), NULL); - hRes = IStream_Write(pStream, &(IStorageCompObj.clsid) , sizeof(IStorageCompObj.clsid ), NULL); - hRes = IStream_Write(pStream, &(IStorageCompObj.dwCLSIDNameLength), sizeof(IStorageCompObj.dwCLSIDNameLength), NULL); - if(IStorageCompObj.dwCLSIDNameLength > 0) - { - hRes = IStream_Write(pStream, IStorageCompObj.strCLSIDName, IStorageCompObj.dwCLSIDNameLength, NULL); - } - hRes = IStream_Write(pStream, &(IStorageCompObj.dwOleTypeNameLength) , sizeof(IStorageCompObj.dwOleTypeNameLength), NULL); - if(IStorageCompObj.dwOleTypeNameLength > 0) - { - hRes = IStream_Write(pStream, IStorageCompObj.strOleTypeName , IStorageCompObj.dwOleTypeNameLength, NULL); - } - hRes = IStream_Write(pStream, &(IStorageCompObj.dwProgIDNameLength) , sizeof(IStorageCompObj.dwProgIDNameLength), NULL); - if(IStorageCompObj.dwProgIDNameLength > 0) - { - hRes = IStream_Write(pStream, IStorageCompObj.strProgIDName , IStorageCompObj.dwProgIDNameLength, NULL); - } - hRes = IStream_Write(pStream, IStorageCompObj.byUnknown2 , sizeof(IStorageCompObj.byUnknown2), NULL); + hRes = IStream_Write(pStream, IStorageCompObj.strCLSIDName, IStorageCompObj.dwCLSIDNameLength, NULL); + } + hRes = IStream_Write(pStream, &(IStorageCompObj.dwOleTypeNameLength) , sizeof(IStorageCompObj.dwOleTypeNameLength), NULL); + if(IStorageCompObj.dwOleTypeNameLength > 0) + { + hRes = IStream_Write(pStream, IStorageCompObj.strOleTypeName , IStorageCompObj.dwOleTypeNameLength, NULL); + } + hRes = IStream_Write(pStream, &(IStorageCompObj.dwProgIDNameLength) , sizeof(IStorageCompObj.dwProgIDNameLength), NULL); + if(IStorageCompObj.dwProgIDNameLength > 0) + { + hRes = IStream_Write(pStream, IStorageCompObj.strProgIDName , IStorageCompObj.dwProgIDNameLength, NULL); } + hRes = IStream_Write(pStream, IStorageCompObj.byUnknown2 , sizeof(IStorageCompObj.byUnknown2), NULL); IStream_Release(pStream); } return hRes; diff --git a/include/winerror.h b/include/winerror.h index 2a25e394b18..d52237a3a4e 100644 --- a/include/winerror.h +++ b/include/winerror.h @@ -1518,10 +1518,52 @@ extern int WIN32_LastError; #define CO_E_INIT_SCM_EXEC_FAILURE 0x80004011 #define CO_E_INIT_ONLY_SINGLE_THREADED 0x80004012 */ -#define CO_S_NOTALLINTERFACES 0x00080012 -#define CO_E_NOTINITIALIZED 0x800401F0 -#define CO_E_ERRORINDLL 0x800401F9 -#define CO_E_OBJISREG 0x800401FB +#define CO_S_NOTALLINTERFACES 0x00080012 +#define CO_E_NOTINITIALIZED 0x800401F0L +#define CO_E_ALREADYINITIALIZED 0x800401F1L +#define CO_E_CANTDETERMINECLASS 0x800401F2L +#define CO_E_CLASSSTRING 0x800401F3L +#define CO_E_IIDSTRING 0x800401F4L +#define CO_E_APPNOTFOUND 0x800401F5L +#define CO_E_APPSINGLEUSE 0x800401F6L +#define CO_E_ERRORINAPP 0x800401F7L +#define CO_E_DLLNOTFOUND 0x800401F8L +#define CO_E_ERRORINDLL 0x800401F9L +#define CO_E_WRONGOSFORAPP 0x800401FAL +#define CO_E_OBJNOTREG 0x800401FBL +#define CO_E_OBJISREG 0x800401FCL +#define CO_E_OBJNOTCONNECTED 0x800401FDL +#define CO_E_APPDIDNTREG 0x800401FEL +#define CO_E_RELEASED 0x800401FFL +#define CO_E_FAILEDTOIMPERSONATE 0x80040200L +#define CO_E_FAILEDTOGETSECCTX 0x80040201L +#define CO_E_FAILEDTOOPENTHREADTOKEN 0x80040202L +#define CO_E_FAILEDTOGETTOKENINFO 0x80040203L +#define CO_E_TRUSTEEDOESNTMATCHCLIENT 0x80040204L +#define CO_E_FAILEDTOQUERYCLIENTBLANKET 0x80040205L +#define CO_E_FAILEDTOSETDACL 0x80040206L +#define CO_E_ACCESSCHECKFAILED 0x80040207L +#define CO_E_NETACCESSAPIFAILED 0x80040208L +#define CO_E_WRONGTRUSTEENAMESYNTAX 0x80040209L +#define CO_E_INVALIDSID 0x8004020AL +#define CO_E_CONVERSIONFAILED 0x8004020BL +#define CO_E_NOMATCHINGSIDFOUND 0x8004020CL +#define CO_E_LOOKUPACCSIDFAILED 0x8004020DL +#define CO_E_NOMATCHINGNAMEFOUND 0x8004020EL +#define CO_E_LOOKUPACCNAMEFAILED 0x8004020FL +#define CO_E_SETSERLHNDLFAILED 0x80040210L +#define CO_E_FAILEDTOGETWINDIR 0x80040211L +#define CO_E_PATHTOOLONG 0x80040212L +#define CO_E_FAILEDTOGENUUID 0x80040213L +#define CO_E_FAILEDTOCREATEFILE 0x80040214L +#define CO_E_FAILEDTOCLOSEHANDLE 0x80040215L +#define CO_E_EXCEEDSYSACLLIMIT 0x80040216L +#define CO_E_ACESINWRONGORDER 0x80040217L +#define CO_E_INCOMPATIBLESTREAMVERSION 0x80040218L +#define CO_E_FAILEDTOOPENPROCESSTOKEN 0x80040219L +#define CO_E_DECODEFAILED 0x8004021AL +#define CO_E_ACNOTINITIALIZED 0x8004021BL + #define OLE_E_FIRST 0x80040000L #define OLE_E_LAST 0x800400FFL @@ -1640,7 +1682,11 @@ extern int WIN32_LastError; /* registry errors */ #define REGDB_E_READREGDB 0x80040150 +#define REGDB_E_WRITEREGDB 0x80040151 +#define REGDB_E_KEYMISSING 0x80040152 +#define REGDB_E_INVALIVALUE 0x80040153 #define REGDB_E_CLASSNOTREG 0x80040154 +#define REGDB_E_IIDNOTREG 0x80040155 #define INPLACE_E_NOTUNDOABLE 0x800401A0 #define INPLACE_E_NOTOOLSPACE 0x800401A1 -- 2.11.4.GIT