/*++ 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; }