📄 wdei2mem.c
字号:
WdeDialogBoxControl *control;
LIST *prev_control;
int index, pad;
uint_8 *d;
Bool ok;
Bool is32bitEx = FALSE;
uint_16 signa[2];
dbi = NULL;
ok = ( data && size );
if( ok ) {
d = data;
dbi = (WdeDialogBoxInfo *) WdeMemAlloc( sizeof(WdeDialogBoxInfo) );
ok = ( dbi != NULL );
}
if( ok ) {
/* check if the dialog is extended by testing for the signature */
memcpy(signa, data, sizeof(signa));
is32bitEx = (signa[0] == 0x0001 && signa[1] == 0xFFFF);
dbi->control_list = NULL;
dbi->MemoryFlags = 0;
if (is32bitEx) {
dbi->dialog_header = WdeMem2DialogBoxExHeader( &data );
} else {
dbi->dialog_header = WdeMem2DialogBoxHeader( &data, is32bit );
}
ok = ( dbi->dialog_header != NULL );
}
if( ok ) {
prev_control = NULL;
for( index = 0; index < GETHDR_NUMITEMS(dbi->dialog_header); index++ ) {
if( is32bit ) {
pad = CALC_PAD( data - d, sizeof(uint_32) );
data += pad;
}
control = WdeMem2DialogBoxControl( &data, is32bit, is32bitEx );
if( control == NULL ) {
ok = FALSE;
break;
}
if ( prev_control == NULL ) {
ListAddElt( &(dbi->control_list), (void *) control);
prev_control = dbi->control_list;
} else {
ListInsertElt( prev_control, (void *) control);
prev_control = ListNext(prev_control);
}
}
}
if( ok ) {
ok = ( size >= ( data - d ) );
}
if( !ok ) {
if( dbi ) {
WdeFreeDialogBoxInfo( dbi );
dbi = NULL;
}
}
return ( dbi );
}
WdeDialogBoxHeader *WdeMem2DialogBoxHeader( uint_8 **data, Bool is32bit )
{
DialogBoxHeader32 *h32;
DialogBoxHeader *h16;
WdeDialogBoxHeader *dbh;
int fixedbytes;
Bool ok;
dbh = NULL;
ok = ( data && *data );
if( ok ) {
dbh = WdeAllocDialogBoxHeader();
ok = ( dbh != NULL );
}
if( ok ) {
dbh->symbol = NULL;
dbh->helpsymbol = NULL;
dbh->is32bit = is32bit;
dbh->is32bitEx = FALSE;
if( is32bit ) {
fixedbytes = offsetof( DialogBoxHeader32, MenuName );
h32 = (DialogBoxHeader32 *)*data;
dbh->Style = h32->Style;
dbh->ExtendedStyle = h32->ExtendedStyle;
dbh->NumOfItems = h32->NumOfItems;
dbh->Size = h32->Size;
} else {
fixedbytes = offsetof( DialogBoxHeader, MenuName );
h16 = (DialogBoxHeader *)*data;
dbh->Style = h16->Style;
dbh->NumOfItems = h16->NumOfItems;
dbh->Size = h16->Size;
}
*data += fixedbytes;
SETHDR_MENUNAME(dbh, WdeMem2NameOrOrdinal( data, is32bit ) );
ok = ( GETHDR_MENUNAME(dbh) != NULL );
}
if( ok ) {
SETHDR_CLASSNAME( dbh, WdeMem2NameOrOrdinal( data, is32bit ) );
ok = ( GETHDR_CLASSNAME(dbh) != NULL );
}
if( ok ) {
SETHDR_CAPTION( dbh, WdeMem2String( data, is32bit ) );
ok = ( GETHDR_CAPTION(dbh) != NULL );
}
if( ok ) {
if( GETHDR_STYLE(dbh) & DS_SETFONT ) {
SETHDR_POINTSIZE( dbh, *( (uint_16 *)*data ) );
*data += sizeof(uint_16);
SETHDR_FONTNAME( dbh, WdeMem2String( data, is32bit ) );
ok = ( GETHDR_FONTNAME(dbh) != NULL );
} else {
SETHDR_POINTSIZE( dbh, 0 );
SETHDR_FONTNAME( dbh, NULL );
}
}
if( !ok ) {
if( dbh ) {
WdeFreeDialogBoxHeader ( &dbh );
}
}
return( dbh );
}
WdeDialogBoxHeader *WdeMem2DialogBoxExHeader( uint_8 **data )
{
uint_16 miscbytes[2] = { 0x0001, 0xFFFF };
WdeDialogBoxHeader *dbh;
Bool ok;
dbh = NULL;
if ( !data || !*data ) {
return(NULL);
}
dbh = WdeAllocDialogBoxHeader();
if ( dbh == NULL ) {
return(NULL);
}
dbh->is32bit = TRUE;
dbh->is32bitEx = TRUE;
/* skip the miscellaneous two WORDs 01 00 FF FF */
*data += sizeof(miscbytes);
memcpy( &dbh->HelpId, *data, sizeof(uint_32) );
*data += sizeof(uint_32);
memcpy( &dbh->ExtendedStyle, *data, sizeof(uint_32) );
*data += sizeof(uint_32);
memcpy( &dbh->Style, *data, sizeof(uint_32) );
*data += sizeof(uint_32);
memcpy( &dbh->NumOfItems, *data, sizeof(uint_16) );
*data += sizeof(uint_16);
memcpy( &dbh->Size, *data, sizeof(DialogSizeInfo) );
*data += sizeof(DialogSizeInfo);
SETHDR_MENUNAME(dbh, WdeMem2NameOrOrdinal( data, TRUE ) );
ok = ( GETHDR_MENUNAME(dbh) != NULL );
if( ok ) {
SETHDR_CLASSNAME( dbh, WdeMem2NameOrOrdinal( data, TRUE ) );
ok = ( GETHDR_CLASSNAME(dbh) != NULL );
}
if( ok ) {
SETHDR_CAPTION( dbh, WdeMem2String( data, TRUE ) );
ok = ( GETHDR_CAPTION(dbh) != NULL );
}
if( ok ) {
if( GETHDR_STYLE(dbh) & DS_SETFONT ) {
dbh->FontWeightDefined = TRUE;
dbh->FontItalicDefined = TRUE;
SETHDR_POINTSIZE( dbh, *((uint_16 *)*data) );
*data += sizeof(uint_16);
SETHDR_FONTWEIGHT( dbh, *((uint_16 *)*data) );
*data += sizeof(uint_16);
SETHDR_FONTITALIC( dbh, *((uint_16 *)*data) );
*data += sizeof(uint_16);
SETHDR_FONTNAME( dbh, WdeMem2String( data, TRUE ) );
ok = ( GETHDR_FONTNAME(dbh) != NULL );
}
}
if( !ok ) {
if( dbh ) {
WdeFreeDialogBoxHeader ( &dbh );
}
}
return( dbh );
}
WdeDialogBoxControl *WdeMem2DialogBoxControl( uint_8 **data, Bool is32bit,
Bool is32bitEx )
{
DialogBoxControl *c16;
DialogBoxControl32 *c32;
DialogBoxExControl32 *c32ex;
WdeDialogBoxControl *dbc;
int fixedbytes;
Bool ok;
dbc = NULL;
ok = ( data && *data );
if( ok ) {
dbc = WdeAllocDialogBoxControl();
ok = ( dbc != NULL );
}
if( ok ) {
if( is32bit ) {
if (is32bitEx) {
fixedbytes = offsetof( DialogBoxExControl32, ClassID );
c32ex = (DialogBoxExControl32 *) *data;
dbc->HelpId = c32ex->HelpId;
dbc->Style = c32ex->Style;
dbc->ExtendedStyle = c32ex->ExtendedStyle;
dbc->Size = c32ex->Size;
dbc->ID = c32ex->ID;
} else {
fixedbytes = offsetof( DialogBoxControl32, ClassID );
c32 = (DialogBoxControl32 *) *data;
dbc->Style = c32->Style;
dbc->ExtendedStyle = c32->ExtendedStyle;
dbc->Size = c32->Size;
dbc->ID = c32->ID;
}
} else {
fixedbytes = offsetof( DialogBoxControl, ClassID );
c16 = (DialogBoxControl *) *data;
dbc->Size = c16->Size;
dbc->ID = c16->ID;
dbc->Style = c16->Style;
}
*data += fixedbytes;
SETCTL_CLASSID( dbc, WdeMem2ControlClass(data, is32bit) );
ok = ( GETCTL_CLASSID(dbc) != NULL );
}
if( ok ) {
SETCTL_TEXT(dbc, WdeMem2NameOrOrdinal(data, is32bit) );
ok = ( GETCTL_TEXT(dbc) != NULL );
}
if( ok ) {
if( is32bit ) {
if (is32bitEx) {
dbc->ExtraBytes = *((uint_16 *)*data);
} else {
dbc->ExtraBytes = *((uint_16 *)*data);
}
*data += sizeof(uint_16);
} else {
dbc->ExtraBytes = (uint_8)((*data)[0]);
*data += sizeof(uint_8);
}
} else {
if( dbc != NULL ) {
WdeFreeDialogBoxControl( &dbc );
}
}
return( dbc );
}
ResNameOrOrdinal *WdeMem2NameOrOrdinal( uint_8 **data, Bool is32bit )
{
ResNameOrOrdinal *new;
int size;
if( !data || !*data ) {
return( NULL );
}
new = WRMem2NameOrOrdinal( *data, is32bit );
if( new == NULL ) {
return( NULL );
}
size = WdeCalcSizeOfResNameOrOrdinal( new, is32bit );
if( size == 0 ) {
return( NULL );
}
*data = *data + size;
return( new );
}
ControlClass *WdeMem2ControlClass( uint_8 **data, Bool is32bit )
{
ControlClass *new;
uint_8 *data8;
uint_16 *data16;
int stringlen;
int len;
if( !data || !*data ) {
return( NULL );
}
stringlen = 0;
len = sizeof(ControlClass);
if( is32bit ) {
data16 = (uint_16 *)*data;
if( *data16 != 0xffff ) {
WRunicode2mbcs( (char *)*data, NULL, &stringlen );
len = stringlen;
}
} else {
data8 = (uint_8 *)*data;
if( ( *data8 & 0x80 ) == 0 ) {
stringlen = strlen( *data ) + 1;
len = stringlen;
}
}
new = (ControlClass *)WdeMemAlloc( len );
if( new == NULL ) {
return( NULL );
}
if( stringlen == 0 ) {
if( is32bit ) {
new->Class = data16[1] & 0x00ff;
len = sizeof(uint_16)*2;
} else {
new->Class = data8[0];
}
} else {
if( is32bit ) {
WRunicode2mbcsBuf( *data, (char *)new, len );
len *= 2;
} else {
memcpy( new, *data, len );
}
}
(*data) += len;
return( new );
}
char *WdeMem2String( uint_8 **data, Bool is32bit )
{
char *new;
int len;
if( !data || !*data ) {
return( NULL );
}
if( is32bit ) {
WRunicode2mbcs( (char *)*data, NULL, &len );
} else {
len = strlen( *data ) + 1;
}
new = WdeMemAlloc( len );
if( new == NULL ) {
return( NULL );
}
if( is32bit ) {
WRunicode2mbcsBuf( *data, (char *)new, len );
} else {
memcpy( new, *data, len );
}
len = WRStrlen( (char *)*data, is32bit ) + 1;
if( is32bit ) {
len++;
}
(*data) += len;
return( new );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -