windows-nt/Source/XPSP1/NT/enduser/windows.com/iuengine/wubios/control.c
2020-09-26 16:20:57 +08:00

156 lines
4.5 KiB
C

/*** control.c - System Control Message Support
*
* Author: Yan Leshinsky (YanL)
* Created 10/04/98
*
* MODIFICATION HISTORY
*/
#include "wubiosp.h"
#pragma CM_PAGEABLE_DATA
#pragma CM_PAGEABLE_CODE
/***EP WUBIOS_IOCtrl - Win32 Device IO Control entry point
*
* ENTRY
* pioc -> DIOC structure
*
* EXIT-SUCCESS
* returns ERROR_SUCCESS
* EXIT-FAILURE
* returns ERROR_*
*/
CM_VXD_RESULT CM_SYSCTRL WUBIOS_IOCtrl(PDIOCPARAMETERS pdioc)
{
TRACENAME("WUBIOS_IOCtrl")
CM_VXD_RESULT rc = ERROR_SUCCESS;
ENTER(1, ("WUBIOS_IOCtrl(hVM=%lx,hDev=%lx,Code=%lx)\n",
pdioc->VMHandle, pdioc->hDevice, pdioc->dwIoControlCode));
switch (pdioc->dwIoControlCode)
{
case WUBIOCTL_GET_VERSION:
if ((pdioc->cbOutBuffer < sizeof(DWORD)) || (pdioc->lpvOutBuffer == NULL))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on GetVersion"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
PVMMDDB pddb = (PVMMDDB)pdioc->Internal2;
*((PDWORD)pdioc->lpvOutBuffer) =
(pddb->DDB_Dev_Major_Version << 8) |
pddb->DDB_Dev_Minor_Version;
if (pdioc->lpcbBytesReturned != NULL)
*((PDWORD)pdioc->lpcbBytesReturned) = sizeof(DWORD);
}
break;
case WUBIOCTL_GET_ACPI_TABINFO:
if ((pdioc->lpvOutBuffer == NULL) ||
(pdioc->cbOutBuffer != sizeof(ACPITABINFO)))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on GetTabInfo"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
PACPITABINFO pTabInfo = (PACPITABINFO)pdioc->lpvOutBuffer;
if ((pTabInfo->dwPhyAddr = AcpiFindTable(pTabInfo->dwTabSig, NULL)) != 0)
{
AcpiCopyROM(pTabInfo->dwPhyAddr, (PBYTE)&pTabInfo->dh, sizeof(pTabInfo->dh));
}
else
{
DBG_ERR(("WUBIOS_IOCtrl: failed to get table info"));
rc = ERROR_GEN_FAILURE;
}
}
break;
case WUBIOCTL_GET_ACPI_TABLE:
if ((pdioc->lpvInBuffer == NULL) || (pdioc->lpvOutBuffer == NULL) || (pdioc->cbOutBuffer == 0))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on GetTable"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
AcpiCopyROM((DWORD)pdioc->lpvInBuffer, (PBYTE)pdioc->lpvOutBuffer, pdioc->cbOutBuffer);
}
break;
case WUBIOCTL_GET_SMB_STRUCTSIZE:
if ((pdioc->cbOutBuffer < sizeof(DWORD)) || (pdioc->lpvOutBuffer == NULL))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on WUBIOCTL_GET_SMB_TABSIZE"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
*((PDWORD)(pdioc->lpvOutBuffer)) = SmbStructSize();
}
break;
case WUBIOCTL_GET_SMB_STRUCT:
if ((pdioc->lpvInBuffer == NULL) || (pdioc->lpvOutBuffer == NULL) || (pdioc->cbOutBuffer == 0))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on GetTable"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
rc = SmbCopyStruct((DWORD)pdioc->lpvInBuffer, (PBYTE)pdioc->lpvOutBuffer, pdioc->cbOutBuffer);
}
break;
case WUBIOCTL_GET_PNP_OEMID:
if ((pdioc->cbOutBuffer < sizeof(DWORD)) || (pdioc->lpvOutBuffer == NULL))
{
DBG_ERR(("WUBIOS_IOCtrl: invalid parameter on WUBIOCTL_GET_PNP_OEMID"));
rc = ERROR_INVALID_PARAMETER;
}
else
{
*((PDWORD)(pdioc->lpvOutBuffer)) = PnpOEMID();
}
break;
default:
;
}
EXIT(1, ("WUBIOS_IOCtrl=%x\n", rc));
return rc;
} //WUBIOS_IOCtrl
/***LP CheckSum - Calculate checksum of a buffer
*
* ENTRY
* pb -> buffer
* dwLen - length of buffer
*
* EXIT
* returns checksum
*/
BYTE CM_INTERNAL CheckSum(PBYTE pb, DWORD dwLen)
{
TRACENAME("CHECKSUM")
BYTE bChkSum = 0;
ENTER(3, ("CheckSum(pb=%x,Len=%x)\n", pb, dwLen));
while (dwLen > 0)
{
bChkSum = (BYTE)(bChkSum + *pb);
pb++;
dwLen--;
}
EXIT(3, ("CheckSum=%x\n", bChkSum));
return bChkSum;
} //CheckSum