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
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;
|
|
}
|