Skip to content

Instantly share code, notes, and snippets.

@petabyt
Created November 21, 2022 23:35
Show Gist options
  • Save petabyt/14854981120156672d6bd84545ba46d6 to your computer and use it in GitHub Desktop.
Save petabyt/14854981120156672d6bd84545ba46d6 to your computer and use it in GitHub Desktop.
Finally working PTP example for win32
#include <stdio.h>
#include <stdint.h>
#include <windows.h>
#include <winbase.h>
#include <devguid.h>
#include <regstr.h>
#include <winuser.h>
#include <devpkey.h>
#include <initguid.h>
#include <wia.h>
#include "ptpwin.h"
void runCommand(IWiaItemExtras *extras, DWORD code) {
PTP_VENDOR_DATA_IN *pDataIn = NULL;
PTP_VENDOR_DATA_OUT *pDataOut = NULL;
DWORD dwDataInSize = sizeof( PTP_VENDOR_DATA_IN ) - 1;
DWORD dwDataOutSize = sizeof( PTP_VENDOR_DATA_OUT ) - 1 + 0x1000;
DWORD dwActualDataOutSize = 0;
pDataIn = (PTP_VENDOR_DATA_IN *)malloc(dwDataInSize);
if (!pDataIn) {
return;
}
pDataOut = (PTP_VENDOR_DATA_OUT *)malloc(dwDataOutSize);
if (!pDataOut) {
return;
}
memset(pDataIn, 0, dwDataInSize);
memset(pDataOut, 0, dwDataOutSize);
pDataIn->OpCode = 0x1001;
pDataIn->SessionId = 0;
pDataIn->TransactionId = 0;
pDataIn->NumParams = 0;
pDataIn->NextPhase = PTP_NEXTPHASE_READ_DATA;
int x = extras->lpVtbl->Escape(extras, code,
(BYTE *)pDataIn, dwDataInSize,
(BYTE *)pDataOut, dwDataOutSize,
&dwActualDataOutSize);
printf("Escape: %X\n", (x));
printf("Response: %X\n", pDataOut->ResponseCode);
free(pDataOut);
free(pDataIn);
}
int main() {
HRESULT x = CoInitialize(0);
printf("CoInitialize: %d\n", x);
IWiaDevMgr *wia;
IEnumWIA_DEV_INFO *info;
x = CoCreateInstance(
&CLSID_WiaDevMgr,
NULL,
CLSCTX_LOCAL_SERVER,
&IID_IWiaDevMgr,
(LPVOID *)&wia
);
printf("CoCreateInstance: %d\n", x);
x = wia->lpVtbl->EnumDeviceInfo(wia, WIA_DEVINFO_ENUM_LOCAL, &info);
printf("EnumDeviceInfo: %d\n", x);
while (1) {
IWiaPropertyStorage *storage;
x = info->lpVtbl->Next(info, 1, &storage, NULL);
printf("Next: %d\n", x);
if (x != S_OK) break;
PROPSPEC PropSpec[2] = {0};
PROPVARIANT PropVar[2] = {0};
PropSpec[0].ulKind = PRSPEC_PROPID;
PropSpec[0].propid = WIA_DIP_DEV_ID;
PropSpec[1].ulKind = PRSPEC_PROPID;
PropSpec[1].propid = WIA_DIP_DEV_NAME;
x = storage->lpVtbl->ReadMultiple(storage, 2, PropSpec, PropVar);
if (PropVar[0].vt == VT_BSTR)
printf("Device ID: %ws\n", PropVar[0].bstrVal);
if (PropVar[1].vt == VT_BSTR)
printf("Device Name: %ws\n", PropVar[1].bstrVal);
IWiaItem *item = NULL;
x = wia->lpVtbl->CreateDevice(wia, PropVar[0].bstrVal, &item);
printf("CreateDevice: %d\n", x);
IWiaItemExtras *extras = NULL;
x = item->lpVtbl->QueryInterface(item, &IID_IWiaItemExtras, (void **) &extras);
printf("QueryInterface: %X\n", x);
while (1) {
Sleep(1000);
runCommand(extras, ESCAPE_PTP_VENDOR_COMMAND);
}
extras->lpVtbl->Release(extras);
item->lpVtbl->Release(item);
storage->lpVtbl->Release(storage);
FreePropVariantArray(2, PropVar);
}
info->lpVtbl->Release(info);
wia->lpVtbl->Release(wia);
//x = wia->lpVtbl->CreateDevice();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment