I am trying to make a backup and restoration of cemail.vol by piecing
together some code found on line. Here is my C++ Calls: On top of the code
below I backup everything in \windows\Messaging. The backup seems to work
right but when I go to restore Outlook is seriously messed up SMS messages
display as "Up" with an arrow, MMS is gone and folders are kind of weird.

Anyone have any idea what is going on here?

MOBILEVOLUME_API BOOL BackupMail() {
CEGUID ceguidCemail;
CEGUID ceguidBackUp;

CREATE_INVALIDGUID(&ceguidCemail);
CREATE_INVALIDGUID(&ceguidBackUp);


if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
DWORD dwErro = GetLastError();
return FALSE;
}


if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS)) {
return FALSE;
}

HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;

if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
INVALID_HANDLE_VALUE) {
return FALSE;
}

CEOID ceoidFind = 0;

while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
HANDLE hDBOpened = INVALID_HANDLE_VALUE;

hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
CEDB_AUTOINCREMENT, NULL);
if(hDBOpened == INVALID_HANDLE_VALUE) {
DWORD error = GetLastError();
return FALSE;
}

BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
DWORD dwError = GetLastError();
return FALSE;
}

CEOIDINFOEX cdDb;
CEOID ceoidFindRecorde = NULL;
CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
CEOID ceoidDBaseCopy = 0;

if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
&hDBOpenedInfo.infDatabase))) {
DWORD dwErro = GetLastError();
return FALSE;
}

HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
hDBaseCopyHandle =
CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
return FALSE;
}

hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
DWORD dwError = GetLastError();
return FALSE;
}

DWORD dwCpt = 0;
CEOID ceoidFindRecord = 0;
WORD dwPropId = 0;
CEPROPVAL* Buffer = NULL;
DWORD dwSizeOfBuffer = 0;
HANDLE hHeap = NULL;
hHeap = GetProcessHeap();
if(hHeap == NULL) return FALSE;
while(ceoidFindRecord =
CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap)) dwCpt++;
if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
free(Buffer);
Buffer = NULL;
CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
ceoidFindRecord = 0;
DWORD dwNumberOfRecordFound = 0;
while(dwNumberOfRecordFound++ < dwCpt) {
ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
if(!ceoidFindRecord) {
DWORD dwError = GetLastError();
return FALSE;
}
CEOID ceoidRecordAdd;
ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
if(!ceoidRecordAdd) {
DWORD dwError = GetLastError();
return FALSE;
}
free(Buffer);
Buffer = NULL;
}
CloseHandle(hDBaseCopyHandle);
hDBaseCopyHandle = NULL;
}
if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
return TRUE;
}

MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {

CEGUID ceguidCemail;
CEGUID ceguidBackUp;

CREATE_INVALIDGUID(&ceguidCemail);
CREATE_INVALIDGUID(&ceguidBackUp);

if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
DWORD dwErro = GetLastError();
return FALSE;
}
if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
return FALSE;
}

HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;

if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
INVALID_HANDLE_VALUE) {
return FALSE;
}
CEOID ceoidFind = 0;


/// Clear Old Values
HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
CEOID oldid = 0;
if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
INVALID_HANDLE_VALUE) {
return FALSE;
}

while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
HANDLE oldHandle = INVALID_HANDLE_VALUE;

oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
CEDB_AUTOINCREMENT, NULL);
if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;

BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return FALSE;

DWORD dwOldCpt = 0;
CEOID ceoOldidFindRecord = 0;
WORD dwOldPropId = 0;
CEPROPVAL* oldBuffer = NULL;
DWORD dwOldSizeOfBuffer = 0;
HANDLE hOldHeap = NULL;
hOldHeap = GetProcessHeap();
if(hOldHeap == NULL) return FALSE;
while(ceoOldidFindRecord =
CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap)) dwOldCpt++;
if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
free(oldBuffer);
oldBuffer = NULL;
CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
ceoOldidFindRecord = 0;
DWORD dwOldNumberOfRecordFound = 0;
while(dwOldNumberOfRecordFound++ < dwOldCpt) {
ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer, &dwOldSizeOfBuffer,
hOldHeap);
CeDeleteRecord(oldHandle,ceoOldidFindRecord);
}
CloseHandle(oldHandle);
oldHandle = NULL;
}
CloseHandle(hRemoveHandle);
hRemoveHandle = NULL;

while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {

HANDLE hDBOpened = INVALID_HANDLE_VALUE;

hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
CEDB_AUTOINCREMENT, NULL);
if(hDBOpened == INVALID_HANDLE_VALUE) {
DWORD error = GetLastError();
return FALSE;
}
BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
return FALSE;
}

CEOID ceoidDBaseOriginal = 0;
HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
&ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
CEDB_AUTOINCREMENT, NULL);
if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
return FALSE;
}

