📄 openbyintf.cpp
字号:
// OpenByIntf.cpp - open device by device interface
// Copyright (c) 1998 Compuware Corporation
#define NOCRYPT // prevent attempt to include missing files
#define _INC_EXCPT // prevent excpt.h from being included
#include "stdlib.h"
#include "stdio.h"
#include "windows.h"
#include "winioctl.h"
#include "devintf.h" // DriverWorks
#include "JJT_JT18Aioctl.h"
#define IOCTL_INBUF_SIZE 512
#define IOCTL_OUTBUF_SIZE 512
// OpenByInterface
//
// Opens the nth device found with the given interface class
HANDLE hDevice;
HANDLE OpenByInterface(
GUID* pClassGuid, // points to the GUID that identifies the interface class
DWORD instance, // specifies which instance of the enumerated devices to open
PDWORD pError // address of variable to receive error status
)
{
HANDLE hDev;
CDeviceInterfaceClass DevClass(pClassGuid, pError);
if (*pError != ERROR_SUCCESS)
return INVALID_HANDLE_VALUE;
CDeviceInterface DevInterface(&DevClass, instance, pError);
if (*pError != ERROR_SUCCESS)
return INVALID_HANDLE_VALUE;
hDev = CreateFile(
DevInterface.DevicePath(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hDev == INVALID_HANDLE_VALUE)
*pError = GetLastError();
return hDev;
}
void doRead(int n)
{
char *buf;
ULONG nRead;
int i;
int j;
buf = (char *) malloc(n);
if (buf == NULL)
{
printf("Failed to allocate buffer for read");
return;
}
// Read data from driver
printf("Reading from device - ");
ReadFile(hDevice, buf, n, &nRead, NULL);
printf("%d bytes read from device (%d requested).\n", nRead, n);
// Print what was read
i = 0;
while(i < n)
{
j = min((i+26),n);
for(; i < j; i++)
{
printf("%c, ", buf[i]);
}
printf("\n");
}
free(buf);
}
////////////////////////////////////////////////////////////////////////
// doWrite
//
// Write 'n' bytes of data to the device
//
// Note: This simple test app writes sequential characters to the
// device. This behavior can be modified as appropriate
// for your device.
//
void doWrite(int n)
{
char *buf;
ULONG nWritten;
int i;
int j;
buf = (char *) malloc(n);
if (buf == NULL)
{
printf("Failed to allocate buffer for write");
return;
}
// start with the mod26 letter of the number of bytes to write
j = (n % 26);
// load buffer with dummy data (abcdefg...)
for (i=0; i<n; i++, j=(j + 1)%26)
{
buf[i] = 'a' + j;
}
// Write data to driver
printf("Writing to device - ");
WriteFile(hDevice, buf, n, &nWritten, NULL);
printf("%d bytes written to device (%d attempted).\n", nWritten, n);
// Print what was written
i = 0;
while(i < n)
{
j = min((i+26),n);
for(; i < j; i++)
{
printf("%c, ", buf[i]);
}
printf("\n");
}
free(buf);
}
void Test_JJT_JT18A_IOCTL_CONTROL(void)
{
// Note that Input and Output are named from the point of view
// of the DEVICE:
// bufInput supplies data to the device
// bufOutput is written by the device to return data to this application
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput
// Call device IO Control interface (JJT_JT18A_IOCTL_CONTROL) in driver
printf("Issuing Ioctl to device - ");
if (!DeviceIoControl(hDevice,
JJT_JT18A_IOCTL_CONTROL,
bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
)
{
printf("ERROR: DeviceIoControl returns %0x.", GetLastError());
return;
}
}
////////////////////////////////////////////////////////////////////////
// Test_JJT_JT18A_IOCTL_READ
//
// Test one Io Control Code
//
// TODO:
// Pass appropriate arguments to your device and check
// the return value
//
void Test_JJT_JT18A_IOCTL_READ(void)
{
// Note that Input and Output are named from the point of view
// of the DEVICE:
// bufInput supplies data to the device
// bufOutput is written by the device to return data to this application
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput
// Call device IO Control interface (JJT_JT18A_IOCTL_READ) in driver
printf("Issuing Ioctl to device - ");
if (!DeviceIoControl(hDevice,
JJT_JT18A_IOCTL_READ,
bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
)
{
printf("ERROR: DeviceIoControl returns %0x.", GetLastError());
return;
}
}
////////////////////////////////////////////////////////////////////////
// Test_JJT_JT18A_IOCTL_WRITE
//
// Test one Io Control Code
//
// TODO:
// Pass appropriate arguments to your device and check
// the return value
//
void Test_JJT_JT18A_IOCTL_WRITE(void)
{
// Note that Input and Output are named from the point of view
// of the DEVICE:
// bufInput supplies data to the device
// bufOutput is written by the device to return data to this application
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput
// Call device IO Control interface (JJT_JT18A_IOCTL_WRITE) in driver
printf("Issuing Ioctl to device - ");
if (!DeviceIoControl(hDevice,
JJT_JT18A_IOCTL_WRITE,
bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
)
{
printf("ERROR: DeviceIoControl returns %0x.", GetLastError());
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -