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.

157 lines
3.3 KiB

  1. /*++
  2. Copyright (c) 1991 - 2001 Microsoft Corporation
  3. Module Name:
  4. ### ### ## ## ##### ## ## ##### ### ##### #### ##### #####
  5. ## # ### ## ## ## ## ## ## ## ### ## ## ## # ## ## ## ##
  6. ### ## ## #### ## #### ## ## ## ## ## ## ## ## ## ## ##
  7. ### ## ## ### ##### #### ## ## ## ## ## ## ## ## ## ## ##
  8. ### ####### #### ## ## ##### ####### ## ## ## ##### #####
  9. # ## ## ## ## ## ## ## ## ## ## ## ## ## ## # ## ##
  10. ### ## ## ## ## ##### ## ## ## ## ##### ## #### ## ##
  11. Abstract:
  12. This module contains the implementation for
  13. the ISaKeypad interface class.
  14. Author:
  15. Wesley Witt (wesw) 1-Oct-2001
  16. Environment:
  17. Kernel mode only.
  18. Notes:
  19. --*/
  20. #include "internal.h"
  21. HANDLE
  22. OpenSaDevice(
  23. ULONG DeviceType
  24. )
  25. {
  26. HANDLE hDevice;
  27. WCHAR buf[128];
  28. wcscpy( buf, L"\\\\?\\GLOBALROOT" );
  29. switch (DeviceType) {
  30. case SA_DEVICE_DISPLAY:
  31. wcscat( buf, SA_DEVICE_DISPLAY_NAME_STRING );
  32. break;
  33. case SA_DEVICE_KEYPAD:
  34. wcscat( buf, SA_DEVICE_KEYPAD_NAME_STRING );
  35. break;
  36. case SA_DEVICE_NVRAM:
  37. wcscat( buf, SA_DEVICE_NVRAM_NAME_STRING );
  38. break;
  39. case SA_DEVICE_WATCHDOG:
  40. wcscat( buf, SA_DEVICE_WATCHDOG_NAME_STRING );
  41. break;
  42. }
  43. hDevice = CreateFile(
  44. buf,
  45. GENERIC_READ | GENERIC_WRITE,
  46. FILE_SHARE_READ | FILE_SHARE_WRITE,
  47. NULL,
  48. OPEN_EXISTING,
  49. 0,
  50. NULL
  51. );
  52. return hDevice;
  53. }
  54. CSaKeypad::CSaKeypad()
  55. {
  56. m_hFile = OpenSaDevice( SA_DEVICE_KEYPAD );
  57. if (m_hFile != INVALID_HANDLE_VALUE) {
  58. ULONG Bytes;
  59. BOOL b = DeviceIoControl(
  60. m_hFile,
  61. IOCTL_SA_GET_VERSION,
  62. NULL,
  63. 0,
  64. &m_InterfaceVersion,
  65. sizeof(ULONG),
  66. &Bytes,
  67. NULL
  68. );
  69. if (!b) {
  70. CloseHandle( m_hFile );
  71. m_hFile = NULL;
  72. }
  73. } else {
  74. m_hFile = NULL;
  75. }
  76. }
  77. CSaKeypad::~CSaKeypad()
  78. {
  79. if (m_hFile != NULL) {
  80. CloseHandle( m_hFile );
  81. }
  82. }
  83. STDMETHODIMP CSaKeypad::get_InterfaceVersion(long *pVal)
  84. {
  85. *pVal = (long)m_InterfaceVersion;
  86. return S_OK;
  87. }
  88. STDMETHODIMP
  89. CSaKeypad::get_Key(
  90. SAKEY *pVal
  91. )
  92. {
  93. ULONG Bytes;
  94. if (m_hFile == NULL){
  95. return HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
  96. }
  97. if (!ReadFile( m_hFile, &m_Keypress, sizeof(UCHAR), &Bytes, NULL )) {
  98. return E_FAIL;
  99. }
  100. if (m_Keypress & SA_KEYPAD_UP) {
  101. *pVal = SAKEY_UP;
  102. } else
  103. if (m_Keypress & SA_KEYPAD_DOWN) {
  104. *pVal = SAKEY_DOWN;
  105. } else
  106. if (m_Keypress & SA_KEYPAD_LEFT) {
  107. *pVal = SAKEY_LEFT;
  108. } else
  109. if (m_Keypress & SA_KEYPAD_RIGHT) {
  110. *pVal = SAKEY_RIGHT;
  111. } else
  112. if (m_Keypress & SA_KEYPAD_CANCEL) {
  113. *pVal = SAKEY_ESCAPE;
  114. } else
  115. if (m_Keypress & SA_KEYPAD_SELECT) {
  116. *pVal = SAKEY_RETURN;
  117. } else {
  118. *pVal = (SAKEY)0;
  119. }
  120. return S_OK;
  121. }