WORD dwPropId = 0;
CEPROPVAL* Buffer = NULL;
DWORD dwSizeOfBuffer = 0;
HANDLE hHeap = NULL;
hHeap = GetProcessHeap();
if(hHeap == NULL) return FALSE;
BOOL bDBIsEmpty = FALSE;
CEOID ceoidFindRecord = 0;
while(!bDBIsEmpty) {

ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
&dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
if(!ceoidFindRecord) {
if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
else bDBIsEmpty = TRUE;
} else {
CEPROPVAL* temp;
temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
memcpy(temp, Buffer, dwSizeOfBuffer);
CEOID ceoidRecordAdd = 0;

ceoidRecordAdd =
CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal, temp[1].val.uiVal,
(CEPROPVAL *)(temp[0].val.blob.lpb));
if(!ceoidRecordAdd) return FALSE;
free(temp);
temp = NULL;
free(Buffer);
Buffer = NULL;
}
}

}
if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
return TRUE;
}

Re: Backup / Restore cemail.vol by Peter

Peter
Thu Feb 22 13:10:07 CST 2007

You shouldn't try to directly backup/restore the databases because they
contain links to Oids in other tables. Since Oids are assigned by the
database engine and not persisted in a backup they will be invalid when you
restore. You'd be better to use CEMAPI enumerate the accounts, folders and
messages and persist in some format of your own choice, then use CEMAPI to
write them back again. This would also allow you backup/restore across
different OS versions.

Peter

--
Peter Foot
Device Application Development MVP
www.peterfoot.net | www.inthehand.com

"Jeremy" <Jeremy@discussions.microsoft.com> wrote in message
news:ADCD5658-948B-40D8-B728-5D6297414863@microsoft.com...
>I am trying to make a backup and restoration of cemail.vol by piecing
> together some code found on line. Here is my C++ Calls: On top of the code
> below I backup everything in \windows\Messaging. The backup seems to work
> right but when I go to restore Outlook is seriously messed up SMS messages
> display as "Up" with an arrow, MMS is gone and folders are kind of weird.
>
> Anyone have any idea what is going on here?
>
> MOBILEVOLUME_API BOOL BackupMail() {
> CEGUID ceguidCemail;
> CEGUID ceguidBackUp;
>
> CREATE_INVALIDGUID(&ceguidCemail);
> CREATE_INVALIDGUID(&ceguidBackUp);
>
>
> if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
>
>
> if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS))
> {
> return FALSE;
> }
>
> HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
>
> if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> CEOID ceoidFind = 0;
>
> while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> HANDLE hDBOpened = INVALID_HANDLE_VALUE;
>
> hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBOpened == INVALID_HANDLE_VALUE) {
> DWORD error = GetLastError();
> return FALSE;
> }
>
> BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
>
> CEOIDINFOEX cdDb;
> CEOID ceoidFindRecorde = NULL;
> CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
> CEOID ceoidDBaseCopy = 0;
>
> if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
> &hDBOpenedInfo.infDatabase))) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
>
> HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
> hDBaseCopyHandle =
> CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
> if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
>
> DWORD dwCpt = 0;
> CEOID ceoidFindRecord = 0;
> WORD dwPropId = 0;
> CEPROPVAL* Buffer = NULL;
> DWORD dwSizeOfBuffer = 0;
> HANDLE hHeap = NULL;
> hHeap = GetProcessHeap();
> if(hHeap == NULL) return FALSE;
> while(ceoidFindRecord =
> CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap))
> dwCpt++;
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> free(Buffer);
> Buffer = NULL;
> CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> ceoidFindRecord = 0;
> DWORD dwNumberOfRecordFound = 0;
> while(dwNumberOfRecordFound++ < dwCpt) {
> ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
> CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer,
> hHeap);
> if(!ceoidFindRecord) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
> CEOID ceoidRecordAdd;
> ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
> if(!ceoidRecordAdd) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
> free(Buffer);
> Buffer = NULL;
> }
> CloseHandle(hDBaseCopyHandle);
> hDBaseCopyHandle = NULL;
> }
> if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> return TRUE;
> }
>
> MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {
>
> CEGUID ceguidCemail;
> CEGUID ceguidBackUp;
>
> CREATE_INVALIDGUID(&ceguidCemail);
> CREATE_INVALIDGUID(&ceguidBackUp);
>
> if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
> if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
> return FALSE;
> }
>
> HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
>
> if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
> CEOID ceoidFind = 0;
>
>
> /// Clear Old Values
> HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
> CEOID oldid = 0;
> if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
> HANDLE oldHandle = INVALID_HANDLE_VALUE;
>
> oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;
>
> BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
> hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return
> FALSE;
>
> DWORD dwOldCpt = 0;
> CEOID ceoOldidFindRecord = 0;
> WORD dwOldPropId = 0;
> CEPROPVAL* oldBuffer = NULL;
> DWORD dwOldSizeOfBuffer = 0;
> HANDLE hOldHeap = NULL;
> hOldHeap = GetProcessHeap();
> if(hOldHeap == NULL) return FALSE;
> while(ceoOldidFindRecord =
> CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap))
> dwOldCpt++;
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> free(oldBuffer);
> oldBuffer = NULL;
> CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> ceoOldidFindRecord = 0;
> DWORD dwOldNumberOfRecordFound = 0;
> while(dwOldNumberOfRecordFound++ < dwOldCpt) {
> ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
> CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,
> &dwOldSizeOfBuffer,
> hOldHeap);
> CeDeleteRecord(oldHandle,ceoOldidFindRecord);
> }
> CloseHandle(oldHandle);
> oldHandle = NULL;
> }
> CloseHandle(hRemoveHandle);
> hRemoveHandle = NULL;
>
> while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
>
> HANDLE hDBOpened = INVALID_HANDLE_VALUE;
>
> hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBOpened == INVALID_HANDLE_VALUE) {
> DWORD error = GetLastError();
> return FALSE;
> }
> BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> return FALSE;
> }
>
> CEOID ceoidDBaseOriginal = 0;
> HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
> hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
> &ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> WORD dwPropId = 0;
> CEPROPVAL* Buffer = NULL;
> DWORD dwSizeOfBuffer = 0;
> HANDLE hHeap = NULL;
> hHeap = GetProcessHeap();
> if(hHeap == NULL) return FALSE;
> BOOL bDBIsEmpty = FALSE;
> CEOID ceoidFindRecord = 0;
> while(!bDBIsEmpty) {
>
> ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
> &dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> if(!ceoidFindRecord) {
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
> else bDBIsEmpty = TRUE;
> } else {
> CEPROPVAL* temp;
> temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
> memcpy(temp, Buffer, dwSizeOfBuffer);
> CEOID ceoidRecordAdd = 0;
>
> ceoidRecordAdd =
> CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal,
> temp[1].val.uiVal,
> (CEPROPVAL *)(temp[0].val.blob.lpb));
> if(!ceoidRecordAdd) return FALSE;
> free(temp);
> temp = NULL;
> free(Buffer);
> Buffer = NULL;
> }
> }
>
> }
> if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> return TRUE;
> }
>
>


