本文整理汇总了C++中IOObjectRelease函数的典型用法代码示例。如果您正苦于以下问题:C++ IOObjectRelease函数的具体用法?C++ IOObjectRelease怎么用?C++ IOObjectRelease使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IOObjectRelease函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: probe_sms
static int probe_sms(int kernFunc, char *servMatch, int dataType, void *data)
{
kern_return_t result;
mach_port_t masterPort;
io_iterator_t iterator;
io_object_t aDevice;
io_connect_t dataPort;
IOItemCount structureInputSize;
IOByteCount structureOutputSize;
union motion_data inputStructure;
union motion_data *outputStructure;
outputStructure = (union motion_data *)data;
result = IOMasterPort(MACH_PORT_NULL, &masterPort);
CFMutableDictionaryRef matchingDictionary = IOServiceMatching(servMatch);
result = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
if (result != KERN_SUCCESS) {
//fputs("IOServiceGetMatchingServices returned error.\n", stderr);
return 0;
}
aDevice = IOIteratorNext(iterator);
IOObjectRelease(iterator);
if (aDevice == 0) {
//fputs("No motion sensor available\n", stderr);
return 0;
}
result = IOServiceOpen(aDevice, mach_task_self(), 0, &dataPort);
IOObjectRelease(aDevice);
if (result != KERN_SUCCESS) {
//fputs("Could not open motion sensor device\n", stderr);
return 0;
}
switch ( dataType ) {
case PB_IB:
structureInputSize = sizeof(struct pb_ib_data);
structureOutputSize = sizeof(struct pb_ib_data);
break;
case MBP:
structureInputSize = sizeof(struct mbp_data);
structureOutputSize = sizeof(struct mbp_data);
break;
default:
return 0;
}
memset(&inputStructure, 0, sizeof(union motion_data));
memset(outputStructure, 0, sizeof(union motion_data));
#if !defined(__LP64__)
// Check if Mac OS X 10.5 API is available...
if (IOConnectCallMethod != NULL) {
// ...and use it if it is.
#endif
result = IOConnectCallStructMethod(dataPort, kernFunc, &inputStructure, structureInputSize,
outputStructure, (size_t *) &structureOutputSize);
#if !defined(__LP64__)
}
else {
// Otherwise fall back to older API.
result = IOConnectMethodStructureIStructureO(dataPort, kernFunc, structureInputSize,
&structureOutputSize, &inputStructure, outputStructure);
}
#endif
IOServiceClose(dataPort);
if (result != KERN_SUCCESS) {
//puts("no coords");
return 0;
}
return 1;
}
示例2: DoIt
int DoIt( int doWhat )
{
mach_port_t masterPort;
io_object_t netif; // network interface
io_connect_t conObj; // connection object
kern_return_t kr;
UInt32 outSize = sizeof( gBuffer );
/* Get master device port */
kr = IOMasterPort( bootstrap_port, &masterPort );
if ( kr != KERN_SUCCESS )
{
printf( "IOMasterPort() failed: %08lx\n", (unsigned long)kr );
exit( 0 );
}
netif = getInterfaceWithName( masterPort, "UniNEnet" );
if ( !netif )
{
printf( "getInterfaceWithName failed.\n" );
exit( 0 );
}
kr = IOServiceOpen( netif, mach_task_self(), 'GMAC', &conObj );
if ( kr != kIOReturnSuccess )
{
printf( "open device failed 0x%x\n", kr );
IOObjectRelease( netif );
exit( 0 );
}
// printf( "open device succeeded.\n" );
gInUCRequest.reqID = doWhat;
kr = io_connect_method_structureI_structureO(
conObj, /* connection object */
0, /* method index for doRequest */
(void*)&gInUCRequest, /* input struct */
sizeof( gInUCRequest ), /* input size */
(void*)&gBuffer, /* output buffer */
(mach_msg_type_number_t*)&outSize ); /* output size */
if ( kr != kIOReturnSuccess )
{
printf( "Request failed 0x%x\n", kr );
}
else
{
switch ( doWhat )
{
case kGMACUserCmd_GetRegs:
OutputBuffer();
break;
case kGMACUserCmd_GetOneReg:
printf( "Register %04lx: %08lx\n", (UInt32)gInUCRequest.pBuffer, *(UInt32*)gBuffer );
break;
case kGMACUserCmd_WriteOneReg:
printf( "Writing Register %08lx with %08lx.\n",
(UInt32)gInUCRequest.pBuffer, gInUCRequest.bufferSz );
break;
}
}
IOServiceClose( conObj );
// printf( "Closed device.\n" );
IOObjectRelease( netif );
exit( 0 );
}/* end DoIt */
示例3: method_xyz
static VALUE method_xyz(){
struct data {
signed short x;
signed short y;
signed short z;
char pad[34];
};
kern_return_t result;
mach_port_t masterPort;
IOMasterPort(MACH_PORT_NULL, &masterPort);
CFMutableDictionaryRef matchingDictionary = IOServiceMatching("SMCMotionSensor");
io_iterator_t iterator;
result = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
if(result != KERN_SUCCESS) {
return rb_str_new2("Error");
}
io_object_t device = IOIteratorNext(iterator);
IOObjectRelease(iterator);
if(device == 0){
return rb_str_new2("Error");
}
io_connect_t dataPort;
result = IOServiceOpen(device, mach_task_self(), 0, &dataPort);
IOObjectRelease(device);
if(result != KERN_SUCCESS) {
return rb_str_new2("Error");
}
IOItemCount structureInputSize;
size_t structureOutputSize;
struct data inputStructure;
struct data outputStructure;
structureInputSize = sizeof(struct data);
structureOutputSize = sizeof(struct data);
memset(&inputStructure, 1, sizeof(inputStructure));
memset(&outputStructure, 0, sizeof(outputStructure));
result = IOConnectCallStructMethod(
(mach_port_t)dataPort,
(uint32_t)5,
(const void*)&inputStructure,
structureInputSize,
(void*)&outputStructure,
&structureOutputSize
);
if(result != KERN_SUCCESS) {
return rb_str_new2("Error");
}
IOServiceClose(dataPort);
VALUE coords = rb_ary_new2(3);
rb_ary_store(coords, 0, INT2FIX(outputStructure.x));
rb_ary_store(coords, 1, INT2FIX(outputStructure.y));
rb_ary_store(coords, 2, INT2FIX(outputStructure.z));
return coords;
}
示例4: do_dev
static int do_dev( io_service_t usbDeviceRef )
{
IOReturn err;
IOCFPlugInInterface **iodev; // requires <IOKit/IOCFPlugIn.h>
SInt32 score;
UInt8 numConf;
IOUSBConfigurationDescriptorPtr confDesc;
IOUSBFindInterfaceRequest interfaceRequest;
io_iterator_t iterator;
io_service_t usbInterfaceRef;
err = IOCreatePlugInInterfaceForService(usbDeviceRef,
kIOUSBDeviceUserClientTypeID,
kIOCFPlugInInterfaceID, &iodev, &score);
if (err || !iodev) {
fprintf( stderr, "unable to create plugin. ret = %08x, iodev = %p\n",
err, iodev);
return -1;
}
err = (*iodev)->QueryInterface(iodev,
CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),
(LPVOID)&usbDev);
IODestroyPlugInInterface(iodev); // done with this
if (err || !usbDev) {
fprintf( stderr, "unable to create a device interface. ret = %08x, dev = %p\n",
err, usbDev);
return -1;
}
err = (*usbDev)->USBDeviceOpen(usbDev);
if (err) {
fprintf( stderr, "unable to open device. ret = %08x\n", err);
return -1;
}
err = (*usbDev)->GetNumberOfConfigurations(usbDev, &numConf);
if (err || !numConf) {
fprintf( stderr, "unable to obtain the number of configurations. ret = %08x\n", err);
return -1;
}
err = (*usbDev)->GetConfigurationDescriptorPtr(usbDev, 0, &confDesc); // get the first config desc (index 0)
if (err) {
fprintf( stderr, "unable to get config descriptor for index 0\n");
return -1;
}
err = (*usbDev)->SetConfiguration(usbDev, confDesc->bConfigurationValue);
if (err) {
fprintf( stderr, "unable to set the configuration\n");
return -1;
}
// requested class
interfaceRequest.bInterfaceClass = kIOUSBFindInterfaceDontCare;
// requested subclass
interfaceRequest.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;
// requested protocol
interfaceRequest.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;
// requested alt setting
interfaceRequest.bAlternateSetting = kIOUSBFindInterfaceDontCare;
err = (*usbDev)->CreateInterfaceIterator(usbDev, &interfaceRequest, &iterator);
if (err) {
fprintf( stderr, "unable to create interface iterator\n");
return -1;
}
while( (usbInterfaceRef = IOIteratorNext(iterator)) ) {
if( do_intf( usbInterfaceRef ) == 0 ) {
IOObjectRelease(iterator);
iterator = 0;
return 0;
}
}
IOObjectRelease(iterator);
iterator = 0;
return -1;
}
示例5: DeviceAdded
//.........这里部分代码省略.........
HRESULT res;
while ( (usbDevice = IOIteratorNext(iterator)) )
{
io_name_t deviceName;
CFStringRef deviceNameAsCFString;
MyPrivateData *privateDataRef = NULL;
UInt32 locationID;
printf("Device 0x%08x added.\n", usbDevice);
// Make activity and turn screen on
printf("Wake up on Yubikey insertion.\n");
IOPMAssertionID assertionID;
IOPMAssertionDeclareUserActivity(CFSTR(""), kIOPMUserActiveLocal, &assertionID);
// Add some app-specific information about this device.
// Create a buffer to hold the data.
privateDataRef = malloc(sizeof(MyPrivateData));
bzero( privateDataRef, sizeof(MyPrivateData));
// In this sample we'll just use the service's name.
//
kr = IORegistryEntryGetName(usbDevice, deviceName);
if (KERN_SUCCESS != kr)
{
deviceName[0] = '\0';
}
deviceNameAsCFString = CFStringCreateWithCString(kCFAllocatorDefault, deviceName, kCFStringEncodingASCII);
// Dump our data to stdout just to see what it looks like.
//
CFShow(deviceNameAsCFString);
privateDataRef->deviceName = deviceNameAsCFString;
// Now, get the locationID of this device. In order to do this, we need to create an IOUSBDeviceInterface for
// our device. This will create the necessary connections between our user land application and the kernel object
// for the USB Device.
//
kr = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugInInterface, &score);
if ((kIOReturnSuccess != kr) || !plugInInterface)
{
printf("unable to create a plugin (%08x)\n", kr);
continue;
}
// I have the device plugin, I need the device interface
//
res = (*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID)&privateDataRef->deviceInterface);
(*plugInInterface)->Release(plugInInterface); // done with this
if (res || !privateDataRef->deviceInterface)
{
printf("couldn't create a device interface (%08x)\n", (int) res);
continue;
}
// Now that we have the IOUSBDeviceInterface, we can call the routines in IOUSBLib.h
// In this case, we just want the locationID.
//
kr = (*privateDataRef->deviceInterface)->GetLocationID(privateDataRef->deviceInterface, &locationID);
if (KERN_SUCCESS != kr)
{
printf("GetLocationID returned %08x\n", kr);
continue;
}
else
{
printf("Location ID: 0x%lx\n", (unsigned long)locationID);
}
privateDataRef->locationID = locationID;
// Register for an interest notification for this device. Pass the reference to our
// private data as the refCon for the notification.
//
kr = IOServiceAddInterestNotification( gNotifyPort, // notifyPort
usbDevice, // service
kIOGeneralInterest, // interestType
DeviceNotification, // callback
privateDataRef, // refCon
&(privateDataRef->notification) // notification
);
if (KERN_SUCCESS != kr)
{
printf("IOServiceAddInterestNotification returned 0x%08x\n", kr);
}
// Done with this io_service_t
//
kr = IOObjectRelease(usbDevice);
free(privateDataRef);
}
}
示例6: DarwinAddSerialPrefs
void DarwinAddSerialPrefs(void)
{
mach_port_t masterPort; // The way to talk to the kernel
io_iterator_t allModems; // List of modems on the system
CFMutableDictionaryRef classesToMatch;
io_object_t nextModem;
if ( IOMasterPort(MACH_PORT_NULL, &masterPort) != KERN_SUCCESS )
bug("IOMasterPort failed. Won't be able to do anything with modems\n");
// Serial devices are instances of class IOSerialBSDClient
classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
if ( classesToMatch )
{
// Narrow the search a little further. Each serial device object has
// a property with key kIOSerialBSDTypeKey and a value that is one of
// kIOSerialBSDAllTypes, kIOSerialBSDModemType, or kIOSerialBSDRS232Type.
CFDictionarySetValue(classesToMatch,
CFSTR(kIOSerialBSDTypeKey),
CFSTR(kIOSerialBSDModemType));
// This will find built-in and USB modems, but not serial modems.
}
if ( IOServiceGetMatchingServices(masterPort,
classesToMatch, &allModems) != KERN_SUCCESS )
{
D(bug("IOServiceGetMatchingServices failed. No modems found?\n"));
return;
}
// Iterate through each modem
while ( nextModem = IOIteratorNext(allModems))
{
char bsdPath[MAXPATHLEN];
CFTypeRef bsdPathAsCFString =
IORegistryEntryCreateCFProperty(nextModem,
CFSTR(kIOCalloutDeviceKey),
// kIODialinDeviceKey?
kCFAllocatorDefault, 0);
*bsdPath = '\0';
if ( bsdPathAsCFString )
{
if ( CFStringGetCString((const __CFString *)bsdPathAsCFString,
bsdPath, MAXPATHLEN,
kCFStringEncodingASCII) )
{
D(bug("Modem BSD path: %s\n", bsdPath));
// Note that if there are multiple modems, we only get the last
PrefsAddString("seriala", bsdPath);
}
else
D(bug("Could not get BSD device path for modem\n"));
CFRelease(bsdPathAsCFString);
}
else
D(puts("Cannot determine bsdPath for modem\n"));
}
IOObjectRelease(nextModem);
IOObjectRelease(allModems);
// Getting a printer device is a bit harder. Creating a fake device
// that emulates a simple printer (e.g. a HP DeskJet) is one possibility,
// but for now I will just create a fake, safe, device entry:
PrefsAddString("serialb", "/dev/null");
}
示例7: defined
// Return a list of all serial ports
void ArduinoSerial::getAllPortsList()
{
list.clear();
#if defined(__linux__)
// This is ugly guessing, but Linux doesn't seem to provide anything else.
// If there really is an API to discover serial devices on Linux, please
// email [email protected] with the info. Please?
// The really BAD aspect is all ports get DTR raised briefly, because linux
// has no way to open the port without raising DTR, and there isn't any way
// to tell if the device file really represents hardware without opening it.
// maybe sysfs or udev provides a useful API??
DIR *dir;
struct dirent *f;
struct stat st;
unsigned int i, len[NUM_DEVNAMES];
char s[512];
int fd, bits;
termios mytios;
dir = opendir("/dev/");
if (dir == NULL) return ;
for (i=0; i<NUM_DEVNAMES; i++) len[i] = strlen(devnames[i]);
// Read all the filenames from the /dev directory...
while ((f = readdir(dir)) != NULL) {
// ignore everything that doesn't begin with "tty"
if (strncmp(f->d_name, "tty", 3)) continue;
// ignore anything that's not a known serial device name
for (i=0; i<NUM_DEVNAMES; i++) {
if (!strncmp(f->d_name + 3, devnames[i], len[i])) break;
}
if (i >= NUM_DEVNAMES) continue;
snprintf(s, sizeof(s), "/dev/%s", f->d_name);
// check if it's a character type device (almost certainly is)
if (stat(s, &st) != 0 || !(st.st_mode & S_IFCHR)) continue;
// now see if we can open the file - if the device file is
// populating /dev but doesn't actually represent a loaded
// driver, this is where we will detect it.
fd = open(s, O_RDONLY | O_NOCTTY | O_NONBLOCK);
if (fd < 0) {
// if permission denied, give benefit of the doubt
// (otherwise the port will be invisible to the user
// and we won't have a to alert them to the permssion
// problem)
if (errno == EACCES) list.push_back(s);
// any other error, assume it's not a real device
continue;
}
// does it respond to termios requests? (probably will since
// the name began with tty). Some devices where a single
// driver exports multiple names will open but this is where
// we can really tell if they work with real hardare.
if (tcgetattr(fd, &mytios) != 0) {
close(fd);
continue;
}
// does it respond to reading the control signals? If it's
// some sort of non-serial terminal (eg, pseudo terminals)
// this is where we will detect it's not really a serial port
if (ioctl(fd, TIOCMGET, &bits) < 0) {
close(fd);
continue;
}
// it passed all the tests, it's a serial port, or some sort
// of "terminal" that looks exactly like a real serial port!
close(fd);
// unfortunately, Linux always raises DTR when open is called.
// not nice! Every serial port is going to get DTR raised
// and then lowered. I wish there were a way to prevent this,
// but it seems impossible.
list.push_back(s);
}
closedir(dir);
#elif defined(__APPLE__)
// adapted from SerialPortSample.c, by Apple
// http://developer.apple.com/samplecode/SerialPortSample/listing2.html
// and also testserial.c, by Keyspan
// http://www.keyspan.com/downloads-files/developer/macosx/KesypanTestSerial.c
// www.rxtx.org, src/SerialImp.c seems to be based on Keyspan's testserial.c
// neither keyspan nor rxtx properly release memory allocated.
// more documentation at:
// http://developer.apple.com/documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/chapter_2_section_6.html
mach_port_t masterPort;
CFMutableDictionaryRef classesToMatch;
io_iterator_t serialPortIterator;
if (IOMasterPort(NULL, &masterPort) != KERN_SUCCESS) return;
// a usb-serial adaptor is usually considered a "modem",
// especially when it implements the CDC class spec
classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
if (!classesToMatch) return;
CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey),
CFSTR(kIOSerialBSDModemType));
if (IOServiceGetMatchingServices(masterPort, classesToMatch,
&serialPortIterator) != KERN_SUCCESS) return;
macos_ports(&serialPortIterator);
IOObjectRelease(serialPortIterator);
// but it might be considered a "rs232 port", so repeat this
// search for rs232 ports
//.........这里部分代码省略.........
示例8: main
int main(int argc, char* argv[])
{
int i;
int nandReadOnly=0;
struct stat st;
printf("Starting ramdisk tool\n");
printf("Compiled " __DATE__ " " __TIME__ "\n");
printf("Revision " HGVERSION "\n");
CFMutableDictionaryRef matching;
io_service_t service = 0;
matching = IOServiceMatching("IOWatchDogTimer");
if (matching == NULL) {
printf("unable to create matching dictionary for class IOWatchDogTimer\n");
}
service = IOServiceGetMatchingService(kIOMasterPortDefault, matching);
if (service == 0) {
printf("unable to create matching dictionary for class IOWatchDogTimer\n");
}
uint32_t zero = 0;
CFNumberRef n = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &zero);
IORegistryEntrySetCFProperties(service, n);
IOObjectRelease(service);
CFMutableDictionaryRef deviceInfos = CFDictionaryCreateMutable(kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
get_device_infos(deviceInfos);
init_tcp();
sysctlbyname("kern.bootargs", bootargs, &bootargs_len, NULL, 0);
if (strstr(bootargs, "nand-readonly") || strstr(bootargs, "nand-disable"))
{
printf("NAND read only mode, data partition wont be mounted\n");
nandReadOnly = 1;
}
else
{
printf("Waiting for data partition\n");
for(i=0; i < 10; i++)
{
if(!stat("/dev/disk0s2s1", &st))
{
system("/sbin/fsck_hfs /dev/disk0s2s1");
break;
}
if(!stat("/dev/disk0s1s2", &st))
{
system("/sbin/fsck_hfs /dev/disk0s1s2");
break;
}
if(!stat("/dev/disk0s2", &st))
{
system("/sbin/fsck_hfs /dev/disk0s2");
break;
}
sleep(5);
}
}
init_usb(CFDictionaryGetValue(deviceInfos, CFSTR("udid")));
printf("USB init done\n");
system("mount /"); //make ramdisk writable
chmod("/var/root/.ssh/authorized_keys", 0600);
chown("/var/root/.ssh/authorized_keys", 0, 0);
chown("/var/root/.ssh", 0, 0);
chown("/var/root/", 0, 0);
printf(" ####### ## ##\n");
printf("## ## ## ## \n");
printf("## ## ## ## \n");
printf("## ## ##### \n");
printf("## ## ## ## \n");
printf("## ## ## ## \n");
printf(" ####### ## ##\n");
printf("iphone-dataprotection ramdisk\n");
printf("revision: " HGVERSION " " __DATE__ " " __TIME__ "\n");
if(!stat(execve_params[0], &st))
{
printf("Running %s\n", execve_params[0]);
if((i = posix_spawn(NULL, execve_params[0], NULL, NULL, execve_params, execve_env)))
printf("posix_spawn(%s) returned %d\n", execve_params[0], i);
}
else
{
printf("%s is missing\n", execve_params[0]);
}
/*if (nandReadOnly)
{*/
if(!stat(ioflash[0], &st))
{
printf("Running %s\n", ioflash[0]);
//.........这里部分代码省略.........
示例9: disk_read
static int disk_read (void)
{
#if HAVE_IOKIT_IOKITLIB_H
io_registry_entry_t disk;
io_registry_entry_t disk_child;
io_iterator_t disk_list;
CFDictionaryRef props_dict;
CFDictionaryRef stats_dict;
CFDictionaryRef child_dict;
CFStringRef tmp_cf_string_ref;
kern_return_t status;
signed long long read_ops;
signed long long read_byt;
signed long long read_tme;
signed long long write_ops;
signed long long write_byt;
signed long long write_tme;
int disk_major;
int disk_minor;
char disk_name[DATA_MAX_NAME_LEN];
char disk_name_bsd[DATA_MAX_NAME_LEN];
/* Get the list of all disk objects. */
if (IOServiceGetMatchingServices (io_master_port,
IOServiceMatching (kIOBlockStorageDriverClass),
&disk_list) != kIOReturnSuccess)
{
ERROR ("disk plugin: IOServiceGetMatchingServices failed.");
return (-1);
}
while ((disk = IOIteratorNext (disk_list)) != 0)
{
props_dict = NULL;
stats_dict = NULL;
child_dict = NULL;
/* `disk_child' must be released */
if ((status = IORegistryEntryGetChildEntry (disk, kIOServicePlane, &disk_child))
!= kIOReturnSuccess)
{
/* This fails for example for DVD/CD drives.. */
DEBUG ("IORegistryEntryGetChildEntry (disk) failed: 0x%08x", status);
IOObjectRelease (disk);
continue;
}
/* We create `props_dict' => we need to release it later */
if (IORegistryEntryCreateCFProperties (disk,
(CFMutableDictionaryRef *) &props_dict,
kCFAllocatorDefault,
kNilOptions)
!= kIOReturnSuccess)
{
ERROR ("disk-plugin: IORegistryEntryCreateCFProperties failed.");
IOObjectRelease (disk_child);
IOObjectRelease (disk);
continue;
}
if (props_dict == NULL)
{
DEBUG ("IORegistryEntryCreateCFProperties (disk) failed.");
IOObjectRelease (disk_child);
IOObjectRelease (disk);
continue;
}
/* tmp_cf_string_ref doesn't need to be released. */
tmp_cf_string_ref = (CFStringRef) CFDictionaryGetValue (props_dict,
CFSTR(kIOBSDNameKey));
if (!tmp_cf_string_ref)
{
DEBUG ("disk plugin: CFDictionaryGetValue("
"kIOBSDNameKey) failed.");
CFRelease (props_dict);
IOObjectRelease (disk_child);
IOObjectRelease (disk);
continue;
}
assert (CFGetTypeID (tmp_cf_string_ref) == CFStringGetTypeID ());
memset (disk_name_bsd, 0, sizeof (disk_name_bsd));
CFStringGetCString (tmp_cf_string_ref,
disk_name_bsd, sizeof (disk_name_bsd),
kCFStringEncodingUTF8);
if (disk_name_bsd[0] == 0)
{
ERROR ("disk plugin: CFStringGetCString() failed.");
CFRelease (props_dict);
IOObjectRelease (disk_child);
IOObjectRelease (disk);
continue;
}
DEBUG ("disk plugin: disk_name_bsd = \"%s\"", disk_name_bsd);
stats_dict = (CFDictionaryRef) CFDictionaryGetValue (props_dict,
CFSTR (kIOBlockStorageDriverStatisticsKey));
//.........这里部分代码省略.........
示例10: dumpDevice
static void
dumpDevice(io_connect_t connect, uint32_t segment,
uint32_t bus, uint32_t device, uint32_t fn,
uint32_t * maxBus, uint32_t * maxFn)
{
io_registry_entry_t service;
kern_return_t status;
io_name_t name;
uint64_t entryID;
uint32_t off;
uint32_t vendProd;
uint32_t vend;
uint32_t prod;
uint32_t headerType;
uint32_t priBusNum;
uint32_t secBusNum;
uint32_t subBusNum;
uint32_t data[256/sizeof(uint32_t)];
uint8_t *bytes = (uint8_t *)&data[0];
for(off = 0; off < 256; off += 4)
data[off >> 2] = configRead32(connect, segment, bus, device, fn, off);
vendProd = data[0];
vend = vendProd & 0xffff;
prod = vendProd >> 16;
printf("[%d, %d, %d] 0x%04x, 0x%04x - ", bus, device, fn, vend, prod);
service = lookService(segment, bus, device, fn);
if (service)
{
status = IORegistryEntryGetName(service, name);
assert(kIOReturnSuccess == status);
status = IORegistryEntryGetRegistryEntryID(service, &entryID);
assert(kIOReturnSuccess == status);
printf("\"%s\", 0x%qx - ", name, entryID);
IOObjectRelease(service);
}
headerType = bytes[kIOPCIConfigHeaderType];
if (maxFn && (0x80 & headerType))
*maxFn = 7;
headerType &= 0x7f;
if (!headerType)
{
// device dump
printf("class: 0x%x, 0x%x, 0x%x\n",
bytes[kIOPCIConfigRevisionID + 3],
bytes[kIOPCIConfigRevisionID + 2],
bytes[kIOPCIConfigRevisionID + 1]);
}
else
{
priBusNum = bytes[kPCI2PCIPrimaryBus];
secBusNum = bytes[kPCI2PCISecondaryBus];
subBusNum = bytes[kPCI2PCISubordinateBus];
printf("bridge: [%d, %d, %d]\n", priBusNum, secBusNum, subBusNum);
if (maxBus && (subBusNum > *maxBus))
*maxBus = subBusNum;
}
dump(bytes, sizeof(data));
printf("\n");
}
示例11: main
int main(int argc, char **argv)
{
io_registry_entry_t service;
io_connect_t connect;
kern_return_t status;
service = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("AppleACPIPlatformExpert"));
assert(service);
if (service)
{
status = IOServiceOpen(service, mach_task_self(), 0, &connect);
IOObjectRelease(service);
assert(kIOReturnSuccess == status);
}
uint32_t count = 0;
uint32_t segment = 0;
uint32_t maxBus = 0;
uint32_t bus, device, fn, maxFn;
uint32_t vendProd;
if (argc > 3)
{
bus = strtoul(argv[1], NULL, 0);
device = strtoul(argv[2], NULL, 0);
fn = strtoul(argv[3], NULL, 0);
if (argc == 4)
{
dumpDevice(connect, segment, bus, device, fn, NULL, NULL);
count++;
}
if (argc > 5)
{
uint32_t offs;
uint32_t data;
offs = strtoul(argv[4], NULL, 0);
data = strtoul(argv[5], NULL, 0);
configWrite32(connect, segment, bus, device, fn, offs, data);
printf("wrote 0x%08x to [%d, %d, %d]:0x%X\n", data, bus, device, fn, offs);
}
else if (argc > 4)
{
uint32_t offs;
uint32_t data;
offs = strtoul(argv[4], NULL, 0);
data = configRead32(connect, segment, bus, device, fn, offs);
printf("read 0x%08x from [%d, %d, %d]:0x%X\n", data, bus, device, fn, offs);
}
}
else if (argc > 2)
{
uint64_t offs;
uint32_t data;
offs = strtoull(argv[1], NULL, 0);
data = strtoul(argv[2], NULL, 0);
physWrite32(connect, offs, data);
printf("wrote 0x%08x to 0x%llX\n", data, offs);
}
else if (argc > 1)
{
uint64_t offs;
uint32_t data;
offs = strtoull(argv[1], NULL, 0);
if (true || (offs > 0x10000ULL))
{
data = physRead32(connect, offs);
printf("read 0x%08x from mem 0x%llX\n", data, offs);
}
else
{
data = ioRead32(connect, offs);
printf("read 0x%08x from i/o 0x%llX\n", data, offs);
}
}
else for (bus = 0; bus <= maxBus; bus++)
{
for (device = 0; device < 32; device++)
{
maxFn = 0;
for (fn = 0; fn <= maxFn; fn++)
{
vendProd = configRead32(connect, segment, bus, device, fn, kIOPCIConfigVendorID);
if ((0xFFFFFFFF == vendProd) || !vendProd)
continue;
count++;
dumpDevice(connect, segment, bus, device, fn, &maxBus, &maxFn);
}
}
}
printf("total: %d\n", count);
exit(0);
}
示例12: disk_read
static int disk_read (void)
{
#if HAVE_IOKIT_IOKITLIB_H
io_registry_entry_t disk;
io_registry_entry_t disk_child;
io_iterator_t disk_list;
CFMutableDictionaryRef props_dict, child_dict;
CFDictionaryRef stats_dict;
CFStringRef tmp_cf_string_ref;
kern_return_t status;
signed long long read_ops, read_byt, read_tme;
signed long long write_ops, write_byt, write_tme;
int disk_major, disk_minor;
char disk_name[DATA_MAX_NAME_LEN];
char child_disk_name_bsd[DATA_MAX_NAME_LEN], props_disk_name_bsd[DATA_MAX_NAME_LEN];
/* Get the list of all disk objects. */
if (IOServiceGetMatchingServices (io_master_port, IOServiceMatching (kIOBlockStorageDriverClass), &disk_list) != kIOReturnSuccess) {
ERROR ("disk plugin: IOServiceGetMatchingServices failed.");
return (-1);
}
while ((disk = IOIteratorNext (disk_list)) != 0) {
props_dict = NULL;
stats_dict = NULL;
child_dict = NULL;
/* get child of disk entry and corresponding property dictionary */
if ((status = IORegistryEntryGetChildEntry (disk, kIOServicePlane, &disk_child)) != kIOReturnSuccess) {
/* This fails for example for DVD/CD drives, which we want to ignore anyway */
DEBUG ("IORegistryEntryGetChildEntry (disk) failed: 0x%08x", status);
IOObjectRelease (disk);
continue;
}
if (IORegistryEntryCreateCFProperties (disk_child, (CFMutableDictionaryRef *) &child_dict, kCFAllocatorDefault, kNilOptions) != kIOReturnSuccess || child_dict == NULL) {
ERROR ("disk plugin: IORegistryEntryCreateCFProperties (disk_child) failed.");
IOObjectRelease (disk_child);
IOObjectRelease (disk);
continue;
}
/* extract name and major/minor numbers */
memset (child_disk_name_bsd, 0, sizeof (child_disk_name_bsd));
tmp_cf_string_ref = (CFStringRef) CFDictionaryGetValue (child_dict, CFSTR(kIOBSDNameKey));
if (tmp_cf_string_ref) {
assert (CFGetTypeID (tmp_cf_string_ref) == CFStringGetTypeID ());
CFStringGetCString (tmp_cf_string_ref, child_disk_name_bsd, sizeof (child_disk_name_bsd), kCFStringEncodingUTF8);
}
disk_major = (int) dict_get_value (child_dict, kIOBSDMajorKey);
disk_minor = (int) dict_get_value (child_dict, kIOBSDMinorKey);
DEBUG ("disk plugin: child_disk_name_bsd=\"%s\" major=%d minor=%d", child_disk_name_bsd, disk_major, disk_minor);
CFRelease (child_dict);
IOObjectRelease (disk_child);
/* get property dictionary of the disk entry itself */
if (IORegistryEntryCreateCFProperties (disk, (CFMutableDictionaryRef *) &props_dict, kCFAllocatorDefault, kNilOptions) != kIOReturnSuccess || props_dict == NULL) {
ERROR ("disk-plugin: IORegistryEntryCreateCFProperties failed.");
IOObjectRelease (disk);
continue;
}
/* extract name and stats dictionary */
memset (props_disk_name_bsd, 0, sizeof (props_disk_name_bsd));
tmp_cf_string_ref = (CFStringRef) CFDictionaryGetValue (props_dict, CFSTR(kIOBSDNameKey));
if (tmp_cf_string_ref) {
assert (CFGetTypeID (tmp_cf_string_ref) == CFStringGetTypeID ());
CFStringGetCString (tmp_cf_string_ref, props_disk_name_bsd, sizeof (props_disk_name_bsd), kCFStringEncodingUTF8);
}
stats_dict = (CFDictionaryRef) CFDictionaryGetValue (props_dict, CFSTR (kIOBlockStorageDriverStatisticsKey));
if (stats_dict == NULL) {
ERROR ("disk plugin: CFDictionaryGetValue (%s) failed.", kIOBlockStorageDriverStatisticsKey);
CFRelease (props_dict);
IOObjectRelease (disk);
continue;
}
DEBUG ("disk plugin: props_disk_name_bsd=\"%s\"", props_disk_name_bsd);
/* choose name */
if (use_bsd_name) {
if (child_disk_name_bsd[0] != 0)
sstrncpy (disk_name, child_disk_name_bsd, sizeof (disk_name));
else if (props_disk_name_bsd[0] != 0)
sstrncpy (disk_name, props_disk_name_bsd, sizeof (disk_name));
else {
ERROR ("disk plugin: can't find bsd disk name.");
ssnprintf (disk_name, sizeof (disk_name), "%i-%i", disk_major, disk_minor);
}
}
else
ssnprintf (disk_name, sizeof (disk_name), "%i-%i", disk_major, disk_minor);
/* extract the stats */
read_ops = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsReadsKey);
read_byt = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsBytesReadKey);
read_tme = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsTotalReadTimeKey);
write_ops = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsWritesKey);
write_byt = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsBytesWrittenKey);
write_tme = dict_get_value (stats_dict, kIOBlockStorageDriverStatisticsTotalWriteTimeKey);
//.........这里部分代码省略.........
示例13: LOG_INFO
//.........这里部分代码省略.........
CFStringGetCString((CFStringRef)vendor_name_ref, vendor_buf, vendor_buflen,
kCFStringEncodingUTF8);
name += QString::fromUtf8(vendor_buf) + " ";
CFRelease(vendor_name_ref);
}
else {
name += QObject::tr("(unknown vendor name) ");
}
/* get product name */
char product_buf[256];
CFIndex product_buflen = 256;
CFTypeRef product_name_ref = NULL;
product_name_ref = IORegistryEntrySearchCFProperty(usbCurrentObj,
kIOServicePlane, CFSTR("USB Product Name"),
kCFAllocatorDefault, 0);
if(product_name_ref != NULL) {
CFStringGetCString((CFStringRef)product_name_ref, product_buf, product_buflen,
kCFStringEncodingUTF8);
name += QString::fromUtf8(product_buf);
CFRelease(product_name_ref);
}
else {
name += QObject::tr("(unknown product name)");
}
if(id) {
usbids.insertMulti(id, name);
LOG_INFO() << "USB:" << QString("0x%1").arg(id, 8, 16) << name;
}
}
IOObjectRelease(usb_iterator);
#endif
#if defined(Q_OS_WIN32)
HDEVINFO deviceInfo;
SP_DEVINFO_DATA infoData;
DWORD i;
// Iterate over all devices
// by doing it this way it's unneccessary to use GUIDs which might be not
// present in current MinGW. It also seemed to be more reliably than using
// a GUID.
// See KB259695 for an example.
deviceInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
infoData.cbSize = sizeof(SP_DEVINFO_DATA);
for(i = 0; SetupDiEnumDeviceInfo(deviceInfo, i, &infoData); i++) {
DWORD data;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
QString description;
// get device desriptor first
// for some reason not doing so results in bad things (tm)
while(!SetupDiGetDeviceRegistryProperty(deviceInfo, &infoData,
SPDRP_DEVICEDESC, &data, (PBYTE)buffer, buffersize, &buffersize)) {
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if(buffer) free(buffer);
// double buffer size to avoid problems as per KB888609
buffer = (LPTSTR)malloc(buffersize * 2);
}
else {
示例14: IOObjectRelease
///////////////////////////////////////////////////////////////////////
// Destructor
///////////////////////////////////////////////////////////////////////
IOKitDevice::~IOKitDevice()
{
//Need to release objects
if (hSavedService)
IOObjectRelease(hSavedService);
}
示例15: main
int main(int argc, char *argv[]) {
io_connect_t manager_connect = IO_OBJECT_NULL;
io_connect_t manager[kMaxSimultaneousConnections];
uint32_t openfailure = 0;
uint32_t closefailure = 0;
uint32_t ucOpenedCount = 0;
uint32_t ucExclusiveOpenedCount = 0;
IOReturn connectreturn = 0;
kern_return_t kernreturn = 0;
CFAbsoluteTime start_time = 0.0;
CFAbsoluteTime end_time = 0.0;
CFTimeInterval elapsed_time = 0.0;
io_registry_entry_t IOREG_SmartBattery = IO_OBJECT_NULL;
int simultaneousCount = 0;
PMTestInitialize("SmartBatteryUserClient repetition test", "com.apple.iokit.smartbattery.repeater");
/*
* Make sure we can open a few simultaneous user clients
*/
for(simultaneousCount=0; simultaneousCount < kMaxSimultaneousConnections; simultaneousCount++) {
manager[simultaneousCount] = connectSmartBatteryManager(0, &connectreturn);
if (kIOReturnSuccess != connectreturn) {
manager[simultaneousCount] = 0;
PMTestFail("Failed to open non-exclusive user client #%d of %d. Status = 0x%08x",
simultaneousCount, kMaxSimultaneousConnections, connectreturn);
} else {
PMTestPass("Opened non-exclusive user client depth %d", simultaneousCount);
}
}
IOREG_SmartBattery = IOServiceGetMatchingService( MACH_PORT_NULL,
IOServiceNameMatching(kBatteryManagerName) );
if (IO_OBJECT_NULL == IOREG_SmartBattery) {
PMTestLog("This machine does not support batteries. Skipping battery tests.");
exit(0);
}
IOObjectRelease(IOREG_SmartBattery);
for (simultaneousCount = kMaxSimultaneousConnections-1; simultaneousCount >= 0; simultaneousCount--)
{
if (!manager[simultaneousCount]) {
PMTestLog("ODDITY: Trying to close connection %d - but NULL connection ID", simultaneousCount);
continue;
}
connectreturn = IOServiceClose(manager[simultaneousCount]);
if (kIOReturnSuccess != connectreturn) {
PMTestFail("Failed to CLOSE non-exclusive user client #%d of %d. Status = 0x%08x",
simultaneousCount, kMaxSimultaneousConnections, connectreturn);
} else {
PMTestPass("Closed user client at depth %d", simultaneousCount);
}
}
while ( (ucOpenedCount < kUCIterationsCount) && (ucExclusiveOpenedCount < kUCExclusiveIterationsCount))
{
/*
* Regular user client
*/
if (ucOpenedCount < kUCIterationsCount)
{
/* OPEN REGULAR */
start_time = CFAbsoluteTimeGetCurrent();
manager_connect = connectSmartBatteryManager(0, &connectreturn);
if (MACH_PORT_NULL == manager_connect)
{
PMTestFail("IOServiceOpen error 0x%08x opening %s", connectreturn, kBatteryManagerName);
openfailure++;
} else {
end_time = CFAbsoluteTimeGetCurrent();
elapsed_time = end_time - start_time;
PMTestPass("User client opened successfully in %d.%02d seconds", (int)elapsed_time, (int)(100.0 * elapsed_time)%100);
if (elapsed_time > kMaxSecondsUCOperation) {
PMTestFail("Error - opening user client took %d.%02d, exceeding %d.%02d",
(int)elapsed_time, (int)(100.0 * elapsed_time)%100,
(int)kMaxSecondsUCOperation, (int)(100.0*kMaxSecondsUCOperation)%100);
}
/* CLOSE REGULAR */
start_time = CFAbsoluteTimeGetCurrent();
kernreturn = IOServiceClose(manager_connect);
if (KERN_SUCCESS != kernreturn) {
PMTestFail("IOServiceClose error %d closing user client.", kernreturn);
closefailure++;
} else {
end_time = CFAbsoluteTimeGetCurrent();
elapsed_time = end_time - start_time;
PMTestPass("User client closed successfully in %d.%02d seconds", (int)elapsed_time, (int)(100.0 * elapsed_time)%100);
if (elapsed_time > kMaxSecondsUCOperation) {
PMTestFail("Error - closing user client took %d.%02d, exceeding %d.%02d",
(int)elapsed_time, (int)(100.0 * elapsed_time)%100,
(int)kMaxSecondsUCOperation, (int)(100.0*kMaxSecondsUCOperation)%100);
}
}
}
ucOpenedCount++;
//.........这里部分代码省略.........