From f2bc0526549eb5576a99bbaede9a36714278b1c9 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sat, 6 Aug 2022 13:59:51 +0200 Subject: [PATCH 01/44] throw out gstreamer --- go.mod | 1 - main.go | 29 +- screencapture/gstadapter/gst_adapter.go | 312 ------------------ screencapture/gstadapter/gst_adapter_test.go | 38 --- .../gstadapter/gst_pipeline_builder_linux.go | 81 ----- .../gstadapter/gst_pipeline_builder_mac.go | 53 --- screencapture/udpsink/udpsink.go | 116 +++++++ 7 files changed, 123 insertions(+), 507 deletions(-) delete mode 100644 screencapture/gstadapter/gst_adapter.go delete mode 100644 screencapture/gstadapter/gst_adapter_test.go delete mode 100644 screencapture/gstadapter/gst_pipeline_builder_linux.go delete mode 100644 screencapture/gstadapter/gst_pipeline_builder_mac.go create mode 100644 screencapture/udpsink/udpsink.go diff --git a/go.mod b/go.mod index 44bfa4d..7966fd1 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.16 require ( github.com/danielpaulus/go-ios v1.0.13 - github.com/danielpaulus/gst v0.0.0-20200201205042-e6d2974fceb8 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 github.com/google/gousb v2.1.0+incompatible github.com/lijo-jose/glib v0.0.0-20191012030101-93ee72d7d646 diff --git a/main.go b/main.go index fd46a83..2b05318 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "bufio" "encoding/json" "fmt" + "github.com/danielpaulus/quicktime_video_hack/screencapture/udpsink" stdlog "log" "os" "os/signal" @@ -14,7 +15,6 @@ import ( "github.com/danielpaulus/quicktime_video_hack/screencapture" "github.com/danielpaulus/quicktime_video_hack/screencapture/coremedia" "github.com/danielpaulus/quicktime_video_hack/screencapture/diagnostics" - "github.com/danielpaulus/quicktime_video_hack/screencapture/gstadapter" "github.com/docopt/docopt-go" log "github.com/sirupsen/logrus" ) @@ -112,10 +112,10 @@ The commands work as following: return } if ogg { - recordAudioGst(outfile, device, gstadapter.OGG) + return } - recordAudioGst(outfile, device, gstadapter.MP3) + return } @@ -219,16 +219,6 @@ func printExamples() { fmt.Print(examples) } -func recordAudioGst(outfile string, device screencapture.IosDevice, audiotype string) { - log.Debug("Starting Gstreamer with audio pipeline") - gStreamer, err := gstadapter.NewWithAudioPipeline(outfile, audiotype) - if err != nil { - printErrJSON(err, "Failed creating custom pipeline") - return - } - startWithConsumer(gStreamer, device, true) -} - func runDiagnostics(outfile string, dump bool, dumpFile string, device screencapture.IosDevice) { log.Debugf("diagnostics mode: %s dump:%t %s device:%s", outfile, dump, dumpFile, device.SerialNumber) metricsFile, err := os.Create(outfile) @@ -272,19 +262,14 @@ func recordAudioWav(outfile string, device screencapture.IosDevice) { } func startGStreamerWithCustomPipeline(device screencapture.IosDevice, pipelineString string) { - log.Debug("Starting Gstreamer with custom pipeline") - gStreamer, err := gstadapter.NewWithCustomPipeline(pipelineString) - if err != nil { - printErrJSON(err, "Failed creating custom pipeline") - return - } - startWithConsumer(gStreamer, device, false) + } func startGStreamer(device screencapture.IosDevice) { log.Debug("Starting Gstreamer") - gStreamer := gstadapter.New() - startWithConsumer(gStreamer, device, false) + //gStreamer := gstadapter.New() + udpsink := udpsink.New("localhost:10001", "localhost:10000") + startWithConsumer(udpsink, device, false) } // Just dump a list of what was discovered to the console diff --git a/screencapture/gstadapter/gst_adapter.go b/screencapture/gstadapter/gst_adapter.go deleted file mode 100644 index 88c71c6..0000000 --- a/screencapture/gstadapter/gst_adapter.go +++ /dev/null @@ -1,312 +0,0 @@ -package gstadapter - -import ( - "encoding/binary" - "fmt" - "os" - "runtime" - - "github.com/danielpaulus/gst" - "github.com/danielpaulus/quicktime_video_hack/screencapture/coremedia" - "github.com/lijo-jose/glib" - log "github.com/sirupsen/logrus" -) - -//GstAdapter contains the AppSrc for accessing Gstreamer. -type GstAdapter struct { - videoAppSrc *gst.AppSrc - audioAppSrc *gst.AppSrc - pipeline *gst.Pipeline - firstAudioSample bool -} - -const audioAppSrcTargetElementName = "audio_target" -const videoAppSrcTargetElementName = "video_target" - -const MP3 = "mp3" -const OGG = "ogg" - -//New creates a new MAC OSX compatible gstreamer pipeline that will play device video and audio -//in a nice little window :-D -func New() *GstAdapter { - log.Info("Starting Gstreamer..") - pl := gst.NewPipeline("QT_Hack_Pipeline") - - videoAppSrc := setUpVideoPipeline(pl) - audioAppSrc := setUpAudioPipelineBase(pl) - setupLivePlayAudio(pl) - - pl.SetState(gst.STATE_PLAYING) - runGlibMainLoop() - - log.Info("Gstreamer is running!") - gsta := GstAdapter{videoAppSrc: videoAppSrc, audioAppSrc: audioAppSrc, firstAudioSample: true} - - return &gsta -} - -func NewWithAudioPipeline(outfile string, audiotype string) (*GstAdapter, error) { - log.Info("Starting Gstreamer..") - pl := gst.NewPipeline("QT_Hack_Pipeline") - - audioAppSrc := setUpAudioPipelineBase(pl) - switch audiotype { - case MP3: - setupMp3(pl, outfile) - case OGG: - setupVorbis(pl, outfile) - default: - log.Fatalf("Unrecognized Audio type:%s", audiotype) - } - - pl.SetState(gst.STATE_PLAYING) - runGlibMainLoop() - - log.Info("Gstreamer is running!") - gsta := GstAdapter{audioAppSrc: audioAppSrc, firstAudioSample: true} - - return &gsta, nil -} - -//NewWithCustomPipeline will parse the given pipelineString, connect the videoAppSrc to whatever element has the name "video_target" and the audioAppSrc to "audio_target" -//see also: https://gstreamer.freedesktop.org/documentation/application-development/appendix/programs.html?gi-language=c -func NewWithCustomPipeline(pipelineString string) (*GstAdapter, error) { - log.Info("Starting Gstreamer..") - log.WithFields(log.Fields{"custom_pipeline": pipelineString}).Debug("Starting Gstreamer with custom pipeline") - pipeline, err := gst.ParseLaunch(pipelineString) - if err != nil { - return nil, fmt.Errorf("Invalid Pipeline, checkout --examples for help. Gstreamer parsing error was: %s", err) - } - - audioAppSrcTargetElement := pipeline.AsBin().GetByName(audioAppSrcTargetElementName) - if audioAppSrcTargetElement == nil { - return nil, fmt.Errorf("The pipeline needs an element with a property 'name=%s' so I can link the audio source to it. run with --examples for details.", audioAppSrcTargetElementName) - } - - videoAppSrcTargetElement := pipeline.AsBin().GetByName(videoAppSrcTargetElementName) - if videoAppSrcTargetElement == nil { - return nil, fmt.Errorf("The pipeline needs an element with a property 'name=%s' so I can link the video source to it. run with --examples for details.", videoAppSrcTargetElementName) - } - - videoAppSrc := gst.NewAppSrc("my-video-src") - videoAppSrc.SetProperty("is-live", true) - - audioAppSrc := gst.NewAppSrc("my-audio-src") - audioAppSrc.SetProperty("is-live", true) - - pipeline.Add(videoAppSrc.AsElement()) - pipeline.Add(audioAppSrc.AsElement()) - - audioAppSrc.Link(audioAppSrcTargetElement) - videoAppSrc.Link(videoAppSrcTargetElement) - - pipeline.SetState(gst.STATE_PLAYING) - //runGlibMainLoop() - - log.Info("Gstreamer is running!") - gsta := GstAdapter{videoAppSrc: videoAppSrc, audioAppSrc: audioAppSrc, firstAudioSample: true, pipeline: pipeline} - - return &gsta, nil -} - -//Stop sends an EOS (end of stream) event downstream the gstreamer pipeline. -//Some Elements need this to correctly finish. F.ex. writing mp4 video without -//sending EOS will result in a broken mp4 file -func (gsta GstAdapter) Stop() { - log.Info("Stopping Gstreamer..") - if gsta.audioAppSrc != nil { - success := gsta.audioAppSrc.SendEvent(gst.Eos()) - if !success { - log.Warn("Failed sending EOS signal for audio app source") - } - } - if gsta.videoAppSrc != nil { - success := gsta.videoAppSrc.SendEvent(gst.Eos()) - if !success { - log.Warn("Failed sending EOS signal for video app source") - } - } - - if gsta.pipeline == nil { - return - } - bus := gsta.pipeline.GetBus() - - //I hope those are 60 seconds - msg := bus.TimedPopFiltered(1000000000*1000*60, gst.MESSAGE_EOS|gst.MESSAGE_ERROR) - if msg == nil { - log.Warn("No EOS received, video files might be broken") - return - } - if msg.GetType() == gst.MESSAGE_ERROR { - log.Warn("Error received, video files might be broken") - return - } - log.Info("EOS received") - gsta.pipeline.SetState(gst.STATE_NULL) - log.Info("Gstreamer finished") -} - -//runGlibMainLoop starts the glib Mainloop necessary for the video player to work on MAC OS X. -func runGlibMainLoop() { - go func() { - //See: https://golang.org/pkg/runtime/#LockOSThread - runtime.LockOSThread() - glib.NewMainLoop(nil).Run() - }() -} -func setUpAudioPipelineBase(pl *gst.Pipeline) *gst.AppSrc { - asrc := gst.NewAppSrc("my-audio-src") - asrc.SetProperty("is-live", true) - - queue1 := gst.ElementFactoryMake("queue", "queue1") - checkElem(queue1, "queue1") - - queue2 := gst.ElementFactoryMake("queue", "queue2") - checkElem(queue1, "queue2") - - wavparse := gst.ElementFactoryMake("wavparse", "wavparse_01") - checkElem(wavparse, "wavparse") - wavparse.SetProperty("ignore-length", true) - - audioconvert := gst.ElementFactoryMake("audioconvert", "audioconvert_01") - checkElem(audioconvert, "audioconvert_01") - - pl.Add(asrc.AsElement(), queue1, wavparse, audioconvert, queue2) - asrc.Link(queue1) - queue1.Link(wavparse) - wavparse.Link(audioconvert) - - audioconvert.Link(queue2) - - return asrc -} -func setupVorbis(pl *gst.Pipeline, filepath string) { - //vorbisenc ! oggmux ! filesink location=alsasrc.ogg - vorbisEnc := gst.ElementFactoryMake("vorbisenc", "vorbisenc_01") - checkElem(vorbisEnc, "vorbisenc_01") - oggMux := gst.ElementFactoryMake("oggmux", "oggmux_01") - checkElem(oggMux, "oggmux_01") - - filesink := gst.ElementFactoryMake("filesink", "filesink_01") - filesink.SetProperty("location", filepath) - checkElem(filesink, "filesink_01") - - pl.Add(vorbisEnc, oggMux, filesink) - - pl.GetByName("queue2").Link(vorbisEnc) - vorbisEnc.Link(oggMux) - oggMux.Link(filesink) -} -func setupMp3(pl *gst.Pipeline, filepath string) { - // lamemp3enc ! filesink location=sine.mp3 - lameEnc := gst.ElementFactoryMake("lamemp3enc", "lamemp3enc_01") - checkElem(lameEnc, "lamemp3enc_01") - - filesink := gst.ElementFactoryMake("filesink", "filesink_01") - filesink.SetProperty("location", filepath) - checkElem(filesink, "filesink_01") - pl.Add(lameEnc, filesink) - pl.GetByName("queue2").Link(lameEnc) - lameEnc.Link(filesink) -} - -func checkElem(e *gst.Element, name string) { - if e == nil { - fmt.Fprintln(os.Stderr, "can't make element: ", name) - os.Exit(1) - } -} - -//Consume will transfer AV data into a Gstreamer AppSrc -func (gsta *GstAdapter) Consume(buf coremedia.CMSampleBuffer) error { - if buf.MediaType == coremedia.MediaTypeSound { - if gsta.firstAudioSample { - gsta.firstAudioSample = false - gsta.sendWavHeader() - } - return gsta.sendAudioSample(buf) - } - - //FIXME: ugly hack I added to prevent gstreamer from receiving decreasing timestamps - //I might have messed something up while sending times to the device as my first - //buffer will have this weird, large timestamp. So I hack it to be equal to zero here - if buf.OutputPresentationTimestamp.CMTimeValue > 17446044073700192000 { - buf.OutputPresentationTimestamp.CMTimeValue = 0 - } - if buf.HasFormatDescription { - //see above comment - buf.OutputPresentationTimestamp.CMTimeValue = 0 - err := gsta.writeNalu(prependMarker(buf.FormatDescription.PPS, uint32(len(buf.FormatDescription.PPS))), buf) - if err != nil { - return err - } - err = gsta.writeNalu(prependMarker(buf.FormatDescription.SPS, uint32(len(buf.FormatDescription.SPS))), buf) - if err != nil { - return err - } - } - gsta.writeNalus(buf) - - return nil -} - -func (gsta GstAdapter) sendWavHeader() { - wavData, _ := coremedia.GetWavHeaderBytes(100) - sampleLength := uint(len(wavData)) - gstBuf := gst.NewBufferAllocate(sampleLength) - gstBuf.SetPTS(0) - gstBuf.SetDTS(0) - //TODO: create CGO function that provides offsets so we can delete prependMarker again - gstBuf.FillWithGoSlice(wavData) - gsta.audioAppSrc.PushBuffer(gstBuf) -} - -func (gsta GstAdapter) sendAudioSample(buf coremedia.CMSampleBuffer) error { - sampleLength := uint(len(buf.SampleData)) - gstBuf := gst.NewBufferAllocate(sampleLength) - gstBuf.SetPTS(buf.OutputPresentationTimestamp.CMTimeValue) - gstBuf.SetDTS(0) - //TODO: create CGO function that provides offsets so we can delete prependMarker again - gstBuf.FillWithGoSlice(buf.SampleData) - gsta.audioAppSrc.PushBuffer(gstBuf) - - return nil -} - -func (gsta GstAdapter) writeNalus(bytes coremedia.CMSampleBuffer) error { - slice := bytes.SampleData - for len(slice) > 0 { - length := binary.BigEndian.Uint32(slice) - - nalu := slice[4 : length+4] - - err := gsta.writeNalu(prependMarker(nalu, length), bytes) - if err != nil { - return err - } - slice = slice[length+4:] - } - return nil -} - -func (gsta GstAdapter) writeNalu(naluBytes []byte, buf coremedia.CMSampleBuffer) error { - naluLength := uint(len(naluBytes)) - gstBuf := gst.NewBufferAllocate(naluLength) - - gstBuf.SetPTS(buf.OutputPresentationTimestamp.CMTimeValue) - gstBuf.SetDTS(0) - //TODO: create CGO function that provides offsets so we can delete prependMarker again - gstBuf.FillWithGoSlice(naluBytes) - gsta.videoAppSrc.PushBuffer(gstBuf) - return nil -} - -var naluAnnexBMarkerBytes = []byte{0, 0, 0, 1} - -func prependMarker(nalu []byte, length uint32) []byte { - naluWithAnnexBMarker := make([]byte, length+4) - copy(naluWithAnnexBMarker, naluAnnexBMarkerBytes) - copy(naluWithAnnexBMarker[4:], nalu) - return naluWithAnnexBMarker -} diff --git a/screencapture/gstadapter/gst_adapter_test.go b/screencapture/gstadapter/gst_adapter_test.go deleted file mode 100644 index 9025319..0000000 --- a/screencapture/gstadapter/gst_adapter_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package gstadapter_test - -import ( - "os" - "testing" - - "github.com/danielpaulus/quicktime_video_hack/screencapture/gstadapter" - log "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" -) - -func skipCI(t *testing.T) { - if os.Getenv("CI") != "" { - t.Skip("Skipping testing in CI environment") - } -} - -func TestCustomPipelineParsing(t *testing.T) { - linuxCI := os.Getenv("LINUX_CI") - log.Infof("linuxCI: %s", linuxCI) - if linuxCI == "true" { - log.Info("Skipping gstreamer test on headless containerized CI") - t.SkipNow() - } - - _, err := gstadapter.NewWithCustomPipeline("daniel") - assert.Error(t, err) - - _, err = gstadapter.NewWithCustomPipeline("queue name=my_filesrc ! fakesink") - assert.Error(t, err) - - _, err = gstadapter.NewWithCustomPipeline("queue name=audio_target ! fakesink") - assert.Error(t, err) - - gsta, err := gstadapter.NewWithCustomPipeline("rtpmux name=mux ! fakesink \n queue name=audio_target ! mux.sink_0 \n queue name=video_target ! mux.sink_1") - assert.NoError(t, err) - assert.NotNil(t, gsta) -} diff --git a/screencapture/gstadapter/gst_pipeline_builder_linux.go b/screencapture/gstadapter/gst_pipeline_builder_linux.go deleted file mode 100644 index 81c3a22..0000000 --- a/screencapture/gstadapter/gst_pipeline_builder_linux.go +++ /dev/null @@ -1,81 +0,0 @@ -// +build linux - -package gstadapter - -import "github.com/danielpaulus/gst" - -func setupLivePlayAudio(pl *gst.Pipeline) { - - /*hack: I do not know why, but audio on my linux box wont play when using a simple wavpars. - On MAC OS it works without any problems though. A hacky workaround to get audio playing that I came up with was - to encode audio into ogg/vorbis and directly decode it again. - */ - - vorbisenc := gst.ElementFactoryMake("vorbisenc", "vorbisenc_01") - checkElem(vorbisenc, "vorbisenc_01") - - oggmux := gst.ElementFactoryMake("oggmux", "oggmux_01") - checkElem(oggmux, "oggmux_01") - - oggdemux := gst.ElementFactoryMake("oggdemux", "oggdemux") - checkElem(oggdemux, "oggdemux") - - vorbisdec := gst.ElementFactoryMake("vorbisdec", "vorbisdec") - checkElem(vorbisdec, "vorbisdec") - - audioconvert2 := gst.ElementFactoryMake("audioconvert", "audioconvert_02") - checkElem(audioconvert2, "audioconvert_02") - - //endhack - - autoaudiosink := gst.ElementFactoryMake("autoaudiosink", "autoaudiosink_01") - checkElem(autoaudiosink, "autoaudiosink_01") - autoaudiosink.SetProperty("sync", false) - - pl.Add(vorbisenc, oggmux, oggdemux, vorbisdec, audioconvert2, autoaudiosink) - pl.GetByName("queue2").Link(vorbisenc) - - vorbisenc.Link(vorbisdec) - vorbisdec.Link(audioconvert2) - - audioconvert2.Link(autoaudiosink) - -} - -func setUpVideoPipeline(pl *gst.Pipeline) *gst.AppSrc { - asrc := gst.NewAppSrc("my-video-src") - asrc.SetProperty("is-live", true) - - queue1 := gst.ElementFactoryMake("queue", "queue_11") - checkElem(queue1, "queue_11") - - h264parse := gst.ElementFactoryMake("h264parse", "h264parse_01") - checkElem(h264parse, "h264parse") - - avdec_h264 := gst.ElementFactoryMake("avdec_h264", "avdec_h264_01") - checkElem(avdec_h264, "avdec_h264_01") - - queue2 := gst.ElementFactoryMake("queue", "queue_12") - checkElem(queue2, "queue_12") - - videoconvert := gst.ElementFactoryMake("videoconvert", "videoconvert_01") - checkElem(videoconvert, "videoconvert_01") - - queue3 := gst.ElementFactoryMake("queue", "queue_13") - checkElem(queue3, "queue_13") - - sink := gst.ElementFactoryMake("xvimagesink", "xvimagesink_01") - checkElem(sink, "xvimagesink01") - sink.SetProperty("sync", false) //see gst_adapter_macos comment - - pl.Add(asrc.AsElement(), queue1, h264parse, avdec_h264, queue2, videoconvert, queue3, sink) - - asrc.Link(queue1) - queue1.Link(h264parse) - h264parse.Link(avdec_h264) - avdec_h264.Link(queue2) - queue2.Link(videoconvert) - videoconvert.Link(queue3) - queue3.Link(sink) - return asrc -} diff --git a/screencapture/gstadapter/gst_pipeline_builder_mac.go b/screencapture/gstadapter/gst_pipeline_builder_mac.go deleted file mode 100644 index 820b44c..0000000 --- a/screencapture/gstadapter/gst_pipeline_builder_mac.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build darwin - -package gstadapter - -import "github.com/danielpaulus/gst" - -func setupLivePlayAudio(pl *gst.Pipeline) { - autoaudiosink := gst.ElementFactoryMake("autoaudiosink", "autoaudiosink_01") - checkElem(autoaudiosink, "autoaudiosink_01") - autoaudiosink.SetProperty("sync", false) - pl.Add(autoaudiosink) - pl.GetByName("queue2").Link(autoaudiosink) -} - -func setUpVideoPipeline(pl *gst.Pipeline) *gst.AppSrc { - asrc := gst.NewAppSrc("my-video-src") - asrc.SetProperty("is-live", true) - - queue1 := gst.ElementFactoryMake("queue", "queue_11") - checkElem(queue1, "queue_11") - - h264parse := gst.ElementFactoryMake("h264parse", "h264parse_01") - checkElem(h264parse, "h264parse") - - avdecH264 := gst.ElementFactoryMake("vtdec", "vtdec_01") - checkElem(avdecH264, "vtdec_01") - - queue2 := gst.ElementFactoryMake("queue", "queue_12") - checkElem(queue2, "queue_12") - - videoconvert := gst.ElementFactoryMake("videoconvert", "videoconvert_01") - checkElem(videoconvert, "videoconvert_01") - - queue3 := gst.ElementFactoryMake("queue", "queue_13") - checkElem(queue3, "queue_13") - - sink := gst.ElementFactoryMake("autovideosink", "autovideosink_01") - // setting this to true, creates extremely choppy video - // I probably messed up something regarding the time stamps - sink.SetProperty("sync", false) - checkElem(sink, "autovideosink_01") - - pl.Add(asrc.AsElement(), queue1, h264parse, avdecH264, queue2, videoconvert, queue3, sink) - - asrc.Link(queue1) - queue1.Link(h264parse) - h264parse.Link(avdecH264) - avdecH264.Link(queue2) - queue2.Link(videoconvert) - videoconvert.Link(queue3) - queue3.Link(sink) - return asrc -} diff --git a/screencapture/udpsink/udpsink.go b/screencapture/udpsink/udpsink.go new file mode 100644 index 0000000..8143845 --- /dev/null +++ b/screencapture/udpsink/udpsink.go @@ -0,0 +1,116 @@ +package udpsink + +import ( + "bytes" + "encoding/binary" + "github.com/danielpaulus/quicktime_video_hack/screencapture/coremedia" + log "github.com/sirupsen/logrus" + "io" + "net" +) + +type udpsink struct { + videoConn io.Writer + audioConn io.Writer + killFunc func() +} + +func New(video string, audio string) *udpsink { + videoConn, err := net.Dial("tcp", video) + if err != nil { + log.Error(err) + return nil + } + + audioConn, err := net.Dial("tcp", audio) + if err != nil { + log.Error(err) + return nil + } + return &udpsink{videoConn, audioConn, func() { + videoConn.Close() + audioConn.Close() + }} +} + +func (u udpsink) sendWavHeader() { + wavData, _ := coremedia.GetWavHeaderBytes(100) + u.audioConn.Write(wavData) +} + +var first bool = true + +func (u udpsink) Consume(buf coremedia.CMSampleBuffer) error { + if first { + first = false + u.sendWavHeader() + + } + if buf.MediaType == coremedia.MediaTypeSound { + + buffer := make([]byte, 5000) + reader := bytes.NewReader(buf.SampleData) + for { + n, err := reader.Read(buffer) + if err == io.EOF { + break + } + u.audioConn.Write(buffer[:n]) + } + return nil + } + if buf.HasFormatDescription { + log.Infof("%+v", buf.FormatDescription) + //see above comment + buf.OutputPresentationTimestamp.CMTimeValue = 0 + err := u.writeNalu(prependMarker(buf.FormatDescription.PPS, uint32(len(buf.FormatDescription.PPS))), buf) + if err != nil { + return err + } + err = u.writeNalu(prependMarker(buf.FormatDescription.SPS, uint32(len(buf.FormatDescription.SPS))), buf) + if err != nil { + return err + } + } + u.writeNalus(buf) + return nil +} +func (u udpsink) writeNalus(bytes coremedia.CMSampleBuffer) error { + slice := bytes.SampleData + for len(slice) > 0 { + length := binary.BigEndian.Uint32(slice) + + nalu := slice[4 : length+4] + + err := u.writeNalu(prependMarker(nalu, length), bytes) + if err != nil { + return err + } + slice = slice[length+4:] + } + return nil +} + +func (u udpsink) writeNalu(naluBytes []byte, buf coremedia.CMSampleBuffer) error { + buffer := make([]byte, 5000) + reader := bytes.NewReader(naluBytes) + for { + n, err := reader.Read(buffer) + if err == io.EOF { + break + } + u.videoConn.Write(buffer[:n]) + } + + return nil +} + +var naluAnnexBMarkerBytes = []byte{0, 0, 0, 1} + +func prependMarker(nalu []byte, length uint32) []byte { + naluWithAnnexBMarker := make([]byte, length+4) + copy(naluWithAnnexBMarker, naluAnnexBMarkerBytes) + copy(naluWithAnnexBMarker[4:], nalu) + return naluWithAnnexBMarker +} +func (u udpsink) Stop() {} From 157437428fdaf892eb294954896a2ee30dfcff77 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 19:45:47 +0200 Subject: [PATCH 02/44] initial commit, windows activator --- windows_activator/.gitignore | 77 ++ windows_activator/CMakeLists.txt | 6 + .../libusb-win32-bin-1.2.6.0/COPYING_GPL.txt | 674 ++++++++++++++ .../libusb-win32-bin-1.2.6.0/COPYING_LGPL.txt | 165 ++++ .../bin/amd64/libusb0.sys | Bin 0 -> 52832 bytes .../bin/ia64/libusb0.sys | Bin 0 -> 110176 bytes .../bin/libusb-win32-bin-README.txt | 27 + .../bin/x86/libusb0.sys | Bin 0 -> 42592 bytes .../include/lusb0_usb.h | 475 ++++++++++ .../installer_license.txt | 851 ++++++++++++++++++ .../lib/bcc/libusb.lib | Bin 0 -> 6144 bytes .../lib/dynamic/libusb_dyn.c | 497 ++++++++++ .../lib/msvc/libusb.lib | Bin 0 -> 11974 bytes .../lib/msvc_i64/libusb.lib | Bin 0 -> 13840 bytes .../lib/msvc_x64/libusb.lib | Bin 0 -> 11674 bytes windows_activator/main.c | 37 + 16 files changed, 2809 insertions(+) create mode 100644 windows_activator/.gitignore create mode 100644 windows_activator/CMakeLists.txt create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/COPYING_GPL.txt create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/COPYING_LGPL.txt create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/bin/amd64/libusb0.sys create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/bin/ia64/libusb0.sys create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/bin/libusb-win32-bin-README.txt create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/bin/x86/libusb0.sys create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/include/lusb0_usb.h create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/installer_license.txt create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/lib/bcc/libusb.lib create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/lib/dynamic/libusb_dyn.c create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc_i64/libusb.lib create mode 100755 windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib create mode 100644 windows_activator/main.c diff --git a/windows_activator/.gitignore b/windows_activator/.gitignore new file mode 100644 index 0000000..d16bbbe --- /dev/null +++ b/windows_activator/.gitignore @@ -0,0 +1,77 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser \ No newline at end of file diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt new file mode 100644 index 0000000..d8d5bc0 --- /dev/null +++ b/windows_activator/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.23) +project(windows_activator C) + +set(CMAKE_C_STANDARD 99) + +add_executable(windows_activator main.c) diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_GPL.txt b/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_GPL.txt new file mode 100755 index 0000000..818433e --- /dev/null +++ b/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_GPL.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_LGPL.txt b/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_LGPL.txt new file mode 100755 index 0000000..b14ca0a --- /dev/null +++ b/windows_activator/libusb-win32-bin-1.2.6.0/COPYING_LGPL.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/bin/amd64/libusb0.sys b/windows_activator/libusb-win32-bin-1.2.6.0/bin/amd64/libusb0.sys new file mode 100755 index 0000000000000000000000000000000000000000..0718dfb7c0a8b4161b2b06f14bbe91d6314becbf GIT binary patch literal 52832 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 literal 0 HcmV?d00001 diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/bin/libusb-win32-bin-README.txt b/windows_activator/libusb-win32-bin-1.2.6.0/bin/libusb-win32-bin-README.txt new file mode 100755 index 0000000..b1f8f1a --- /dev/null +++ b/windows_activator/libusb-win32-bin-1.2.6.0/bin/libusb-win32-bin-README.txt @@ -0,0 +1,27 @@ +libusb-win32-bin v1.2.6.0 (01/17/2012) - [Package Information] + +ALL ARCHITECTURES: + x86\libusb0_x86.dll: x86 32-bit library. Must be renamed to libusb0.dll + On 64 bit, Installs to Windows\syswow64\libusb0.dll. + On 32 bit, Installs to Windows\system32\libusb0.dll. + + x86\inf-wizard.exe: inf-wizard application with embedded libusb-win32 + v1.2.6.0 binaries. + +X86 ONLY ARCHITECTURES: + x86\libusb0.sys: x86 32-bit driver. + Installs to Windows\system32\drivers\libusb0.sys + +AMD64-INTEL64 ONLY ARCHITECTURES: + amd64\libusb0.sys: x64 64-bit driver. + Installs to Windows\system32\drivers\libusb0.sys + + amd64\libusb0.dll: x64 64-bit library. + Installs to Windows\system32\libusb0.dll + +IA64 ONLY ARCHITECTURES: + ia64\libusb0.sys: IA64 64-bit driver. + Installs to Windows\system32\drivers\libusb0.sys + + ia64\libusb0.dll: IA64 64-bit library. + Installs to Windows\system32\libusb0.dll diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/bin/x86/libusb0.sys b/windows_activator/libusb-win32-bin-1.2.6.0/bin/x86/libusb0.sys new file mode 100755 index 0000000000000000000000000000000000000000..5322e5b978a964f0fb601ebb75fae4aae34bbd87 GIT binary patch literal 42592 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 +#include + +/* + * 'interface' is defined somewhere in the Windows header files. This macro + * is deleted here to avoid conflicts and compile errors. + */ + +#ifdef interface +#undef interface +#endif + +/* + * PATH_MAX from limits.h can't be used on Windows if the dll and + * import libraries are build/used by different compilers + */ + +#define LIBUSB_PATH_MAX 512 + + +/* + * USB spec information + * + * This is all stuff grabbed from various USB specs and is pretty much + * not subject to change + */ + +/* + * Device and/or Interface Class codes + */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_DATA 10 +#define USB_CLASS_VENDOR_SPEC 0xff + +/* + * Descriptor types + */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 + +#define USB_DT_HID 0x21 +#define USB_DT_REPORT 0x22 +#define USB_DT_PHYSICAL 0x23 +#define USB_DT_HUB 0x29 + +/* + * Descriptor sizes per descriptor type + */ +#define USB_DT_DEVICE_SIZE 18 +#define USB_DT_CONFIG_SIZE 9 +#define USB_DT_INTERFACE_SIZE 9 +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define USB_DT_HUB_NONVAR_SIZE 7 + + +/* ensure byte-packed structures */ +#include + + +/* All standard descriptors have these 2 fields in common */ +struct usb_descriptor_header +{ + unsigned char bLength; + unsigned char bDescriptorType; +}; + +/* String descriptor */ +struct usb_string_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wData[1]; +}; + +/* HID descriptor */ +struct usb_hid_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdHID; + unsigned char bCountryCode; + unsigned char bNumDescriptors; +}; + +/* Endpoint descriptor */ +#define USB_MAXENDPOINTS 32 +struct usb_endpoint_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bEndpointAddress; + unsigned char bmAttributes; + unsigned short wMaxPacketSize; + unsigned char bInterval; + unsigned char bRefresh; + unsigned char bSynchAddress; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_TYPE_CONTROL 0 +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 +#define USB_ENDPOINT_TYPE_BULK 2 +#define USB_ENDPOINT_TYPE_INTERRUPT 3 + +/* Interface descriptor */ +#define USB_MAXINTERFACES 32 +struct usb_interface_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bInterfaceNumber; + unsigned char bAlternateSetting; + unsigned char bNumEndpoints; + unsigned char bInterfaceClass; + unsigned char bInterfaceSubClass; + unsigned char bInterfaceProtocol; + unsigned char iInterface; + + struct usb_endpoint_descriptor *endpoint; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +#define USB_MAXALTSETTING 128 /* Hard limit */ + +struct usb_interface +{ + struct usb_interface_descriptor *altsetting; + + int num_altsetting; +}; + +/* Configuration descriptor information.. */ +#define USB_MAXCONFIG 8 +struct usb_config_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short wTotalLength; + unsigned char bNumInterfaces; + unsigned char bConfigurationValue; + unsigned char iConfiguration; + unsigned char bmAttributes; + unsigned char MaxPower; + + struct usb_interface *interface; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +/* Device descriptor */ +struct usb_device_descriptor +{ + unsigned char bLength; + unsigned char bDescriptorType; + unsigned short bcdUSB; + unsigned char bDeviceClass; + unsigned char bDeviceSubClass; + unsigned char bDeviceProtocol; + unsigned char bMaxPacketSize0; + unsigned short idVendor; + unsigned short idProduct; + unsigned short bcdDevice; + unsigned char iManufacturer; + unsigned char iProduct; + unsigned char iSerialNumber; + unsigned char bNumConfigurations; +}; + +struct usb_ctrl_setup +{ + unsigned char bRequestType; + unsigned char bRequest; + unsigned short wValue; + unsigned short wIndex; + unsigned short wLength; +}; + +/* + * Standard requests + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +/* 0x02 is reserved */ +#define USB_REQ_SET_FEATURE 0x03 +/* 0x04 is reserved */ +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + +/* + * Various libusb API related stuff + */ + +#define USB_ENDPOINT_IN 0x80 +#define USB_ENDPOINT_OUT 0x00 + +/* Error codes */ +#define USB_ERROR_BEGIN 500000 + +/* + * This is supposed to look weird. This file is generated from autoconf + * and I didn't want to make this too complicated. + */ +#define USB_LE16_TO_CPU(x) + +/* + * Device reset types for usb_reset_ex. + * http://msdn.microsoft.com/en-us/library/ff537269%28VS.85%29.aspx + * http://msdn.microsoft.com/en-us/library/ff537243%28v=vs.85%29.aspx + */ +#define USB_RESET_TYPE_RESET_PORT (1 << 0) +#define USB_RESET_TYPE_CYCLE_PORT (1 << 1) +#define USB_RESET_TYPE_FULL_RESET (USB_RESET_TYPE_CYCLE_PORT | USB_RESET_TYPE_RESET_PORT) + + +/* Data types */ +/* struct usb_device; */ +/* struct usb_bus; */ + +struct usb_device +{ + struct usb_device *next, *prev; + + char filename[LIBUSB_PATH_MAX]; + + struct usb_bus *bus; + + struct usb_device_descriptor descriptor; + struct usb_config_descriptor *config; + + void *dev; /* Darwin support */ + + unsigned char devnum; + + unsigned char num_children; + struct usb_device **children; +}; + +struct usb_bus +{ + struct usb_bus *next, *prev; + + char dirname[LIBUSB_PATH_MAX]; + + struct usb_device *devices; + unsigned long location; + + struct usb_device *root_dev; +}; + +/* Version information, Windows specific */ +struct usb_version +{ + struct + { + int major; + int minor; + int micro; + int nano; + } dll; + struct + { + int major; + int minor; + int micro; + int nano; + } driver; +}; + + +struct usb_dev_handle; +typedef struct usb_dev_handle usb_dev_handle; + +/* Variables */ +#ifndef __USB_C__ +#define usb_busses usb_get_busses() +#endif + + + +#include + + +#ifdef __cplusplus +extern "C" +{ +#endif + + enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the + message strings in strerror.c when adding new error codes here. */ + + /** Other error */ + LIBUSB_ERROR_OTHER = -99 + }; + + + /* Function prototypes */ + + /* usb.c */ + usb_dev_handle *usb_open(struct usb_device *dev); + int usb_close(usb_dev_handle *dev); + int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, + size_t buflen); + int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, + size_t buflen); + + /* descriptors.c */ + int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, + unsigned char type, unsigned char index, + void *buf, int size); + int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, + unsigned char index, void *buf, int size); + + /* .c */ + int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout); + int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, + int value, int index, char *bytes, int size, + int timeout); + int usb_set_configuration(usb_dev_handle *dev, int configuration); + int usb_claim_interface(usb_dev_handle *dev, int interface); + int usb_release_interface(usb_dev_handle *dev, int interface); + int usb_set_altinterface(usb_dev_handle *dev, int alternate); + int usb_resetep(usb_dev_handle *dev, unsigned int ep); + int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); + int usb_reset(usb_dev_handle *dev); + int usb_reset_ex(usb_dev_handle *dev, unsigned int reset_type); + + char *usb_strerror(void); + + void usb_init(void); + void usb_set_debug(int level); + int usb_find_busses(void); + int usb_find_devices(void); + struct usb_device *usb_device(usb_dev_handle *dev); + struct usb_bus *usb_get_busses(void); + + + /* Windows specific functions */ + +#define LIBUSB_HAS_INSTALL_SERVICE_NP 1 + int usb_install_service_np(void); + void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1 + int usb_uninstall_service_np(void); + void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_INSTALL_DRIVER_NP 1 + int usb_install_driver_np(const char *inf_file); + void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_TOUCH_INF_FILE_NP 1 + int usb_touch_inf_file_np(const char *inf_file); + void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + +#define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1 + int usb_install_needs_restart_np(void); + +#define LIBUSB_HAS_INSTALL_NP 1 + int usb_install_npW(HWND hwnd, HINSTANCE instance, LPCWSTR cmd_line, int starg_arg); + int usb_install_npA(HWND hwnd, HINSTANCE instance, LPCSTR cmd_line, int starg_arg); + #define usb_install_np usb_install_npA + void CALLBACK usb_install_np_rundll(HWND wnd, HINSTANCE instance, + LPSTR cmd_line, int cmd_show); + + const struct usb_version *usb_get_version(void); + + int usb_isochronous_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep, int pktsize); + int usb_bulk_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep); + int usb_interrupt_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep); + + int usb_submit_async(void *context, char *bytes, int size); + int usb_reap_async(void *context, int timeout); + int usb_reap_async_nocancel(void *context, int timeout); + int usb_cancel_async(void *context); + int usb_free_async(void **context); + + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_H__ */ + diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/installer_license.txt b/windows_activator/libusb-win32-bin-1.2.6.0/installer_license.txt new file mode 100755 index 0000000..6128be6 --- /dev/null +++ b/windows_activator/libusb-win32-bin-1.2.6.0/installer_license.txt @@ -0,0 +1,851 @@ +Copyright (c) 2002-2004 Stephan Meyer, +Copyright (c) 2000-2004 Johannes Erdfelt, +Copyright (c) 2000-2004 Thomas Sailer, +Copyright (c) 2010 Travis Robinson, + +This software is distributed under the following licenses: +Driver: GNU General Public License (GPL) +Library, Test Files, Installer: GNU Lesser General Public License (LGPL) + +*********************************************************************** + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/lib/bcc/libusb.lib b/windows_activator/libusb-win32-bin-1.2.6.0/lib/bcc/libusb.lib new file mode 100755 index 0000000000000000000000000000000000000000..86c0cedeb7b7fcf0a5bcf1c6d48af676b4095c76 GIT binary patch literal 6144 zcmdT|TZmOv82-l~(wR}mQOC=8Nz5|KB*jcZEv1V}raepswL5dpnlro3?0wpMAIlzW zM;CSqNkmczkycPd*aSZGAYo+?J`^Z~4;4|-LlpMVQv|K`uiL-&<;+t-=fTVR|NVXc zZLRgM|8hUT9Dpl8{(etq!%VLek9wn>)?;48YK_TkEx?;S`Q_f0Kg#vit!=bg{muvM z@HBu#0j5JR&*H@_>9oCCd@!iLoZW`7wy~S#gH(qNc_c-ye>l78^VMVVRz_br$D0{=0?ao%A zm1K#cOqaHC#p4+EuN z9YWDHiZVl>NYx(^z}Pe92Mu22am?bgjy*&`kjg!UDR%3HN+=@M3l)~u zi>~jnh%s4>w>tT>>l7RFX+<5K4lwo6WQlTrrGsbJ3wTzv%i_(0LCl8`HdtJb{B{yX zQML*5QYNFgb3}gJPk%AkV%MZs!?F^5Z}gzYf<`;!8|abjKIEE8kMb@p@>0mpj15k_ z;w18e=88hR^CI#xB*k| z!k7ariv2K{bn2Z5Cu36Z=OG3 ztP%5zm46;3-0h8}{CTZP{=8zC=hx@24p-2={Rb!iL_k?E|3r39<-dqGa=rp@qzm52 z>k2Pl4?$ZcW|gxatR+fJv7LG_0DE$wz+I6pgdwLMVit*uglFROY#UZWm7Frpr!`<9 zjua@<<*>AZPdV~Mb}!OSp+?!4l(Q?qqtu90pU>E7M4fhmP2IS2KD#o?gy*v>zCht2 z9fn29Ki7T4o*uj0{^iMe<<-qi(smu5O#XPXAJ+ zMcJ``s#1I>XGFRf7UF*B1iA&V*X_624%{5o8kBc|*ePW&X9#Dy0+v_uDVM*`_95+* zij;j>6}tjGD~7#PT)TtThnew@~Qw?BpJ;3{*4syM-FRO=I z;U4)CoDswtWvj*Gw_M|m+_i8~jX}r+;U*{_1r0%Aq}3-f@^Af`!yI{+K)*#&9NZ%6 z0amxge;+t@7~Yck7x|GBldUQ?gZ()bYd0H`lHXCONL?F z#v=gl0lWslyIp__awKeS&|g9Aa(Y|+Sse87VWAxj)Rmmf6dne(ren$13n4r zG%3`cI!LGW$T2OQtZgXpj6ADt6CL!&bjZ0v*PpdYL1((cY#)2ZZPza8>JhP`?bdg> UGtg9zf)2V|b2E6={#(C)0D_}*2LJ#7 literal 0 HcmV?d00001 diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/lib/dynamic/libusb_dyn.c b/windows_activator/libusb-win32-bin-1.2.6.0/lib/dynamic/libusb_dyn.c new file mode 100755 index 0000000..f0fac9a --- /dev/null +++ b/windows_activator/libusb-win32-bin-1.2.6.0/lib/dynamic/libusb_dyn.c @@ -0,0 +1,497 @@ +/* LIBUSB-WIN32, Generic Windows USB Library + * Copyright (c) 2002-2005 Stephan Meyer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include +#include + +#include "usb.h" + +#define LIBUSB_DLL_NAME "libusb0.dll" + + +typedef usb_dev_handle * (*usb_open_t)(struct usb_device *dev); +typedef int (*usb_close_t)(usb_dev_handle *dev); +typedef int (*usb_get_string_t)(usb_dev_handle *dev, int index, int langid, + char *buf, size_t buflen); +typedef int (*usb_get_string_simple_t)(usb_dev_handle *dev, int index, + char *buf, size_t buflen); +typedef int (*usb_get_descriptor_by_endpoint_t)(usb_dev_handle *udev, int ep, + unsigned char type, + unsigned char index, + void *buf, int size); +typedef int (*usb_get_descriptor_t)(usb_dev_handle *udev, unsigned char type, + unsigned char index, void *buf, int size); +typedef int (*usb_bulk_write_t)(usb_dev_handle *dev, int ep, char *bytes, + int size, int timeout); +typedef int (*usb_bulk_read_t)(usb_dev_handle *dev, int ep, char *bytes, + int size, int timeout); +typedef int (*usb_interrupt_write_t)(usb_dev_handle *dev, int ep, char *bytes, + int size, int timeout); +typedef int (*usb_interrupt_read_t)(usb_dev_handle *dev, int ep, char *bytes, + int size, int timeout); +typedef int (*usb_control_msg_t)(usb_dev_handle *dev, int requesttype, + int request, int value, int index, + char *bytes, int size, int timeout); +typedef int (*usb_set_configuration_t)(usb_dev_handle *dev, int configuration); +typedef int (*usb_claim_interface_t)(usb_dev_handle *dev, int interface); +typedef int (*usb_release_interface_t)(usb_dev_handle *dev, int interface); +typedef int (*usb_set_altinterface_t)(usb_dev_handle *dev, int alternate); +typedef int (*usb_resetep_t)(usb_dev_handle *dev, unsigned int ep); +typedef int (*usb_clear_halt_t)(usb_dev_handle *dev, unsigned int ep); +typedef int (*usb_reset_t)(usb_dev_handle *dev); +typedef int (*usb_reset_ex_t)(usb_dev_handle *dev, unsigned int reset_type); +typedef char * (*usb_strerror_t)(void); +typedef void (*usb_init_t)(void); +typedef void (*usb_set_debug_t)(int level); +typedef int (*usb_find_busses_t)(void); +typedef int (*usb_find_devices_t)(void); +typedef struct usb_device * (*usb_device_t)(usb_dev_handle *dev); +typedef struct usb_bus * (*usb_get_busses_t)(void); +typedef int (*usb_install_service_np_t)(void); +typedef int (*usb_uninstall_service_np_t)(void); +typedef int (*usb_install_driver_np_t)(const char *inf_file); +typedef const struct usb_version * (*usb_get_version_t)(void); +typedef int (*usb_isochronous_setup_async_t)(usb_dev_handle *dev, + void **context, + unsigned char ep, int pktsize); +typedef int (*usb_bulk_setup_async_t)(usb_dev_handle *dev, void **context, + unsigned char ep); +typedef int (*usb_interrupt_setup_async_t)(usb_dev_handle *dev, void **context, + unsigned char ep); +typedef int (*usb_submit_async_t)(void *context, char *bytes, int size); +typedef int (*usb_reap_async_t)(void *context, int timeout); +typedef int (*usb_free_async_t)(void **context); + + +static usb_open_t _usb_open = NULL; +static usb_close_t _usb_close = NULL; +static usb_get_string_t _usb_get_string = NULL; +static usb_get_string_simple_t _usb_get_string_simple = NULL; +static usb_get_descriptor_by_endpoint_t _usb_get_descriptor_by_endpoint = NULL; +static usb_get_descriptor_t _usb_get_descriptor = NULL; +static usb_bulk_write_t _usb_bulk_write = NULL; +static usb_bulk_read_t _usb_bulk_read = NULL; +static usb_interrupt_write_t _usb_interrupt_write = NULL; +static usb_interrupt_read_t _usb_interrupt_read = NULL; +static usb_control_msg_t _usb_control_msg = NULL; +static usb_set_configuration_t _usb_set_configuration = NULL; +static usb_claim_interface_t _usb_claim_interface = NULL; +static usb_release_interface_t _usb_release_interface = NULL; +static usb_set_altinterface_t _usb_set_altinterface = NULL; +static usb_resetep_t _usb_resetep = NULL; +static usb_clear_halt_t _usb_clear_halt = NULL; +static usb_reset_t _usb_reset = NULL; +static usb_reset_ex_t _usb_reset_ex = NULL; +static usb_strerror_t _usb_strerror = NULL; +static usb_init_t _usb_init = NULL; +static usb_set_debug_t _usb_set_debug = NULL; +static usb_find_busses_t _usb_find_busses = NULL; +static usb_find_devices_t _usb_find_devices = NULL; +static usb_device_t _usb_device = NULL; +static usb_get_busses_t _usb_get_busses = NULL; +static usb_install_service_np_t _usb_install_service_np = NULL; +static usb_uninstall_service_np_t _usb_uninstall_service_np = NULL; +static usb_install_driver_np_t _usb_install_driver_np = NULL; +static usb_get_version_t _usb_get_version = NULL; +static usb_isochronous_setup_async_t _usb_isochronous_setup_async = NULL; +static usb_bulk_setup_async_t _usb_bulk_setup_async = NULL; +static usb_interrupt_setup_async_t _usb_interrupt_setup_async = NULL; +static usb_submit_async_t _usb_submit_async = NULL; +static usb_reap_async_t _usb_reap_async = NULL; +static usb_free_async_t _usb_free_async = NULL; + + + + +void usb_init(void) +{ + HINSTANCE libusb_dll = LoadLibrary(LIBUSB_DLL_NAME); + + if (!libusb_dll) + return; + + _usb_open = (usb_open_t) + GetProcAddress(libusb_dll, "usb_open"); + _usb_close = (usb_close_t) + GetProcAddress(libusb_dll, "usb_close"); + _usb_get_string = (usb_get_string_t) + GetProcAddress(libusb_dll, "usb_get_string"); + _usb_get_string_simple = (usb_get_string_simple_t) + GetProcAddress(libusb_dll, "usb_get_string_simple"); + _usb_get_descriptor_by_endpoint = (usb_get_descriptor_by_endpoint_t) + GetProcAddress(libusb_dll, "usb_get_descriptor_by_endpoint"); + _usb_get_descriptor = (usb_get_descriptor_t) + GetProcAddress(libusb_dll, "usb_get_descriptor"); + _usb_bulk_write = (usb_bulk_write_t) + GetProcAddress(libusb_dll, "usb_bulk_write"); + _usb_bulk_read = (usb_bulk_read_t) + GetProcAddress(libusb_dll, "usb_bulk_read"); + _usb_interrupt_write = (usb_interrupt_write_t) + GetProcAddress(libusb_dll, "usb_interrupt_write"); + _usb_interrupt_read = (usb_interrupt_read_t) + GetProcAddress(libusb_dll, "usb_interrupt_read"); + _usb_control_msg = (usb_control_msg_t) + GetProcAddress(libusb_dll, "usb_control_msg"); + _usb_set_configuration = (usb_set_configuration_t) + GetProcAddress(libusb_dll, "usb_set_configuration"); + _usb_claim_interface = (usb_claim_interface_t) + GetProcAddress(libusb_dll, "usb_claim_interface"); + _usb_release_interface = (usb_release_interface_t) + GetProcAddress(libusb_dll, "usb_release_interface"); + _usb_set_altinterface = (usb_set_altinterface_t) + GetProcAddress(libusb_dll, "usb_set_altinterface"); + _usb_resetep = (usb_resetep_t) + GetProcAddress(libusb_dll, "usb_resetep"); + _usb_clear_halt = (usb_clear_halt_t) + GetProcAddress(libusb_dll, "usb_clear_halt"); + _usb_reset = (usb_reset_t) + GetProcAddress(libusb_dll, "usb_reset"); + _usb_reset_ex = (usb_reset_ex_t) + GetProcAddress(libusb_dll, "usb_reset_ex"); + _usb_strerror = (usb_strerror_t) + GetProcAddress(libusb_dll, "usb_strerror"); + _usb_init = (usb_init_t) + GetProcAddress(libusb_dll, "usb_init"); + _usb_set_debug = (usb_set_debug_t) + GetProcAddress(libusb_dll, "usb_set_debug"); + _usb_find_busses = (usb_find_busses_t) + GetProcAddress(libusb_dll, "usb_find_busses"); + _usb_find_devices = (usb_find_devices_t) + GetProcAddress(libusb_dll, "usb_find_devices"); + _usb_device = (usb_device_t) + GetProcAddress(libusb_dll, "usb_device"); + _usb_get_busses = (usb_get_busses_t) + GetProcAddress(libusb_dll, "usb_get_busses"); + _usb_install_service_np = (usb_install_service_np_t) + GetProcAddress(libusb_dll, "usb_install_service_np"); + _usb_uninstall_service_np = (usb_uninstall_service_np_t) + GetProcAddress(libusb_dll, "usb_uninstall_service_np"); + _usb_install_driver_np = (usb_install_driver_np_t) + GetProcAddress(libusb_dll, "usb_install_driver_np"); + _usb_get_version = (usb_get_version_t) + GetProcAddress(libusb_dll, "usb_get_version"); + _usb_isochronous_setup_async = (usb_isochronous_setup_async_t) + GetProcAddress(libusb_dll, "usb_isochronous_setup_async"); + _usb_bulk_setup_async = (usb_bulk_setup_async_t) + GetProcAddress(libusb_dll, "usb_bulk_setup_async"); + _usb_interrupt_setup_async = (usb_interrupt_setup_async_t) + GetProcAddress(libusb_dll, "usb_interrupt_setup_async"); + _usb_submit_async = (usb_submit_async_t) + GetProcAddress(libusb_dll, "usb_submit_async"); + _usb_reap_async = (usb_reap_async_t) + GetProcAddress(libusb_dll, "usb_reap_async"); + _usb_free_async = (usb_free_async_t) + GetProcAddress(libusb_dll, "usb_free_async"); + + if (_usb_init) + _usb_init(); +} + +usb_dev_handle *usb_open(struct usb_device *dev) +{ + if (_usb_open) + return _usb_open(dev); + else + return NULL; +} + +int usb_close(usb_dev_handle *dev) +{ + if (_usb_close) + return _usb_close(dev); + else + return -ENOFILE; +} + +int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, + size_t buflen) +{ + if (_usb_get_string) + return _usb_get_string(dev, index, langid, buf, buflen); + else + return -ENOFILE; +} + +int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, + size_t buflen) +{ + if (_usb_get_string_simple) + return _usb_get_string_simple(dev, index, buf, buflen); + else + return -ENOFILE; +} + +int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, + unsigned char type, unsigned char index, + void *buf, int size) +{ + if (_usb_get_descriptor_by_endpoint) + return _usb_get_descriptor_by_endpoint(udev, ep, type, index, buf, size); + else + return -ENOFILE; +} + +int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, + unsigned char index, void *buf, int size) +{ + if (_usb_get_descriptor) + return _usb_get_descriptor(udev, type, index, buf, size); + else + return -ENOFILE; +} + +int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) +{ + if (_usb_bulk_write) + return _usb_bulk_write(dev, ep, bytes, size, timeout); + else + return -ENOFILE; +} + +int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) +{ + if (_usb_bulk_read) + return _usb_bulk_read(dev, ep, bytes, size, timeout); + else + return -ENOFILE; +} + +int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) +{ + if (_usb_interrupt_write) + return _usb_interrupt_write(dev, ep, bytes, size, timeout); + else + return -ENOFILE; +} + +int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) +{ + if (_usb_interrupt_read) + return _usb_interrupt_read(dev, ep, bytes, size, timeout); + else + return -ENOFILE; +} + +int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, + int value, int index, char *bytes, int size, + int timeout) +{ + if (_usb_control_msg) + return _usb_control_msg(dev, requesttype, request, value, index, bytes, + size, timeout); + else + return -ENOFILE; +} + +int usb_set_configuration(usb_dev_handle *dev, int configuration) +{ + if (_usb_set_configuration) + return _usb_set_configuration(dev, configuration); + else + return -ENOFILE; +} + +int usb_claim_interface(usb_dev_handle *dev, int interface) +{ + if (_usb_claim_interface) + return _usb_claim_interface(dev, interface); + else + return -ENOFILE; +} + +int usb_release_interface(usb_dev_handle *dev, int interface) +{ + if (_usb_release_interface) + return _usb_release_interface(dev, interface); + else + return -ENOFILE; +} + +int usb_set_altinterface(usb_dev_handle *dev, int alternate) +{ + if (_usb_set_altinterface) + return _usb_set_altinterface(dev, alternate); + else + return -ENOFILE; +} + +int usb_resetep(usb_dev_handle *dev, unsigned int ep) +{ + if (_usb_resetep) + return _usb_resetep(dev, ep); + else + return -ENOFILE; +} + +int usb_clear_halt(usb_dev_handle *dev, unsigned int ep) +{ + if (_usb_clear_halt) + return _usb_clear_halt(dev, ep); + else + return -ENOFILE; +} + +int usb_reset(usb_dev_handle *dev) +{ + if (_usb_reset) + return _usb_reset(dev); + else + return -ENOFILE; +} + +int usb_reset_ex(usb_dev_handle *dev, unsigned int reset_type) +{ + if (_usb_reset_ex) + return _usb_reset_ex(dev, reset_type); + else + return -ENOFILE; +} + +char *usb_strerror(void) +{ + if (_usb_strerror) + return _usb_strerror(); + else + return NULL; +} + +void usb_set_debug(int level) +{ + if (_usb_set_debug) + return _usb_set_debug(level); +} + +int usb_find_busses(void) +{ + if (_usb_find_busses) + return _usb_find_busses(); + else + return -ENOFILE; +} + +int usb_find_devices(void) +{ + if (_usb_find_devices) + return _usb_find_devices(); + else + return -ENOFILE; +} + +struct usb_device *usb_device(usb_dev_handle *dev) +{ + if (_usb_device) + return _usb_device(dev); + else + return NULL; +} + +struct usb_bus *usb_get_busses(void) +{ + if (_usb_get_busses) + return _usb_get_busses(); + else + return NULL; +} + +int usb_install_service_np(void) +{ + if (_usb_install_service_np) + return _usb_install_service_np(); + else + return -ENOFILE; +} + +int usb_uninstall_service_np(void) +{ + if (_usb_uninstall_service_np) + return _usb_uninstall_service_np(); + else + return -ENOFILE; +} + +int usb_install_driver_np(const char *inf_file) +{ + if (_usb_install_driver_np) + return _usb_install_driver_np(inf_file); + else + return -ENOFILE; +} + +const struct usb_version *usb_get_version(void) +{ + if (_usb_get_version) + return _usb_get_version(); + else + return NULL; +} + +int usb_isochronous_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep, int pktsize) +{ + if (_usb_isochronous_setup_async) + return _usb_isochronous_setup_async(dev, context, ep, pktsize); + else + return -ENOFILE; +} + +int usb_bulk_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep) +{ + if (_usb_bulk_setup_async) + return _usb_bulk_setup_async(dev, context, ep); + else + return -ENOFILE; +} + +int usb_interrupt_setup_async(usb_dev_handle *dev, void **context, + unsigned char ep) +{ + if (_usb_interrupt_setup_async) + return _usb_interrupt_setup_async(dev, context, ep); + else + return -ENOFILE; +} + +int usb_submit_async(void *context, char *bytes, int size) +{ + if (_usb_submit_async) + return _usb_submit_async(context, bytes, size); + else + return -ENOFILE; +} + +int usb_reap_async(void *context, int timeout) +{ + if (_usb_reap_async) + return _usb_reap_async(context, timeout); + else + return -ENOFILE; +} + +int usb_free_async(void **context) +{ + if (_usb_free_async) + return _usb_free_async(context); + else + return -ENOFILE; +} diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib b/windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib new file mode 100755 index 0000000000000000000000000000000000000000..64ac6f79d01ea0085188a82b04a2e0f8fd94c1fc GIT binary patch literal 11974 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 J0cvc>{{#Q6v?~Ar literal 0 HcmV?d00001 diff --git a/windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib b/windows_activator/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib new file mode 100755 index 0000000000000000000000000000000000000000..dfdaad05d14b3a56d6446ce3a79a4aa7b6f1e712 GIT binary patch literal 11674 zcmcIqO>7)R7Jm7I;Fw_YQ%j} zepT(s*K0w2=Pv`Vl;Xcjm&mARPmz$0H^_++5#B94{+v3fVl^f z#vTF?oxi8(H+&Kumvrtc0HV>~6_xObH2b}znV$iO#z!PA9R(md`&iQa69A&cFBPrg z6KU)%NedqW2*N%sAT9kOsq_;7(bA`q#<2~ei4P==e~xveb7e`>zXA}=V0%O>-$=S} z4uEL#HAUaz6KVN7Nh{bFqSB6}IV=;6;&>3vUYE4If%-`EgNpX>iF6k2h$bFMnwkS3 znnpdMsjnqXqwe&cXxAC^~=CwQ5(8AkoJ80~*+O7{#!SL(NR_F?WEE&mNx8sDJ!1M14F{|2ioDh+k zvL&Ocxp9kz8`cA_-Dw5R)+dhZH`*=F??fmW;;c3-cFgasZu9TXKLW2KyT+=fJ;4mz zT0=BtYDNRQ=LSKy-C<27c{c5+QKKwaMz`MbJ3*`I?1plfdEID*I2S0{_U?9rTE}b2 zsZ4W?MZH<`b{zq`U90OEj`NIm;5OY_=qB{jTw_7lwPq&{kYXDBz(t|k79*_7Mp{Ss zz}dkDg#xP@9bskc*&GXrLb>+;Mn$g(y z{Dy;zGjv1IIIkzP8t%tlovUev(UTm}kSZD(ttke?sz%52!%nT)bV4^EEXS9_ZDHrx zI6>EMG@GIuX;UpVEp+{~mN2#o^6hl%v{Bj2wcNC#u^WN+u^S{^HryNw-6(;kn$tpK z-)VL0JE*wrYv*wbXAbD>`Myl%9-uvOm)T7Ih=Vgz)$ZKoD~ z;@9OoX2^`S*!7ZTDW=gk8(PxHE-{v2cWc+f%_HhujA8U}qvS5Is!hl7TlJb>cV*lf zWy3dCQjzr_#xQ!@f$K6YRy8_0V0_nYgbwaRom$XIhG9x*v2VX0TX8I0xt9 zMOcJEn1{o#3@h+5oQ7dI2`Ats7=<&i1T!!TC7681tslZD*+<4`Ld%x!6Ik9nrIfKuRj6Q=Y?MePmS@LB@k2peCR10&(`hhc@prLd zr*ab3p_D8=cec!pwO|wLM(BlQcBH75%rV$5L^`qkM=-3XpTrp>I{31EhKyMn&i57) ziMo`lgg>4lu$_d|<6DJzbH`b+-9uYg58Zml&`Nr*pgKFh$OUfp2PsZ)`C#iUCABAT zOTV2=JCezYtx2}_d1HnhH;S!yX`orj=})e4p`DT9k}SIXFpF1AhN+shO#10nEV*49!g9k7J#Egr6tHSe{cV!LW4J_Q(74=+)p*L2& zMy*qup`=s%F!6+cBmGZS;SfI8;o=WUZ%wf=FT)?=X+5g0L+OWu_&kAG9sQ0mrxxJk z(DTUqkC4cI&ObVF%c}>iu(jPOEo?59Zr<2EypuRer$Rbt1d&eFaEM=`Kk7%V16)-#dK`pJ z{JXFG@u@{hxq693%0Uq+{}O$p9@-@eSC_S_%VRl9ez5)LV>SnAdnTD5FPDdB!P@7z#jr9WAFq@! zOORM95$7m}jQA;v2Vd{wxRw!#c!7v_fi}F@sjV+x^Y)OJ7`8eR_Jvi|DS2XC zr_j%#6qY`3a!6J#wjOfU-pdS8pJiG5d`gR9=`=Fo-D&jhgu)W%WDe5vZjv{KCnJ=^ zahvBKh4p@4Sb5PilESi0Vz1s+qyPMgXR^~6J);Rkb1xHfvgb9jmXWLAM;-jG5|3De z`Bc2kSS$4A7>khgr4nBLH2U+jnh~e?84AB4X-_p?Rtn$qoMwz~2~j6fsOdDmSG+a- z?_!Ca6+hVFcQEB;#^oEs;zM0*WoFDK?dazfuDICaAU#KG-W#~2P|P(UccS-9qndH9 z#Lt>AnZhzxlH5U7E;NdHd(KpZnf&h`hQeJggjmUlPdckiM~Ju@c+0$83?*Y{!_U9? z4cNZ|HaOf&IcE8L(_7RU6o>4|f-?jBM zb^P+0L$Y!qAMXHRFVf|K5TBts&#n_Bn&Q*!!wj%UBgFh`O4CYIFJj DaB1hA literal 0 HcmV?d00001 diff --git a/windows_activator/main.c b/windows_activator/main.c new file mode 100644 index 0000000..66e0a23 --- /dev/null +++ b/windows_activator/main.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include "libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" + +#if INTPTR_MAX == INT64_MAX +#pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") +#elif INTPTR_MAX == INT32_MAX +#pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib") +#else +#error Unknown pointer size or missing size macros! +#endif + +int main() { + printf("Hello, World!\n"); + return 0; +} + +void openDev(){ + struct usb_bus* bus = NULL; + struct usb_device* dev = NULL; + struct usb_dev_handle* udh = NULL; + usb_find_busses(); + usb_find_devices(); + for (bus = usb_get_busses(); bus; bus = bus->next) + { + for (dev = bus->devices; dev; dev = dev->next) + { + if (dev->descriptor.idVendor == 0x05AC) + { + udh = usb_open(dev); + } + } + } + usb_control_msg(udh, 0x40, 0x52, 0x00, 0x02, 0, 0, 1000); + sleep(1); +} From 878d1ff4007bd8852eb605dccc30386124cfe06d Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 19:54:17 +0200 Subject: [PATCH 03/44] workflow experiment --- .github/workflows/build-activator.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/build-activator.yml diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml new file mode 100644 index 0000000..c820528 --- /dev/null +++ b/.github/workflows/build-activator.yml @@ -0,0 +1,14 @@ +on: [push] + +name: Build Activator Test +jobs: + build_windows_activator: + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: compile + run: | + cmake -Bbuild -H. + cmake --build build --target all + working-directory: ./windows_activator \ No newline at end of file From e2abab55a22fc8a023e2a6eff3d7896afe4076e2 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 19:56:10 +0200 Subject: [PATCH 04/44] workflow experiment --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index c820528..eeb72a8 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -9,6 +9,6 @@ jobs: uses: actions/checkout@v2 - name: compile run: | - cmake -Bbuild -H. + cmake -Bbuild -H . cmake --build build --target all working-directory: ./windows_activator \ No newline at end of file From c40d745e05d9b0be0c354f8a2e26ad9dea09ffac Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 20:04:01 +0200 Subject: [PATCH 05/44] workflow experiment --- .github/workflows/build-activator.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index eeb72a8..6bb8a14 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -9,6 +9,7 @@ jobs: uses: actions/checkout@v2 - name: compile run: | + md build cmake -Bbuild -H . cmake --build build --target all working-directory: ./windows_activator \ No newline at end of file From 5879f33f028445d7d06e79b739d32831451462e9 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 22:16:59 +0200 Subject: [PATCH 06/44] workflow experiment --- .github/workflows/build-activator.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 6bb8a14..a07046a 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,6 +10,5 @@ jobs: - name: compile run: | md build - cmake -Bbuild -H . cmake --build build --target all working-directory: ./windows_activator \ No newline at end of file From 4eb92e5a11e401ac5ca4e42daf1ddf629e235415 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 22:17:25 +0200 Subject: [PATCH 07/44] disable tests for now --- .github/workflows/test.yml | 42 -------------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 18ff679..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,42 +0,0 @@ -on: pull_request - -name: Unit tests -jobs: - test_on_mac: - runs-on: macos-latest - steps: - - name: install gstreamer - run: brew install libusb pkg-config gstreamer gst-plugins-bad gst-plugins-good gst-plugins-base gst-plugins-ugly - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: 1.16.x - - name: Checkout code - uses: actions/checkout@v2 - - name: compile - run: go build - - name: run go test - run: go test -v ./... - test_on_linux: - runs-on: ubuntu-latest - steps: - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: 1.16.x - - name: Checkout code - uses: actions/checkout@v2 - - name: update - run: sudo apt-get update - - name: install libusb - run: sudo apt-get install -y libusb-1.0-0-dev - - name: installlibglib - run: sudo apt-get install -y libglib2.0-dev - - name: install gstreamer - run: sudo apt-get install -y libgstreamer1.0-0 libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio - - name: compile - run: go build - - name: run go test - run: go test -v ./... - env: - LINUX_CI: "true" From 58107b58ce744ea8b207a69c96b87b7312581763 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 22:20:53 +0200 Subject: [PATCH 08/44] disable tests for now --- .github/workflows/build-activator.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index a07046a..acf2b30 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,5 +10,6 @@ jobs: - name: compile run: | md build + cmake --configure ./ cmake --build build --target all working-directory: ./windows_activator \ No newline at end of file From 7f784ad9546a3e526f91f5edef9f5b80ff707a41 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 17 Aug 2022 22:23:17 +0200 Subject: [PATCH 09/44] disable tests for now --- .github/workflows/build-activator.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index acf2b30..327bdf9 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,6 +10,5 @@ jobs: - name: compile run: | md build - cmake --configure ./ - cmake --build build --target all + cmake --build build --config --target all working-directory: ./windows_activator \ No newline at end of file From 22f64cf3f9f54d8e9587b32b1c0ac32e9a9641b6 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Thu, 18 Aug 2022 20:41:32 +0200 Subject: [PATCH 10/44] complete impl --- windows_activator/main.c | 83 +++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index 66e0a23..c5574be 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -1,37 +1,82 @@ #include #include #include +#include #include "libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" +int openDev(char *serial); + #if INTPTR_MAX == INT64_MAX -#pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") +#pragma comment(lib, "libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") #elif INTPTR_MAX == INT32_MAX #pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib") #else #error Unknown pointer size or missing size macros! #endif -int main() { - printf("Hello, World!\n"); - return 0; +#define activate_device = "s" + +int main(int argc, char **argv) { + if (argc == 0) { + printf("no arguments passed, need device serial"); + return 1; + } + if (argc > 1) { + printf("invalid arguments passed, need device serial"); + return 1; + } + return openDev(argv[0]); } -void openDev(){ - struct usb_bus* bus = NULL; - struct usb_device* dev = NULL; - struct usb_dev_handle* udh = NULL; - usb_find_busses(); - usb_find_devices(); - for (bus = usb_get_busses(); bus; bus = bus->next) - { - for (dev = bus->devices; dev; dev = dev->next) - { - if (dev->descriptor.idVendor == 0x05AC) - { - udh = usb_open(dev); +int openDev(char *deviceSerial) { + printf("openDev, search: %s", deviceSerial); + struct usb_bus *bus = NULL; + struct usb_device *dev = NULL; + struct usb_dev_handle *udh = NULL; + int code; + code = usb_find_busses(); + if (code != 0) { + printf("error usb_find_busses: %d", code); + } + code = usb_find_devices(); + if (code != 0) { + printf("error usb_find_busses: %d", code); + } + for (bus = usb_get_busses(); bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + udh = usb_open(dev); + if (udh == 0) { + printf("error usb_open: pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); + continue; + } + char szSerialNumber[128] = {0}; + code = usb_get_string_simple(udh, dev->descriptor.iSerialNumber, szSerialNumber, sizeof(szSerialNumber)); + if (code != 0) { + printf("error usb_get_string_simple: %d", code); + continue; + } + printf("cmp: %s with %s", szSerialNumber, deviceSerial); + if (strcmp(szSerialNumber, deviceSerial) == 0) { + #ifdef activate_device + printf("match, send control message to activate"); + code = usb_control_msg(udh, 0x40, 0x52, 0x00, 0x02, 0, 0, 1000); + #else + printf("match, send control message to de-activate"); + code = usb_control_msg(udh, 0x40, 0x52, 0x00, 0x00, 0, 0, 1000); + #endif + if (code != 0) { + printf("error usb_control_msg: %d", code); + } + printf("sleep"); + sleep(1); + printf("done"); + return code; + } + code = usb_close(udh); + if (code != 0) { + printf("error usb_close: pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); } } } - usb_control_msg(udh, 0x40, 0x52, 0x00, 0x02, 0, 0, 1000); - sleep(1); + return 1; } From 1ce9935cfe1aafd54407468773127a9f8d49d87c Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Thu, 18 Aug 2022 20:46:02 +0200 Subject: [PATCH 11/44] try fix ci --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 327bdf9..dd0bc5d 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,5 +10,5 @@ jobs: - name: compile run: | md build - cmake --build build --config --target all + cmake --build build --target windows_activator -j 12 working-directory: ./windows_activator \ No newline at end of file From 2ffa3b601abf560c4f73ab8473c47f759c66c104 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:07:44 +0200 Subject: [PATCH 12/44] try fix ci --- .github/workflows/build-activator.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index dd0bc5d..f2c23ff 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,5 +10,6 @@ jobs: - name: compile run: | md build + cmake -DCMAKE_BUILD_TYPE=Debug -S "./" -B build cmake --build build --target windows_activator -j 12 working-directory: ./windows_activator \ No newline at end of file From 3bc65447d78aa4e213842abf50d486d8daf4c599 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:11:21 +0200 Subject: [PATCH 13/44] try fix ci --- windows_activator/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index c5574be..f12f9e2 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -1,6 +1,5 @@ #include #include -#include #include #include "libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" From d7c507b85871d680d2886c15cf15a15d2b72614d Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:17:40 +0200 Subject: [PATCH 14/44] try fix ci --- windows_activator/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index f12f9e2..58cd595 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -1,12 +1,12 @@ #include #include #include -#include "libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" +#include "./libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" int openDev(char *serial); #if INTPTR_MAX == INT64_MAX -#pragma comment(lib, "libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") +#pragma comment(lib, "./libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") #elif INTPTR_MAX == INT32_MAX #pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib") #else From 23f582dc230a8c1ff18de7fda7fdbea8c11e251d Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:19:15 +0200 Subject: [PATCH 15/44] try fix ci --- windows_activator/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index 58cd595..52a772d 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -6,7 +6,7 @@ int openDev(char *serial); #if INTPTR_MAX == INT64_MAX -#pragma comment(lib, "./libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") +#pragma comment(lib, "../libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib") #elif INTPTR_MAX == INT32_MAX #pragma comment(lib,"libusb-win32-bin-1.2.6.0/lib/msvc/libusb.lib") #else From 91bd4143249d36b09233685f151af3c35d2c66cd Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:21:42 +0200 Subject: [PATCH 16/44] try fix ci --- windows_activator/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/windows_activator/main.c b/windows_activator/main.c index 52a772d..4005d74 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "./libusb-win32-bin-1.2.6.0/include/lusb0_usb.h" int openDev(char *serial); From 9c0cef4062df48c2d78978b4f584d3a07575289e Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:23:00 +0200 Subject: [PATCH 17/44] try fix ci --- windows_activator/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index 4005d74..bca0c50 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -68,7 +68,7 @@ int openDev(char *deviceSerial) { printf("error usb_control_msg: %d", code); } printf("sleep"); - sleep(1); + Sleep(1000); printf("done"); return code; } From 776903f70641493e097a6da8d22ea625c37ed08c Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:27:48 +0200 Subject: [PATCH 18/44] artifact upload --- .github/workflows/build-activator.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index f2c23ff..c71483f 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -12,4 +12,8 @@ jobs: md build cmake -DCMAKE_BUILD_TYPE=Debug -S "./" -B build cmake --build build --target windows_activator -j 12 - working-directory: ./windows_activator \ No newline at end of file + working-directory: ./windows_activator + - uses: actions/upload-artifact@v3 + with: + name: my-artifact + path: ./windows_activator\build\Debug\windows_activator.exe \ No newline at end of file From aa41f1ead0c2c8083373af032dd7b2345a4fccd2 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 00:49:25 +0200 Subject: [PATCH 19/44] artifact upload --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index c71483f..0f7538c 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,7 +10,7 @@ jobs: - name: compile run: | md build - cmake -DCMAKE_BUILD_TYPE=Debug -S "./" -B build + cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build cmake --build build --target windows_activator -j 12 working-directory: ./windows_activator - uses: actions/upload-artifact@v3 From d9efe5494c7cd0376b4840c256d359b226912e16 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 09:06:51 +0200 Subject: [PATCH 20/44] try set release build --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 0f7538c..cac0e4f 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -11,7 +11,7 @@ jobs: run: | md build cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build - cmake --build build --target windows_activator -j 12 + cmake --build build --target windows_activator -j 12 --config Release working-directory: ./windows_activator - uses: actions/upload-artifact@v3 with: From 1fb8485fad0e1f89eb3798d54fd80566bed42c44 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 09:09:28 +0200 Subject: [PATCH 21/44] try set release build --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index cac0e4f..921f9ab 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -16,4 +16,4 @@ jobs: - uses: actions/upload-artifact@v3 with: name: my-artifact - path: ./windows_activator\build\Debug\windows_activator.exe \ No newline at end of file + path: ./windows_activator\build\Release\windows_activator.exe \ No newline at end of file From 1435f6f179d9d6aa322466207be146e9b894f587 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 09:17:44 +0200 Subject: [PATCH 22/44] ignore default argument, add more verbose output --- windows_activator/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/windows_activator/main.c b/windows_activator/main.c index bca0c50..f910256 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -17,15 +17,15 @@ int openDev(char *serial); #define activate_device = "s" int main(int argc, char **argv) { - if (argc == 0) { + if (argc < 2) { printf("no arguments passed, need device serial"); return 1; } - if (argc > 1) { + if (argc > 2) { printf("invalid arguments passed, need device serial"); return 1; } - return openDev(argv[0]); + return openDev(argv[1]); } int openDev(char *deviceSerial) { @@ -44,6 +44,7 @@ int openDev(char *deviceSerial) { } for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { + printf("checking device pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); udh = usb_open(dev); if (udh == 0) { printf("error usb_open: pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); From 29869271802923ee647752bcde171abe9fe8f2a3 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 19 Aug 2022 09:27:13 +0200 Subject: [PATCH 23/44] add init --- windows_activator/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows_activator/main.c b/windows_activator/main.c index f910256..ba96887 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -25,6 +25,8 @@ int main(int argc, char **argv) { printf("invalid arguments passed, need device serial"); return 1; } + usb_init(); + usb_set_debug(255); return openDev(argv[1]); } From 1f64fce4bd02023df9bc5063a66dbbb4560ab91b Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:12:41 +0200 Subject: [PATCH 24/44] try link lib --- windows_activator/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index d8d5bc0..ea1dcba 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -4,3 +4,5 @@ project(windows_activator C) set(CMAKE_C_STANDARD 99) add_executable(windows_activator main.c) + +target_link_libraries(windows_activator ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) From f94f49362c93418cb1bac722f8e9f775cf140276 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:13:31 +0200 Subject: [PATCH 25/44] add ls --- .github/workflows/build-activator.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 921f9ab..5a57678 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -11,7 +11,8 @@ jobs: run: | md build cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build - cmake --build build --target windows_activator -j 12 --config Release + cmake --build build --target windows_activator -j 12 --config Release + dir working-directory: ./windows_activator - uses: actions/upload-artifact@v3 with: From 30924abbf1649142a1abf27ed67e2703547f1061 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:15:10 +0200 Subject: [PATCH 26/44] add ls --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 5a57678..15d3de2 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -12,7 +12,7 @@ jobs: md build cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build cmake --build build --target windows_activator -j 12 --config Release - dir + dir build/* working-directory: ./windows_activator - uses: actions/upload-artifact@v3 with: From e21da1c95c5883c0e7de0c58439e14dc6a3b9b0a Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:17:56 +0200 Subject: [PATCH 27/44] add ls --- .github/workflows/build-activator.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 15d3de2..6aaf815 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -12,7 +12,8 @@ jobs: md build cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build cmake --build build --target windows_activator -j 12 --config Release - dir build/* + dir build/Release/* + dir build/x64/* working-directory: ./windows_activator - uses: actions/upload-artifact@v3 with: From 90c923452b747d1dc8d578c5d2f4061657bf6d6e Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:19:11 +0200 Subject: [PATCH 28/44] add ls --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 6aaf815..28b42d0 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -13,7 +13,7 @@ jobs: cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build cmake --build build --target windows_activator -j 12 --config Release dir build/Release/* - dir build/x64/* + dir build/x64/Release/* working-directory: ./windows_activator - uses: actions/upload-artifact@v3 with: From e9b60f1a93c7bca1e86d27f039740927abbf860f Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:21:38 +0200 Subject: [PATCH 29/44] try link lib --- windows_activator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index ea1dcba..19700ac 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -5,4 +5,4 @@ set(CMAKE_C_STANDARD 99) add_executable(windows_activator main.c) -target_link_libraries(windows_activator ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) +target_link_libraries(windows_activator SHARED ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) From 3e50caae35e28c42eb01e6905053b97a679ab672 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:27:24 +0200 Subject: [PATCH 30/44] try link lib --- windows_activator/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index 19700ac..f4065f1 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -3,6 +3,9 @@ project(windows_activator C) set(CMAKE_C_STANDARD 99) +add_library(bar SHARED IMPORTED) +set_property(TARGET bar PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) + add_executable(windows_activator main.c) -target_link_libraries(windows_activator SHARED ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) +target_link_libraries(windows_activator bar) From 9605067f85341369dc7e803a37b7cebb7d4eb287 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:30:11 +0200 Subject: [PATCH 31/44] remove unused arg --- .github/workflows/build-activator.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-activator.yml b/.github/workflows/build-activator.yml index 28b42d0..ec370c3 100644 --- a/.github/workflows/build-activator.yml +++ b/.github/workflows/build-activator.yml @@ -10,7 +10,7 @@ jobs: - name: compile run: | md build - cmake -DCMAKE_BUILD_TYPE=Release -S "./" -B build + cmake -S "./" -B build cmake --build build --target windows_activator -j 12 --config Release dir build/Release/* dir build/x64/Release/* From 2686edfd3ed9fe6018dd164d171b8c3312c4d0d6 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:31:21 +0200 Subject: [PATCH 32/44] try link lib --- windows_activator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index f4065f1..86a14c6 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -3,7 +3,7 @@ project(windows_activator C) set(CMAKE_C_STANDARD 99) -add_library(bar SHARED IMPORTED) +add_library(bar STATIC IMPORTED) set_property(TARGET bar PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) add_executable(windows_activator main.c) From a57ba52ed5c07312752f5aa72f83f6fd99bbcd54 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:33:44 +0200 Subject: [PATCH 33/44] try link lib --- windows_activator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index 86a14c6..5af1efb 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -4,7 +4,7 @@ project(windows_activator C) set(CMAKE_C_STANDARD 99) add_library(bar STATIC IMPORTED) -set_property(TARGET bar PROPERTY IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) +set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) add_executable(windows_activator main.c) From eeb24d58506b9d66453f757a2ac5051ba0b9d163 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:36:22 +0200 Subject: [PATCH 34/44] verbose cmake --- windows_activator/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index 5af1efb..24fb067 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.23) +set(CMAKE_VERBOSE_MAKEFILE ON) project(windows_activator C) set(CMAKE_C_STANDARD 99) From 7c841b3719ec8e12a3c6161194655825d014b602 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:43:56 +0200 Subject: [PATCH 35/44] try random stuff --- windows_activator/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index 24fb067..e236c0e 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -3,6 +3,8 @@ set(CMAKE_VERBOSE_MAKEFILE ON) project(windows_activator C) set(CMAKE_C_STANDARD 99) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) +set(BUILD_SHARED_LIBS TRUE) add_library(bar STATIC IMPORTED) set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) From 9d89870259398f4994bd8e660bd017f68b06227f Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:47:40 +0200 Subject: [PATCH 36/44] try random stuff --- windows_activator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index e236c0e..5718532 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -6,7 +6,7 @@ set(CMAKE_C_STANDARD 99) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) set(BUILD_SHARED_LIBS TRUE) -add_library(bar STATIC IMPORTED) +add_library(bar STATIC IMPORTED GLOBAL) set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) add_executable(windows_activator main.c) From 897f4e1a80d27cc67798bdb1f6e897171b5ba140 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 18:55:19 +0200 Subject: [PATCH 37/44] try random stuff --- windows_activator/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index 5718532..e99581f 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -11,4 +11,4 @@ set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/l add_executable(windows_activator main.c) -target_link_libraries(windows_activator bar) +target_link_libraries(windows_activator c:/libusb0.dll) From b453dc9ee13c14d8a6a4f8b8e4d57feb8f2c0a03 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 19:55:24 +0200 Subject: [PATCH 38/44] add some line breaks --- windows_activator/CMakeLists.txt | 6 ++---- windows_activator/main.c | 29 ++++++++++++++--------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/windows_activator/CMakeLists.txt b/windows_activator/CMakeLists.txt index e99581f..5d3ded6 100644 --- a/windows_activator/CMakeLists.txt +++ b/windows_activator/CMakeLists.txt @@ -3,12 +3,10 @@ set(CMAKE_VERBOSE_MAKEFILE ON) project(windows_activator C) set(CMAKE_C_STANDARD 99) -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) -set(BUILD_SHARED_LIBS TRUE) -add_library(bar STATIC IMPORTED GLOBAL) +add_library(bar STATIC IMPORTED) set_property(TARGET bar PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libusb-win32-bin-1.2.6.0/lib/msvc_x64/libusb.lib) add_executable(windows_activator main.c) -target_link_libraries(windows_activator c:/libusb0.dll) +target_link_libraries(windows_activator bar) \ No newline at end of file diff --git a/windows_activator/main.c b/windows_activator/main.c index ba96887..99502ef 100644 --- a/windows_activator/main.c +++ b/windows_activator/main.c @@ -18,11 +18,11 @@ int openDev(char *serial); int main(int argc, char **argv) { if (argc < 2) { - printf("no arguments passed, need device serial"); + printf("no arguments passed, need device serial\n"); return 1; } if (argc > 2) { - printf("invalid arguments passed, need device serial"); + printf("invalid arguments passed, need device serial\n"); return 1; } usb_init(); @@ -31,53 +31,52 @@ int main(int argc, char **argv) { } int openDev(char *deviceSerial) { - printf("openDev, search: %s", deviceSerial); + printf("openDev, search: %s\n", deviceSerial); struct usb_bus *bus = NULL; struct usb_device *dev = NULL; struct usb_dev_handle *udh = NULL; int code; code = usb_find_busses(); if (code != 0) { - printf("error usb_find_busses: %d", code); + printf("error usb_find_busses: %d\n", code); } code = usb_find_devices(); if (code != 0) { - printf("error usb_find_busses: %d", code); + printf("error usb_find_busses: %d\n", code); } for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { - printf("checking device pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); + printf("checking device pid: %x vid: %x \n", dev->descriptor.idProduct, dev->descriptor.idVendor); udh = usb_open(dev); if (udh == 0) { - printf("error usb_open: pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); + printf("error usb_open: pid: %x vid: %x \n", dev->descriptor.idProduct, dev->descriptor.idVendor); continue; } char szSerialNumber[128] = {0}; code = usb_get_string_simple(udh, dev->descriptor.iSerialNumber, szSerialNumber, sizeof(szSerialNumber)); if (code != 0) { - printf("error usb_get_string_simple: %d", code); - continue; + printf("error usb_get_string_simple: %d\n", code); } - printf("cmp: %s with %s", szSerialNumber, deviceSerial); + printf("cmp: %s with %s\n", szSerialNumber, deviceSerial); if (strcmp(szSerialNumber, deviceSerial) == 0) { #ifdef activate_device - printf("match, send control message to activate"); + printf("match, send control message to activate\n"); code = usb_control_msg(udh, 0x40, 0x52, 0x00, 0x02, 0, 0, 1000); #else printf("match, send control message to de-activate"); code = usb_control_msg(udh, 0x40, 0x52, 0x00, 0x00, 0, 0, 1000); #endif if (code != 0) { - printf("error usb_control_msg: %d", code); + printf("error usb_control_msg: %d\n", code); } - printf("sleep"); + printf("sleep\n"); Sleep(1000); - printf("done"); + printf("done\n"); return code; } code = usb_close(udh); if (code != 0) { - printf("error usb_close: pid: %x vid: %x ", dev->descriptor.idProduct, dev->descriptor.idVendor); + printf("error usb_close: pid: %x vid: %x \n", dev->descriptor.idProduct, dev->descriptor.idVendor); } } } From d108a39d271dc0fcac1b75bc9ea66e63b7f15685 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 20:48:35 +0200 Subject: [PATCH 39/44] add logs --- screencapture/discovery.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/screencapture/discovery.go b/screencapture/discovery.go index 89dacc5..00e1701 100644 --- a/screencapture/discovery.go +++ b/screencapture/discovery.go @@ -120,11 +120,11 @@ func findIosDevices(ctx *gousb.Context, validDeviceChecker func(desc *gousb.Devi return validDeviceChecker(desc) }) if err != nil { - return nil, err + return nil, fmt.Errorf("OpenDevices: %w", err) } iosDevices, err := mapToIosDevice(devices) if err != nil { - return nil, err + return nil, fmt.Errorf("mapToIosDevice: %w", err) } return iosDevices, nil From 07f6a02f55488b498c0f58c6d6f969de5e98a33e Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 20:50:08 +0200 Subject: [PATCH 40/44] add logs --- screencapture/discovery.go | 1 + 1 file changed, 1 insertion(+) diff --git a/screencapture/discovery.go b/screencapture/discovery.go index 00e1701..8968075 100644 --- a/screencapture/discovery.go +++ b/screencapture/discovery.go @@ -163,6 +163,7 @@ func PrintDeviceDetails(devices []IosDevice) []map[string]interface{} { } func isValidIosDevice(desc *gousb.DeviceDesc) bool { + log.Infof("descriptor: %+v", desc) muxConfigIndex, _ := findConfigurations(desc) if muxConfigIndex == -1 { return false From e9f0e25fb8d8967f4e310a35de1276313342993a Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 20:59:46 +0200 Subject: [PATCH 41/44] add logs --- screencapture/discovery.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screencapture/discovery.go b/screencapture/discovery.go index 8968075..bff7350 100644 --- a/screencapture/discovery.go +++ b/screencapture/discovery.go @@ -120,7 +120,7 @@ func findIosDevices(ctx *gousb.Context, validDeviceChecker func(desc *gousb.Devi return validDeviceChecker(desc) }) if err != nil { - return nil, fmt.Errorf("OpenDevices: %w", err) + log.Warnf("OpenDevices showed some errors, this might be a problem: %v", err) } iosDevices, err := mapToIosDevice(devices) if err != nil { From 954ad4d12995b18059bfc984bde5088e0191074d Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 21:00:41 +0200 Subject: [PATCH 42/44] add logs --- screencapture/discovery.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/screencapture/discovery.go b/screencapture/discovery.go index bff7350..03b189a 100644 --- a/screencapture/discovery.go +++ b/screencapture/discovery.go @@ -120,7 +120,7 @@ func findIosDevices(ctx *gousb.Context, validDeviceChecker func(desc *gousb.Devi return validDeviceChecker(desc) }) if err != nil { - log.Warnf("OpenDevices showed some errors, this might be a problem: %v", err) + log.Warnf("OpenDevices showed some errors, this might be a problem: %v %v", err, devices) } iosDevices, err := mapToIosDevice(devices) if err != nil { From af3c7eb7d1d04c9e8454131984664c7e553959ef Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Sun, 21 Aug 2022 21:03:59 +0200 Subject: [PATCH 43/44] add logs --- screencapture/discovery.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/screencapture/discovery.go b/screencapture/discovery.go index 03b189a..e1366ac 100644 --- a/screencapture/discovery.go +++ b/screencapture/discovery.go @@ -164,10 +164,13 @@ func PrintDeviceDetails(devices []IosDevice) []map[string]interface{} { func isValidIosDevice(desc *gousb.DeviceDesc) bool { log.Infof("descriptor: %+v", desc) - muxConfigIndex, _ := findConfigurations(desc) + muxConfigIndex, qtConfig := findConfigurations(desc) + log.Infof("configs: %d %d", muxConfigIndex, qtConfig) if muxConfigIndex == -1 { + log.Infof("don't open") return false } + log.Infof("open") return true } From 18077e5c9c0e8ee5fe873fca03ebfbe4fedad400 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Wed, 24 Aug 2022 20:10:20 +0200 Subject: [PATCH 44/44] add some link --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 42a9344..a392ca0 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,11 @@ [![codecov](https://codecov.io/gh/danielpaulus/quicktime_video_hack/branch/master/graph/badge.svg)](https://codecov.io/gh/danielpaulus/quicktime_video_hack) [![Go Report](https://goreportcard.com/badge/github.com/danielpaulus/quicktime_video_hack)](https://goreportcard.com/report/github.com/danielpaulus/quicktime_video_hack) + +windows notes: +https://github.com/google/gousb/issues/69 + + Release 0.6 - qvh without Gstreamer is finally stable on MacOSX. I ran it for 16 hours straight on parallel devices and it worked flawlessly.