Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

314 lines
7.0 KiB

/*++
Copyright (c) 1991 - 2001 Microsoft Corporation
Module Name:
### ### ## # ## ## ##### ### ## ## #### ##### #####
## # ### ### # ## ## ## ## ### ### ### ## # ## ## ## ##
### ## ## #### # ## ## ## ## ## ## ######## ## ## ## ## ##
### ## ## # #### #### ##### ## ## # ### ## ## ## ## ## ##
### ####### # ### #### #### ####### # # ## ## ##### #####
# ## ## ## # ## ## ## ## ## ## # ## ## ## # ## ##
### ## ## # # ## ## ## ## ## # ## ## #### ## ##
Abstract:
This module contains the implementation for
the ISaNvram interface class.
Author:
Wesley Witt (wesw) 1-Oct-2001
Environment:
User mode only.
Notes:
--*/
#include "internal.h"
CSaNvram::CSaNvram()
{
m_hFile = OpenSaDevice( SA_DEVICE_NVRAM );
if (m_hFile != INVALID_HANDLE_VALUE) {
ULONG Bytes;
m_NvramCaps.SizeOfStruct = sizeof(SA_NVRAM_CAPS);
BOOL b = DeviceIoControl(
m_hFile,
IOCTL_SA_GET_CAPABILITIES,
NULL,
0,
&m_NvramCaps,
sizeof(SA_NVRAM_CAPS),
&Bytes,
NULL
);
if (!b) {
CloseHandle( m_hFile );
m_hFile = NULL;
}
b = DeviceIoControl(
m_hFile,
IOCTL_SA_GET_VERSION,
NULL,
0,
&m_InterfaceVersion,
sizeof(ULONG),
&Bytes,
NULL
);
if (!b) {
CloseHandle( m_hFile );
m_hFile = NULL;
}
} else {
m_hFile = NULL;
}
}
CSaNvram::~CSaNvram()
{
if (m_hFile != NULL) {
CloseHandle( m_hFile );
}
}
STDMETHODIMP CSaNvram::get_InterfaceVersion(long *pVal)
{
*pVal = (long)m_InterfaceVersion;
return S_OK;
}
STDMETHODIMP CSaNvram::get_BootCounter(long Number, long *pVal)
{
BOOL b;
SA_NVRAM_BOOT_COUNTER BootCounter;
ULONG Bytes;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.Value = 0;
BootCounter.DeviceId = 0;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_READ_BOOT_COUNTER,
NULL,
0,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
*pVal = BootCounter.Value;
return S_OK;
}
STDMETHODIMP CSaNvram::put_BootCounter(long Number, long newVal)
{
BOOL b;
SA_NVRAM_BOOT_COUNTER BootCounter;
ULONG Bytes;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.Value = 0;
BootCounter.DeviceId = 0;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_READ_BOOT_COUNTER,
NULL,
0,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.Value = newVal;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_WRITE_BOOT_COUNTER,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
NULL,
0,
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}
STDMETHODIMP CSaNvram::get_DeviceId(long Number, long *pVal)
{
BOOL b;
SA_NVRAM_BOOT_COUNTER BootCounter;
ULONG Bytes;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.Value = 0;
BootCounter.DeviceId = 0;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_READ_BOOT_COUNTER,
NULL,
0,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
*pVal = BootCounter.DeviceId;
return S_OK;
}
STDMETHODIMP CSaNvram::put_DeviceId(long Number, long newVal)
{
BOOL b;
SA_NVRAM_BOOT_COUNTER BootCounter;
ULONG Bytes;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.Value = 0;
BootCounter.DeviceId = 0;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_READ_BOOT_COUNTER,
NULL,
0,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
BootCounter.SizeOfStruct = sizeof(SA_NVRAM_BOOT_COUNTER);
BootCounter.Number = Number;
BootCounter.DeviceId = newVal;
b = DeviceIoControl(
m_hFile,
IOCTL_NVRAM_WRITE_BOOT_COUNTER,
&BootCounter,
sizeof(SA_NVRAM_BOOT_COUNTER),
NULL,
0,
&Bytes,
NULL
);
if (!b) {
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}
STDMETHODIMP CSaNvram::get_Size(long *pVal)
{
*pVal = m_NvramCaps.NvramSize;
return S_OK;
}
STDMETHODIMP CSaNvram::get_DataSlot(long Number, long *pVal)
{
BOOL b;
ULONG Bytes;
ULONG Position;
ULONG NewPosition;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
Position = (Number - 1) * sizeof(ULONG);
NewPosition = SetFilePointer( m_hFile, Position, NULL, FILE_BEGIN );
if (NewPosition != Position) {
return HRESULT_FROM_WIN32(GetLastError());
}
b = ReadFile( m_hFile, pVal, sizeof(ULONG), &Bytes, NULL );
if (!b ) {
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}
STDMETHODIMP CSaNvram::put_DataSlot(long Number, long newVal)
{
BOOL b;
ULONG Bytes;
ULONG Position;
ULONG NewPosition;
if (m_hFile == NULL){
return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
}
Position = (Number - 1) * sizeof(ULONG);
NewPosition = SetFilePointer( m_hFile, Position, NULL, FILE_BEGIN );
if (NewPosition != Position) {
return HRESULT_FROM_WIN32(GetLastError());
}
b = WriteFile( m_hFile, &newVal, sizeof(ULONG), &Bytes, NULL );
if (!b ) {
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}