156 lines
4.5 KiB
C
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
|