Re: Backup / Restore cemail.vol by Jeremy

Jeremy
Thu Feb 22 13:32:40 CST 2007

I remember looking at CEMAPI but it didnt seem like it had anything where I
could just create a message that I had saved and make it appear the same way
as it had. Wouldnt CEMAPI force me to send a message to myself pretty much.

Would changing the backup property call to do :

CeWriteRecordProps(hDBaseCopyHandle,Buffer[2].val.ulVal,Buffer[1].val.uiVal,Buffer);

instead of:

CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);

retain the oid? I cant really tell on my main test unit because I have fried
the cemail.vol so bad.

"Peter Foot [MVP]" wrote:

> You shouldn't try to directly backup/restore the databases because they
> contain links to Oids in other tables. Since Oids are assigned by the
> database engine and not persisted in a backup they will be invalid when you
> restore. You'd be better to use CEMAPI enumerate the accounts, folders and
> messages and persist in some format of your own choice, then use CEMAPI to
> write them back again. This would also allow you backup/restore across
> different OS versions.
>
> Peter
>
> --
> Peter Foot
> Device Application Development MVP
> www.peterfoot.net | www.inthehand.com
>
> "Jeremy" <Jeremy@discussions.microsoft.com> wrote in message
> news:ADCD5658-948B-40D8-B728-5D6297414863@microsoft.com...
> >I am trying to make a backup and restoration of cemail.vol by piecing
> > together some code found on line. Here is my C++ Calls: On top of the code
> > below I backup everything in \windows\Messaging. The backup seems to work
> > right but when I go to restore Outlook is seriously messed up SMS messages
> > display as "Up" with an arrow, MMS is gone and folders are kind of weird.
> >
> > Anyone have any idea what is going on here?
> >
> > MOBILEVOLUME_API BOOL BackupMail() {
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> >
> > if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS))
> > {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > CEOID ceoidFind = 0;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> >
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > CEOIDINFOEX cdDb;
> > CEOID ceoidFindRecorde = NULL;
> > CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
> > CEOID ceoidDBaseCopy = 0;
> >
> > if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
> > &hDBOpenedInfo.infDatabase))) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> > HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
> > hDBaseCopyHandle =
> > CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
> > if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > DWORD dwCpt = 0;
> > CEOID ceoidFindRecord = 0;
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > while(ceoidFindRecord =
> > CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap))
> > dwCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(Buffer);
> > Buffer = NULL;
> > CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoidFindRecord = 0;
> > DWORD dwNumberOfRecordFound = 0;
> > while(dwNumberOfRecordFound++ < dwCpt) {
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
> > CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer,
> > hHeap);
> > if(!ceoidFindRecord) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > CEOID ceoidRecordAdd;
> > ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
> > if(!ceoidRecordAdd) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > free(Buffer);
> > Buffer = NULL;
> > }
> > CloseHandle(hDBaseCopyHandle);
> > hDBaseCopyHandle = NULL;
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> > MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {
> >
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> > if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> > CEOID ceoidFind = 0;
> >
> >
> > /// Clear Old Values
> > HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
> > CEOID oldid = 0;
> > if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
> > HANDLE oldHandle = INVALID_HANDLE_VALUE;
> >
> > oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;
> >
> > BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
> > hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return
> > FALSE;
> >
> > DWORD dwOldCpt = 0;
> > CEOID ceoOldidFindRecord = 0;
> > WORD dwOldPropId = 0;
> > CEPROPVAL* oldBuffer = NULL;
> > DWORD dwOldSizeOfBuffer = 0;
> > HANDLE hOldHeap = NULL;
> > hOldHeap = GetProcessHeap();
> > if(hOldHeap == NULL) return FALSE;
> > while(ceoOldidFindRecord =
> > CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap))
> > dwOldCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(oldBuffer);
> > oldBuffer = NULL;
> > CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoOldidFindRecord = 0;
> > DWORD dwOldNumberOfRecordFound = 0;
> > while(dwOldNumberOfRecordFound++ < dwOldCpt) {
> > ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
> > CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,
> > &dwOldSizeOfBuffer,
> > hOldHeap);
> > CeDeleteRecord(oldHandle,ceoOldidFindRecord);
> > }
> > CloseHandle(oldHandle);
> > oldHandle = NULL;
> > }
> > CloseHandle(hRemoveHandle);
> > hRemoveHandle = NULL;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> >
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > return FALSE;
> > }
> >
> > CEOID ceoidDBaseOriginal = 0;
> > HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
> > hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
> > &ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > BOOL bDBIsEmpty = FALSE;
> > CEOID ceoidFindRecord = 0;
> > while(!bDBIsEmpty) {
> >
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
> > &dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> > if(!ceoidFindRecord) {
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
> > else bDBIsEmpty = TRUE;
> > } else {
> > CEPROPVAL* temp;
> > temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
> > memcpy(temp, Buffer, dwSizeOfBuffer);
> > CEOID ceoidRecordAdd = 0;
> >
> > ceoidRecordAdd =
> > CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal,
> > temp[1].val.uiVal,
> > (CEPROPVAL *)(temp[0].val.blob.lpb));
> > if(!ceoidRecordAdd) return FALSE;
> > free(temp);
> > temp = NULL;
> > free(Buffer);
> > Buffer = NULL;
> > }
> > }
> >
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> >
>

