1 /* $NetBSD: preference.c,v 1.4 2000/08/29 15:10:20 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 1999 Shin Takemura. 5 * All rights reserved. 6 * 7 * This software is part of the PocketBSD. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the PocketBSD project 20 * and its contributors. 21 * 4. Neither the name of the project nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 */ 38 #include <pbsdboot.h> 39 #include <commctrl.h> 40 #include <res/resource.h> 41 42 43 struct preference_s pref; 44 TCHAR* where_pref_load_from = NULL; 45 static TCHAR filenamebuf[1024]; 46 47 48 #define SETTING_IDX 1 49 #define FB_TYPE 2 50 #define FB_WIDTH 3 51 #define FB_HEIGHT 4 52 #define FB_LINEBYTES 5 53 #define BOOT_TIME 6 54 #define FB_ADDR 7 55 #define PLATID_CPU 8 56 #define PLATID_MACHINE 9 57 #define SETTING_NAME 10 58 #define KERNEL_NAME 11 59 #define OPTIONS 12 60 #define CHECK_LAST_CHANCE 13 61 #define LOAD_DEBUG_INFO 14 62 #define SERIAL_PORT 15 63 #define REVERSE_VIDEO 16 64 #define AUTOBOOT 17 65 66 #define NOFID 18 67 68 69 TCHAR *id_table[] = { 70 0, 71 TEXT("setting_idx"), 72 TEXT("fb_type"), 73 TEXT("fb_width"), 74 TEXT("fb_height"), 75 TEXT("fb_linebytes"), 76 TEXT("boot_time"), 77 TEXT("fb_addr"), 78 TEXT("platid_cpu"), 79 TEXT("platid_machine"), 80 TEXT("setting_name"), 81 TEXT("kernel_name"), 82 TEXT("options"), 83 TEXT("check_last_chance"), 84 TEXT("load_debug_info"), 85 TEXT("serial_port"), 86 TEXT("reverse_video"), 87 TEXT("autoboot"), 88 }; 89 90 91 92 void 93 pref_init(struct preference_s* pref) 94 { 95 memset(pref, 0, sizeof(*pref)); 96 } 97 98 99 /* 100 argument file is handle that was already opened . 101 if read is faile , this function will "not" close this handle . 102 return 0 if error . if end of file , return -1 103 */ 104 int read1byte(HANDLE file,char *c){ 105 DWORD n; 106 if(!ReadFile(file,c,sizeof(char),&n,NULL)){ 107 msg_printf(MSG_ERROR, TEXT("pref_load()"), 108 TEXT("ReadFile(): error=%d"), GetLastError()); 109 debug_printf(TEXT("ReadFile(): error=%d\r"), GetLastError()); 110 111 return 0; 112 } 113 if (n != sizeof(char)) { 114 if( n == 0){ 115 return (-1); 116 } 117 msg_printf(MSG_ERROR, TEXT("pref_load()"), 118 TEXT("ReadFile(): read %d bytes"), n); 119 debug_printf(TEXT("ReadFile(): read %d bytes\r"), n); 120 121 return 0; 122 } 123 return 1; 124 } 125 126 /* 127 argument file is handle that was already opened . 128 if write is faile, this function will "not" close this handle . 129 return 0 if error . write one line of string . 130 */ 131 int write1string(HANDLE file,char *string){ 132 DWORD n; 133 if(!WriteFile(file,string,sizeof(char)*strlen(string),&n,NULL)){ 134 msg_printf(MSG_ERROR, TEXT("pref_write()"), 135 TEXT("WriteFile(): error=%d"), GetLastError()); 136 debug_printf(TEXT("WriteFile(): error=%d\n"), GetLastError()); 137 138 return 0; 139 } 140 if (n != sizeof(char)*strlen(string)) { 141 msg_printf(MSG_ERROR, TEXT("pref_write()"), 142 TEXT("WriteFile(): write %d bytes"), n); 143 debug_printf(TEXT("WriteFile(): write %d bytes\n"), n); 144 145 return (0); 146 } 147 148 return 1; 149 } 150 151 void 152 pref_dump(struct preference_s* pref) 153 { 154 debug_printf(TEXT(" kernel_name: %s\n"), pref->kernel_name); 155 debug_printf(TEXT(" options: %s\n"), pref->options); 156 debug_printf(TEXT(" user def name: %s\n"), pref->setting_name); 157 debug_printf(TEXT(" setting index: %d\n"), pref->setting_idx); 158 debug_printf(TEXT(" type: %d\n"), pref->fb_type); 159 debug_printf(TEXT(" width: %d\n"), pref->fb_width); 160 debug_printf(TEXT(" height: %d\n"), pref->fb_height); 161 debug_printf(TEXT(" bytes/line: %d\n"), pref->fb_linebytes); 162 debug_printf(TEXT(" addr: %d\n"), pref->fb_addr); 163 debug_printf(TEXT(" cpu: %08lx\n"), pref->platid_cpu); 164 debug_printf(TEXT(" machine: %08lx\n"), pref->platid_machine); 165 debug_printf(TEXT(" last chance: %S\n"), pref->check_last_chance ? 166 "TRUE" : "FALSE"); 167 debug_printf(TEXT("load debug info: %S\n"), pref->load_debug_info ? 168 "TRUE" : "FALSE"); 169 debug_printf(TEXT(" serial port: %S\n"), pref->serial_port ? 170 "ON" : "OFF"); 171 } 172 173 174 175 /* To Do . modify this function*/ 176 int 177 pref_read(TCHAR* filename, struct preference_s* pref) 178 { 179 HANDLE file; 180 DWORD length; 181 static struct preference_s buf; 182 char tempbuf[1024]; 183 TCHAR unidata[1024]; 184 TCHAR identif[1024]; 185 char c; 186 int i,flag,d; 187 int result;/* count of loading pref item */ 188 189 190 file = CreateFile( 191 filename, /* file name */ 192 GENERIC_READ, /* access (read-write) mode */ 193 FILE_SHARE_READ,/* share mode */ 194 NULL, /* pointer to security attributes */ 195 OPEN_EXISTING, /* how to create */ 196 FILE_ATTRIBUTE_NORMAL, /* file attributes*/ 197 NULL /* handle to file with attributes to */ 198 ); 199 200 if (file == INVALID_HANDLE_VALUE) { 201 return (-1); 202 } 203 204 205 206 207 flag = 1; 208 result = 0; 209 while(flag){ 210 i = 0; 211 d = read1byte(file,&c); 212 if( d <=0){ 213 if(d == -1){ 214 flag = 0; 215 break; 216 } 217 else 218 { 219 CloseHandle(file); 220 return (-1); 221 } 222 } 223 224 225 while(c != ':' && c != '\r' && c!= '\n'){ 226 tempbuf[i] = c; 227 d = read1byte(file,&c); 228 if( d <=0){ 229 if(d == -1){ 230 flag = 0; 231 break; 232 } 233 else 234 { 235 CloseHandle(file); 236 return (-1); 237 } 238 } 239 i++; 240 } 241 if(c == ':'){ 242 243 244 tempbuf[i] = '\0'; 245 length = MultiByteToWideChar(CP_ACP,0,tempbuf,-1,identif,0); 246 MultiByteToWideChar(CP_ACP,0,tempbuf,-1,identif,length); 247 248 i = 0; 249 d = read1byte(file,&c); 250 flag = 1; 251 while(c != '\r' && c != '\n' && flag){/* get unidata */ 252 if(d <= 0){ 253 if(d == -1){ 254 flag = 0;/* though needless ... */ 255 break; 256 } 257 else{ 258 CloseHandle(file); 259 return -1; 260 } 261 } 262 tempbuf[i] = c; 263 d = read1byte(file,&c); 264 i++; 265 266 } 267 if(c == '\r'){/* skip \n */ 268 read1byte(file,&c); 269 } 270 tempbuf[i] = '\0'; 271 length = MultiByteToWideChar(CP_ACP,0,tempbuf,-1,unidata,0); 272 MultiByteToWideChar(CP_ACP,0,tempbuf,-1,unidata,length); 273 274 for(i = 1; i < NOFID;i++){ 275 if(wcscmp(identif,id_table[i])==0){ 276 break; 277 } 278 } 279 switch(i){ 280 case SETTING_IDX: 281 d = _wtoi(unidata); 282 buf.setting_idx = d; 283 result++; 284 break; 285 case FB_TYPE: 286 d = _wtoi(unidata); 287 buf.fb_type = d; 288 result++; 289 break; 290 case FB_WIDTH: 291 d = _wtoi(unidata); 292 buf.fb_width = d; 293 result++; 294 break; 295 case FB_HEIGHT: 296 d = _wtoi(unidata); 297 buf.fb_height = d; 298 result++; 299 break; 300 case FB_LINEBYTES: 301 d = _wtoi(unidata); 302 buf.fb_linebytes = d; 303 result++; 304 break; 305 case BOOT_TIME: 306 d = _wtoi(unidata); 307 buf.boot_time = d; 308 result++; 309 break; 310 case FB_ADDR: 311 d = _wtoi(unidata); 312 buf.fb_addr = d; 313 result++; 314 break; 315 case PLATID_CPU: 316 d = _wtoi(unidata); 317 buf.platid_cpu = d; 318 result++; 319 break; 320 case PLATID_MACHINE: 321 d = _wtoi(unidata); 322 buf.platid_machine = d; 323 result++; 324 break; 325 case SETTING_NAME: 326 wcscpy(buf.setting_name,unidata); 327 result++; 328 break; 329 case KERNEL_NAME: 330 wcscpy(buf.kernel_name,unidata); 331 result++; 332 break; 333 case OPTIONS: 334 wcscpy(buf.options,unidata); 335 result++; 336 break; 337 case CHECK_LAST_CHANCE: 338 if(wcscmp(unidata,TEXT("t")) == 0){ 339 buf.check_last_chance = TRUE; 340 } 341 else{ 342 buf.check_last_chance = FALSE; 343 } 344 result++; 345 break; 346 case LOAD_DEBUG_INFO: 347 if(wcscmp(unidata,TEXT("t")) == 0){ 348 buf.load_debug_info = TRUE; 349 } 350 else{ 351 buf.load_debug_info = FALSE; 352 } 353 result++; 354 break; 355 case SERIAL_PORT: 356 if(wcscmp(unidata,TEXT("t")) == 0){ 357 buf.serial_port = TRUE; 358 } 359 else{ 360 buf.serial_port = FALSE; 361 } 362 result++; 363 break; 364 case REVERSE_VIDEO: 365 if(wcscmp(unidata,TEXT("t")) == 0){ 366 buf.reverse_video = TRUE; 367 } 368 else{ 369 buf.reverse_video = FALSE; 370 } 371 result++; 372 break; 373 case AUTOBOOT: 374 if(wcscmp(unidata,TEXT("t")) == 0){ 375 buf.autoboot = TRUE; 376 } 377 else{ 378 buf.autoboot = FALSE; 379 } 380 result++; 381 break; 382 default: 383 break; 384 } 385 } 386 } 387 388 389 390 391 CloseHandle(file); 392 393 #if 0 394 /* shortage of item is not error */ 395 if(result != NOFID -1){ 396 return -1;/* data is shortage */ 397 } 398 #endif 399 400 *pref = buf; 401 402 return (0); 403 } 404 405 406 407 int 408 pref_load(struct path_s load_path[], int pathlen) 409 { 410 int i; 411 412 where_pref_load_from = NULL; 413 for (i = 0; i < pathlen; i++) { 414 wsprintf(filenamebuf, TEXT("%s%s"), 415 load_path[i].name, PREFNAME); 416 debug_printf(TEXT("pref_load: try to '%s'\n"), filenamebuf); 417 418 if (pref_read(filenamebuf, &pref) == 0) { 419 debug_printf(TEXT("pref_load: succeded, '%s'.\n"), 420 filenamebuf); 421 pref_dump(&pref); 422 where_pref_load_from = filenamebuf; 423 return (0); 424 } 425 } 426 427 return (-1); 428 } 429 430 431 int 432 pref_save(struct path_s load_path[], int pathlen) 433 { 434 int i; 435 436 if (where_pref_load_from) { 437 if (pref_write(where_pref_load_from, &pref) != 0) { 438 msg_printf(MSG_ERROR, TEXT("Error()"), 439 TEXT("Can't write %s"), where_pref_load_from); 440 return -1; 441 } 442 return 0; 443 } 444 for (i = 0; i < pathlen; i++) { 445 if (!(load_path[i].flags & PATH_SAVE)) { 446 continue; 447 } 448 wsprintf(filenamebuf, TEXT("%s%s"), 449 load_path[i].name, PREFNAME); 450 debug_printf(TEXT("pref_save: try to '%s'\n"), filenamebuf); 451 if (pref_write(filenamebuf, &pref) == 0) { 452 debug_printf(TEXT("pref_write: succeded, '%s'.\n"), 453 filenamebuf); 454 return (0); 455 } 456 } 457 458 msg_printf(MSG_ERROR, TEXT("Error()"), 459 TEXT("Can't write %s"), PREFNAME); 460 461 return (-1); 462 } 463 464 465 int 466 pref_write(TCHAR* filename, struct preference_s* buf) 467 { 468 HANDLE file; 469 char tempbuf[1024]; 470 TCHAR unibuf[1024]; 471 DWORD length; 472 473 474 debug_printf(TEXT("pref_write('%s').\n"), filename); 475 pref_dump(&pref); 476 477 file = CreateFile( 478 filename, /* file name */ 479 GENERIC_WRITE, /* access (read-write) mode */ 480 FILE_SHARE_WRITE,/* share mode */ 481 NULL, /* pointer to security attributes */ 482 CREATE_ALWAYS, /* how to create */ 483 FILE_ATTRIBUTE_NORMAL, /* file attributes*/ 484 NULL /* handle to file with attributes to */ 485 ); 486 487 if (file == INVALID_HANDLE_VALUE) { 488 debug_printf(TEXT("CreateFile(): error=%d\n"), GetLastError()); 489 return (-1); 490 } 491 492 493 wsprintf(unibuf,TEXT("setting_idx:%d\r\n"),buf->setting_idx); 494 debug_printf(TEXT("setting_idx,tempbuf=%s"),unibuf); 495 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 496 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 497 if(!write1string(file,tempbuf)){ 498 CloseHandle(file); 499 return (-1); 500 } 501 502 503 wsprintf(unibuf,TEXT("fb_type:%d\r\n"),buf->fb_type); 504 debug_printf(TEXT("fb_type,tempbuf=%s,"),unibuf); 505 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 506 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 507 if(!write1string(file,tempbuf)){ 508 CloseHandle(file); 509 return (-1); 510 } 511 512 513 wsprintf(unibuf,TEXT("fb_width:%d\r\n"),buf->fb_width); 514 debug_printf(TEXT("fb_width,tempbuf=%s"),unibuf); 515 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 516 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 517 if(!write1string(file,tempbuf)){ 518 CloseHandle(file); 519 return (-1); 520 } 521 522 523 524 wsprintf(unibuf,TEXT("fb_height:%d\r\n"),buf->fb_height); 525 debug_printf(TEXT("fb_height,tempbuf=%s"),unibuf); 526 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 527 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 528 if(!write1string(file,tempbuf)){ 529 CloseHandle(file); 530 return (-1); 531 } 532 533 534 535 wsprintf(unibuf,TEXT("fb_linebytes:%d\r\n"),buf->fb_linebytes); 536 debug_printf(TEXT("fb_linebytes,tempbuf=%s"),unibuf); 537 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 538 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 539 if(!write1string(file,tempbuf)){ 540 CloseHandle(file); 541 return (-1); 542 } 543 544 545 wsprintf(unibuf,TEXT("boot_time:%d\r\n"),buf->boot_time); 546 debug_printf(TEXT("boot_time,tempbuf=%s\n"),unibuf); 547 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 548 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 549 if(!write1string(file,tempbuf)){ 550 CloseHandle(file); 551 return (-1); 552 } 553 554 wsprintf(unibuf,TEXT("fb_addr:%d\r\n"),buf->fb_addr); 555 debug_printf(TEXT("fb_addr,tempbuf=%s"),unibuf); 556 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 557 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 558 if(!write1string(file,tempbuf)){ 559 CloseHandle(file); 560 return (-1); 561 } 562 563 564 565 wsprintf(unibuf,TEXT("platid_cpu:%d\r\n"),buf->platid_cpu); 566 debug_printf(TEXT("platid_cpu,tempbuf=%s"),unibuf); 567 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 568 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 569 if(!write1string(file,tempbuf)){ 570 CloseHandle(file); 571 return (-1); 572 } 573 574 575 wsprintf(unibuf,TEXT("platid_machine:%d\r\n"),buf->platid_machine); 576 debug_printf(TEXT("platid_machine,tempbuf=%s"),unibuf); 577 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 578 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 579 if(!write1string(file,tempbuf)){ 580 CloseHandle(file); 581 return (-1); 582 } 583 584 585 586 wsprintf(unibuf,TEXT("setting_name:%s\r\n"),buf->setting_name); 587 debug_printf(TEXT("setting_name,unibuf=%s,wcslen=%d"),unibuf, 588 wcslen(unibuf)); 589 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 590 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 591 592 if(!write1string(file,tempbuf)){ 593 CloseHandle(file); 594 return (-1); 595 } 596 597 598 599 wsprintf(unibuf,TEXT("kernel_name:%s\r\n"),buf->kernel_name); 600 debug_printf(TEXT("kernel_name,unibuf=%s,wcslen=%d"),unibuf, 601 wcslen(unibuf)); 602 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 603 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 604 if(!write1string(file,tempbuf)){ 605 CloseHandle(file); 606 return (-1); 607 } 608 609 610 611 wsprintf(unibuf,TEXT("options:%s\r\n"),buf->options); 612 debug_printf(TEXT("options,unibuf=%s,wcslen=%d"),unibuf, 613 wcslen(unibuf)); 614 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 615 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 616 if(!write1string(file,tempbuf)){ 617 CloseHandle(file); 618 return (-1); 619 } 620 621 622 if(buf->check_last_chance){ 623 wsprintf(unibuf,TEXT("check_last_chance:t\r\n")); 624 } 625 else{ 626 wsprintf(unibuf,TEXT("check_last_chance:n\r\n")); 627 } 628 629 630 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 631 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 632 if(!write1string(file,tempbuf)){ 633 CloseHandle(file); 634 return (-1); 635 } 636 637 638 639 640 if(buf->load_debug_info){ 641 wsprintf(unibuf,TEXT("load_debug_info:t\r\n")); 642 } 643 else{ 644 wsprintf(unibuf,TEXT("load_debug_info:n\r\n")); 645 } 646 647 648 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 649 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 650 651 652 if(!write1string(file,tempbuf)){ 653 CloseHandle(file); 654 return (-1); 655 } 656 657 658 659 if(buf->serial_port){ 660 wsprintf(unibuf,TEXT("serial_port:t\r\n")); 661 } 662 else{ 663 wsprintf(unibuf,TEXT("serial_port:n\r\n")); 664 } 665 666 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 667 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 668 669 if(!write1string(file,tempbuf)){ 670 CloseHandle(file); 671 return (-1); 672 } 673 674 675 676 if(buf->reverse_video){ 677 wsprintf(unibuf,TEXT("reverse_video:t\r\n")); 678 } 679 else{ 680 wsprintf(unibuf,TEXT("reverse_video:n\r\n")); 681 } 682 683 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 684 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 685 if(!write1string(file,tempbuf)){ 686 CloseHandle(file); 687 return (-1); 688 } 689 690 if(buf->autoboot){ 691 wsprintf(unibuf,TEXT("autoboot:t\r\n")); 692 } 693 else{ 694 wsprintf(unibuf,TEXT("autoboot:n\r\n")); 695 } 696 697 length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL); 698 WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL); 699 if(!write1string(file,tempbuf)){ 700 CloseHandle(file); 701 return (-1); 702 } 703 704 CloseHandle(file); 705 return (0); 706 } 707 708