windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/i386/bootini.c
2020-09-26 16:20:57 +08:00

101 lines
2 KiB
C

#include "precomp.h"
#pragma hdrstop
//
// x86 version (that deals with boot.ini) as opposed to arc
// version, that dceals with nvram (that routine is in the portable directory).
//
#ifdef _X86_
BOOL
FChangeBootIniTimeout(
IN INT Timeout
)
{
CHP BOOTINI[] = "C:\\boot.ini";
HFILE hfile;
ULONG FileSize;
PUCHAR buf = NULL,p1,p2;
BOOL b;
CHAR TimeoutLine[256];
sprintf(TimeoutLine,"timeout=%u\r\n",Timeout);
//
// Open and read boot.ini.
//
b = FALSE;
hfile = _lopen(BOOTINI,OF_READ);
if(hfile != HFILE_ERROR) {
FileSize = _llseek(hfile,0,2);
if(FileSize != (ULONG)(-1)) {
if((_llseek(hfile,0,0) != -1)
&& (buf = SAlloc(FileSize+1))
&& (_lread(hfile,buf,FileSize) != (UINT)(-1)))
{
buf[FileSize] = 0;
b = TRUE;
}
}
_lclose(hfile);
}
if(!b) {
if(buf) {
SFree(buf);
}
return(FALSE);
}
if(!(p1 = strstr(buf,"timeout"))) {
SFree(buf);
return(FALSE);
}
if(p2 = strchr(p1,'\n')) {
p2++; // skip NL.
} else {
p2 = buf + FileSize;
}
SetFileAttributes(BOOTINI,FILE_ATTRIBUTE_NORMAL);
hfile = _lcreat(BOOTINI,0);
if(hfile == HFILE_ERROR) {
SFree(buf);
return(FALSE);
}
//
// Write:
//
// 1) the first part, start=buf, len=p1-buf
// 2) the timeout line
// 3) the last part, start=p2, len=buf+FileSize-p2
//
b = ((_lwrite(hfile,buf ,p1-buf ) != (UINT)(-1))
&& (_lwrite(hfile,TimeoutLine,strlen(TimeoutLine)) != (UINT)(-1))
&& (_lwrite(hfile,p2 ,buf+FileSize-p2 ) != (UINT)(-1)));
_lclose(hfile);
SFree(buf);
//
// Make boot.ini archive, read only, and system.
//
SetFileAttributes(
BOOTINI,
FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE
);
return(b);
}
#endif