Re: Backup / Restore cemail.vol by Jeremy

Jeremy
Thu Feb 22 14:26:17 CST 2007

You dont know of any examples to interate all the messages do you, I am
looking through

http://msdn2.microsoft.com/en-us/library/ms879918.aspx

and I dont see any way into it.

Thanks,
Jeremy

"Peter Foot [MVP]" wrote:

> You shouldn't try to directly backup/restore the databases because they
> contain links to Oids in other tables. Since Oids are assigned by the
> database engine and not persisted in a backup they will be invalid when you
> restore. You'd be better to use CEMAPI enumerate the accounts, folders and
> messages and persist in some format of your own choice, then use CEMAPI to
> write them back again. This would also allow you backup/restore across
> different OS versions.
>
> Peter
>
> --
> Peter Foot
> Device Application Development MVP
> www.peterfoot.net | www.inthehand.com
>
> "Jeremy" <Jeremy@discussions.microsoft.com> wrote in message
> news:ADCD5658-948B-40D8-B728-5D6297414863@microsoft.com...
> >I am trying to make a backup and restoration of cemail.vol by piecing
> > together some code found on line. Here is my C++ Calls: On top of the code
> > below I backup everything in \windows\Messaging. The backup seems to work
> > right but when I go to restore Outlook is seriously messed up SMS messages
> > display as "Up" with an arrow, MMS is gone and folders are kind of weird.
> >
> > Anyone have any idea what is going on here?
> >
> > MOBILEVOLUME_API BOOL BackupMail() {
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> >
> > if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS))
> > {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > CEOID ceoidFind = 0;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> >
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > CEOIDINFOEX cdDb;
> > CEOID ceoidFindRecorde = NULL;
> > CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
> > CEOID ceoidDBaseCopy = 0;
> >
> > if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
> > &hDBOpenedInfo.infDatabase))) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> > HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
> > hDBaseCopyHandle =
> > CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
> > if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > DWORD dwCpt = 0;
> > CEOID ceoidFindRecord = 0;
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > while(ceoidFindRecord =
> > CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap))
> > dwCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(Buffer);
> > Buffer = NULL;
> > CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoidFindRecord = 0;
> > DWORD dwNumberOfRecordFound = 0;
> > while(dwNumberOfRecordFound++ < dwCpt) {
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
> > CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer,
> > hHeap);
> > if(!ceoidFindRecord) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > CEOID ceoidRecordAdd;
> > ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
> > if(!ceoidRecordAdd) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > free(Buffer);
> > Buffer = NULL;
> > }
> > CloseHandle(hDBaseCopyHandle);
> > hDBaseCopyHandle = NULL;
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> > MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {
> >
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> > if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> > CEOID ceoidFind = 0;
> >
> >
> > /// Clear Old Values
> > HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
> > CEOID oldid = 0;
> > if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
> > HANDLE oldHandle = INVALID_HANDLE_VALUE;
> >
> > oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;
> >
> > BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
> > hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return
> > FALSE;
> >
> > DWORD dwOldCpt = 0;
> > CEOID ceoOldidFindRecord = 0;
> > WORD dwOldPropId = 0;
> > CEPROPVAL* oldBuffer = NULL;
> > DWORD dwOldSizeOfBuffer = 0;
> > HANDLE hOldHeap = NULL;
> > hOldHeap = GetProcessHeap();
> > if(hOldHeap == NULL) return FALSE;
> > while(ceoOldidFindRecord =
> > CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap))
> > dwOldCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(oldBuffer);
> > oldBuffer = NULL;
> > CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoOldidFindRecord = 0;
> > DWORD dwOldNumberOfRecordFound = 0;
> > while(dwOldNumberOfRecordFound++ < dwOldCpt) {
> > ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
> > CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,
> > &dwOldSizeOfBuffer,
> > hOldHeap);
> > CeDeleteRecord(oldHandle,ceoOldidFindRecord);
> > }
> > CloseHandle(oldHandle);
> > oldHandle = NULL;
> > }
> > CloseHandle(hRemoveHandle);
> > hRemoveHandle = NULL;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> >
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > return FALSE;
> > }
> >
> > CEOID ceoidDBaseOriginal = 0;
> > HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
> > hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
> > &ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > BOOL bDBIsEmpty = FALSE;
> > CEOID ceoidFindRecord = 0;
> > while(!bDBIsEmpty) {
> >
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
> > &dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> > if(!ceoidFindRecord) {
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
> > else bDBIsEmpty = TRUE;
> > } else {
> > CEPROPVAL* temp;
> > temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
> > memcpy(temp, Buffer, dwSizeOfBuffer);
> > CEOID ceoidRecordAdd = 0;
> >
> > ceoidRecordAdd =
> > CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal,
> > temp[1].val.uiVal,
> > (CEPROPVAL *)(temp[0].val.blob.lpb));
> > if(!ceoidRecordAdd) return FALSE;
> > free(temp);
> > temp = NULL;
> > free(Buffer);
> > Buffer = NULL;
> > }
> > }
> >
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> >
>

Re: Backup / Restore cemail.vol by Jeremy

Jeremy
Thu Feb 22 15:10:34 CST 2007

ok so wait a min, I think I have the idea, so pmailMsgs references OID to
records in PMailFolders so if I am creating a new oid and deleting the
current ones to try and restor eit will just mess everything up. So what I
should be doing is just restoring items that currently do not exist. I know
originally I tried this and everything restored it just was that there was 2
of everything. Is there anyway when I backup to set the current OID so I can
test if it already exists? It seems like OID acts as an auto index that I can
not overwrite because everytime I call CeWriteRecordProps and pass it an oid
it fails.

Am I on the right track here?

Someone should write a book on this.

Thanks again

"Peter Foot [MVP]" wrote:

> You shouldn't try to directly backup/restore the databases because they
> contain links to Oids in other tables. Since Oids are assigned by the
> database engine and not persisted in a backup they will be invalid when you
> restore. You'd be better to use CEMAPI enumerate the accounts, folders and
> messages and persist in some format of your own choice, then use CEMAPI to
> write them back again. This would also allow you backup/restore across
> different OS versions.
>
> Peter
>
> --
> Peter Foot
> Device Application Development MVP
> www.peterfoot.net | www.inthehand.com
>
> "Jeremy" <Jeremy@discussions.microsoft.com> wrote in message
> news:ADCD5658-948B-40D8-B728-5D6297414863@microsoft.com...
> >I am trying to make a backup and restoration of cemail.vol by piecing
> > together some code found on line. Here is my C++ Calls: On top of the code
> > below I backup everything in \windows\Messaging. The backup seems to work
> > right but when I go to restore Outlook is seriously messed up SMS messages
> > display as "Up" with an arrow, MMS is gone and folders are kind of weird.
> >
> > Anyone have any idea what is going on here?
> >
> > MOBILEVOLUME_API BOOL BackupMail() {
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> >
> > if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS))
> > {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > CEOID ceoidFind = 0;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> >
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > CEOIDINFOEX cdDb;
> > CEOID ceoidFindRecorde = NULL;
> > CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
> > CEOID ceoidDBaseCopy = 0;
> >
> > if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
> > &hDBOpenedInfo.infDatabase))) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> >
> > HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
> > hDBaseCopyHandle =
> > CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
> > if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> >
> > DWORD dwCpt = 0;
> > CEOID ceoidFindRecord = 0;
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > while(ceoidFindRecord =
> > CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap))
> > dwCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(Buffer);
> > Buffer = NULL;
> > CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoidFindRecord = 0;
> > DWORD dwNumberOfRecordFound = 0;
> > while(dwNumberOfRecordFound++ < dwCpt) {
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
> > CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer,
> > hHeap);
> > if(!ceoidFindRecord) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > CEOID ceoidRecordAdd;
> > ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
> > if(!ceoidRecordAdd) {
> > DWORD dwError = GetLastError();
> > return FALSE;
> > }
> > free(Buffer);
> > Buffer = NULL;
> > }
> > CloseHandle(hDBaseCopyHandle);
> > hDBaseCopyHandle = NULL;
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> > MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {
> >
> > CEGUID ceguidCemail;
> > CEGUID ceguidBackUp;
> >
> > CREATE_INVALIDGUID(&ceguidCemail);
> > CREATE_INVALIDGUID(&ceguidBackUp);
> >
> > if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> > DWORD dwErro = GetLastError();
> > return FALSE;
> > }
> > if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
> > return FALSE;
> > }
> >
> > HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
> >
> > if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> > CEOID ceoidFind = 0;
> >
> >
> > /// Clear Old Values
> > HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
> > CEOID oldid = 0;
> > if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> > INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
> > HANDLE oldHandle = INVALID_HANDLE_VALUE;
> >
> > oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;
> >
> > BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
> > hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return
> > FALSE;
> >
> > DWORD dwOldCpt = 0;
> > CEOID ceoOldidFindRecord = 0;
> > WORD dwOldPropId = 0;
> > CEPROPVAL* oldBuffer = NULL;
> > DWORD dwOldSizeOfBuffer = 0;
> > HANDLE hOldHeap = NULL;
> > hOldHeap = GetProcessHeap();
> > if(hOldHeap == NULL) return FALSE;
> > while(ceoOldidFindRecord =
> > CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap))
> > dwOldCpt++;
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> > free(oldBuffer);
> > oldBuffer = NULL;
> > CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> > ceoOldidFindRecord = 0;
> > DWORD dwOldNumberOfRecordFound = 0;
> > while(dwOldNumberOfRecordFound++ < dwOldCpt) {
> > ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
> > CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,
> > &dwOldSizeOfBuffer,
> > hOldHeap);
> > CeDeleteRecord(oldHandle,ceoOldidFindRecord);
> > }
> > CloseHandle(oldHandle);
> > oldHandle = NULL;
> > }
> > CloseHandle(hRemoveHandle);
> > hRemoveHandle = NULL;
> >
> > while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> >
> > HANDLE hDBOpened = INVALID_HANDLE_VALUE;
> >
> > hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBOpened == INVALID_HANDLE_VALUE) {
> > DWORD error = GetLastError();
> > return FALSE;
> > }
> > BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> > hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> > if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> > return FALSE;
> > }
> >
> > CEOID ceoidDBaseOriginal = 0;
> > HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
> > hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
> > &ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
> > CEDB_AUTOINCREMENT, NULL);
> > if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
> > return FALSE;
> > }
> >
> > WORD dwPropId = 0;
> > CEPROPVAL* Buffer = NULL;
> > DWORD dwSizeOfBuffer = 0;
> > HANDLE hHeap = NULL;
> > hHeap = GetProcessHeap();
> > if(hHeap == NULL) return FALSE;
> > BOOL bDBIsEmpty = FALSE;
> > CEOID ceoidFindRecord = 0;
> > while(!bDBIsEmpty) {
> >
> > ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
> > &dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> > if(!ceoidFindRecord) {
> > if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
> > else bDBIsEmpty = TRUE;
> > } else {
> > CEPROPVAL* temp;
> > temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
> > memcpy(temp, Buffer, dwSizeOfBuffer);
> > CEOID ceoidRecordAdd = 0;
> >
> > ceoidRecordAdd =
> > CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal,
> > temp[1].val.uiVal,
> > (CEPROPVAL *)(temp[0].val.blob.lpb));
> > if(!ceoidRecordAdd) return FALSE;
> > free(temp);
> > temp = NULL;
> > free(Buffer);
> > Buffer = NULL;
> > }
> > }
> >
> > }
> > if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> > if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> > if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> > return TRUE;
> > }
> >
> >
>

RE: Backup / Restore cemail.vol by Jeremy

Jeremy
Wed Mar 07 12:36:12 CST 2007

For the record I got this to work, and I got it to work from mostly within
DotNet.

I do it just like any other DB move and had to map out each auto generated
index within the system and update them via there self retained index values
from within there properties.


"Jeremy" wrote:

> I am trying to make a backup and restoration of cemail.vol by piecing
> together some code found on line. Here is my C++ Calls: On top of the code
> below I backup everything in \windows\Messaging. The backup seems to work
> right but when I go to restore Outlook is seriously messed up SMS messages
> display as "Up" with an arrow, MMS is gone and folders are kind of weird.
>
> Anyone have any idea what is going on here?
>
> MOBILEVOLUME_API BOOL BackupMail() {
> CEGUID ceguidCemail;
> CEGUID ceguidBackUp;
>
> CREATE_INVALIDGUID(&ceguidCemail);
> CREATE_INVALIDGUID(&ceguidBackUp);
>
>
> if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
>
>
> if(!CeMountDBVol( &ceguidBackUp, L"\\cemail_backup.vol", CREATE_ALWAYS)) {
> return FALSE;
> }
>
> HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
>
> if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> CEOID ceoidFind = 0;
>
> while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
> HANDLE hDBOpened = INVALID_HANDLE_VALUE;
>
> hDBOpened = CeOpenDatabaseEx(&ceguidCemail,&ceoidFind, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBOpened == INVALID_HANDLE_VALUE) {
> DWORD error = GetLastError();
> return FALSE;
> }
>
> BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
>
> CEOIDINFOEX cdDb;
> CEOID ceoidFindRecorde = NULL;
> CeOidGetInfoEx2(&ceguidCemail,ceoidFindRecorde, &cdDb);
> CEOID ceoidDBaseCopy = 0;
>
> if(!(ceoidDBaseCopy = CeCreateDatabaseEx2(&ceguidBackUp,
> &hDBOpenedInfo.infDatabase))) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
>
> HANDLE hDBaseCopyHandle = INVALID_HANDLE_VALUE;
> hDBaseCopyHandle =
> CeOpenDatabaseEx(&ceguidBackUp,&ceoidDBaseCopy,hDBOpenedInfo.infDatabase.szDbaseName,0,CEDB_AUTOINCREMENT,NULL);
> if(hDBaseCopyHandle == INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBaseCopyHandle, &hDBOpenedInfo)) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
>
> DWORD dwCpt = 0;
> CEOID ceoidFindRecord = 0;
> WORD dwPropId = 0;
> CEPROPVAL* Buffer = NULL;
> DWORD dwSizeOfBuffer = 0;
> HANDLE hHeap = NULL;
> hHeap = GetProcessHeap();
> if(hHeap == NULL) return FALSE;
> while(ceoidFindRecord =
> CeReadRecordPropsEx(hDBOpened,CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer,&dwSizeOfBuffer,hHeap)) dwCpt++;
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> free(Buffer);
> Buffer = NULL;
> CeSeekDatabaseEx(hDBOpened, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> ceoidFindRecord = 0;
> DWORD dwNumberOfRecordFound = 0;
> while(dwNumberOfRecordFound++ < dwCpt) {
> ceoidFindRecord = CeReadRecordPropsEx(hDBOpened,
> CEDB_ALLOWREALLOC,&dwPropId,NULL,(LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> if(!ceoidFindRecord) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
> CEOID ceoidRecordAdd;
> ceoidRecordAdd = CeWriteRecordProps(hDBaseCopyHandle,0,dwPropId,Buffer);
> if(!ceoidRecordAdd) {
> DWORD dwError = GetLastError();
> return FALSE;
> }
> free(Buffer);
> Buffer = NULL;
> }
> CloseHandle(hDBaseCopyHandle);
> hDBaseCopyHandle = NULL;
> }
> if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> return TRUE;
> }
>
> MOBILEVOLUME_API BOOL RestoreMail(LPWSTR fileLocation) {
>
> CEGUID ceguidCemail;
> CEGUID ceguidBackUp;
>
> CREATE_INVALIDGUID(&ceguidCemail);
> CREATE_INVALIDGUID(&ceguidBackUp);
>
> if(!CeMountDBVol(&ceguidCemail, L"cemail.vol", OPEN_EXISTING)) {
> DWORD dwErro = GetLastError();
> return FALSE;
> }
> if(!CeMountDBVol( &ceguidBackUp, fileLocation, OPEN_EXISTING)) {
> return FALSE;
> }
>
> HANDLE hDatabaseEnumHandle = INVALID_HANDLE_VALUE;
>
> if((hDatabaseEnumHandle = CeFindFirstDatabaseEx(&ceguidBackUp, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
> CEOID ceoidFind = 0;
>
>
> /// Clear Old Values
> HANDLE hRemoveHandle = INVALID_HANDLE_VALUE;
> CEOID oldid = 0;
> if((hRemoveHandle = CeFindFirstDatabaseEx(&ceguidCemail, 0)) ==
> INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> while(oldid = CeFindNextDatabaseEx(hRemoveHandle, NULL)) {
> HANDLE oldHandle = INVALID_HANDLE_VALUE;
>
> oldHandle = CeOpenDatabaseEx(&ceguidCemail,&oldid, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(oldHandle == INVALID_HANDLE_VALUE) return FALSE;
>
> BY_HANDLE_DB_INFORMATION hDBOldOpenedInfo;
> hDBOldOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(oldHandle, &hDBOldOpenedInfo)) return FALSE;
>
> DWORD dwOldCpt = 0;
> CEOID ceoOldidFindRecord = 0;
> WORD dwOldPropId = 0;
> CEPROPVAL* oldBuffer = NULL;
> DWORD dwOldSizeOfBuffer = 0;
> HANDLE hOldHeap = NULL;
> hOldHeap = GetProcessHeap();
> if(hOldHeap == NULL) return FALSE;
> while(ceoOldidFindRecord =
> CeReadRecordPropsEx(oldHandle,CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer,&dwOldSizeOfBuffer,hOldHeap)) dwOldCpt++;
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return false;
> free(oldBuffer);
> oldBuffer = NULL;
> CeSeekDatabaseEx(oldHandle, CEDB_SEEK_BEGINNING, 0, 0, NULL);
> ceoOldidFindRecord = 0;
> DWORD dwOldNumberOfRecordFound = 0;
> while(dwOldNumberOfRecordFound++ < dwOldCpt) {
> ceoOldidFindRecord = CeReadRecordPropsEx(oldHandle,
> CEDB_ALLOWREALLOC,&dwOldPropId,NULL,(LPBYTE*)&oldBuffer, &dwOldSizeOfBuffer,
> hOldHeap);
> CeDeleteRecord(oldHandle,ceoOldidFindRecord);
> }
> CloseHandle(oldHandle);
> oldHandle = NULL;
> }
> CloseHandle(hRemoveHandle);
> hRemoveHandle = NULL;
>
> while(ceoidFind = CeFindNextDatabaseEx(hDatabaseEnumHandle, NULL)) {
>
> HANDLE hDBOpened = INVALID_HANDLE_VALUE;
>
> hDBOpened = CeOpenDatabaseEx(&ceguidBackUp,&ceoidFind, NULL, NULL,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBOpened == INVALID_HANDLE_VALUE) {
> DWORD error = GetLastError();
> return FALSE;
> }
> BY_HANDLE_DB_INFORMATION hDBOpenedInfo;
> hDBOpenedInfo.wVersion = BY_HANDLE_DB_INFORMATION_VERSION;
> if(!CeGetDBInformationByHandle(hDBOpened, &hDBOpenedInfo)) {
> return FALSE;
> }
>
> CEOID ceoidDBaseOriginal = 0;
> HANDLE hDBaseOriginalHandle = INVALID_HANDLE_VALUE;
> hDBaseOriginalHandle = CeOpenDatabaseEx2(&ceguidCemail,
> &ceoidDBaseOriginal, hDBOpenedInfo.infDatabase.szDbaseName, NULL ,
> CEDB_AUTOINCREMENT, NULL);
> if(hDBaseOriginalHandle == INVALID_HANDLE_VALUE) {
> return FALSE;
> }
>
> WORD dwPropId = 0;
> CEPROPVAL* Buffer = NULL;
> DWORD dwSizeOfBuffer = 0;
> HANDLE hHeap = NULL;
> hHeap = GetProcessHeap();
> if(hHeap == NULL) return FALSE;
> BOOL bDBIsEmpty = FALSE;
> CEOID ceoidFindRecord = 0;
> while(!bDBIsEmpty) {
>
> ceoidFindRecord = CeReadRecordPropsEx(hDBOpened, CEDB_ALLOWREALLOC,
> &dwPropId, NULL, (LPBYTE*)&Buffer, &dwSizeOfBuffer, hHeap);
> if(!ceoidFindRecord) {
> if(GetLastError() != ERROR_NO_MORE_ITEMS) return FALSE;
> else bDBIsEmpty = TRUE;
> } else {
> CEPROPVAL* temp;
> temp = (CEPROPVAL*) malloc(dwSizeOfBuffer);
> memcpy(temp, Buffer, dwSizeOfBuffer);
> CEOID ceoidRecordAdd = 0;
>
> ceoidRecordAdd =
> CeWriteRecordProps(hDBaseOriginalHandle,temp[2].val.ulVal, temp[1].val.uiVal,
> (CEPROPVAL *)(temp[0].val.blob.lpb));
> if(!ceoidRecordAdd) return FALSE;
> free(temp);
> temp = NULL;
> free(Buffer);
> Buffer = NULL;
> }
> }
>
> }
> if(!CeFlushDBVol(&ceguidCemail)) return FALSE;
> if(!CeFlushDBVol(&ceguidBackUp)) return FALSE;
> if(!CeUnmountDBVol(&ceguidCemail)) return FALSE;
> if(!CeUnmountDBVol(&ceguidBackUp)) return FALSE;
> return TRUE;
> }
>
>

RE: restoring cemail.vol by Jeremy

Jeremy
Tue Mar 13 08:44:03 CDT 2007

Its an ugly restoration process and the only real value of it is reinstating
pointers to files to view them in pocket outlook, did you backup your
messaging folder also? That is where the emails really reside.

"Maz" wrote:

> hello, i saw that you managed to get cemail.vol to work, i desperatly need to restore my messages from some time ago. i have the cemail.vol file, i just need to find a way to restore it as you can't copy and paste. thanks so much for your time
> Maz
>
> EggHeadCafe.com - .NET Developer Portal of Choice
> http://www.eggheadcafe.com
>