Compare commits

...

48 commits
2.1 ... master

Author SHA1 Message Date
eliboa
417d212ea9
Delete FUNDING.yml 2021-11-30 22:10:25 +01:00
eliboa
0e72b97770
Merge pull request #51 from suDisdain/patch-1
Add additional alternative to RCM injectors list
2021-11-14 08:58:35 +01:00
eliboa
2524968059
Merge pull request #50 from Pysis868/feature/add-logging-switch
Add logging switch
2021-11-14 08:58:21 +01:00
Malachi
b6d6f18e6a
Add additional alternative to RCM injectors list
Added JTegraNX as an a suggestion for other platforms, as it is a cross-platform GUI choice
2021-11-14 14:19:09 +11:00
Pysis
6c0fb778f4 Cleaning
Made a consolidated output path style that seems reasonable, and ignored it from SCM.
Thought the project should build in release mode and found it was over-customized in debug mode.
Also had to fix some random security errors.
Made the build configurations more consistent, and also simplified them, opting now to only enable the env var method that is more flexible and may have been added automatically by the IDE as a successful recommendation.
Simplified README accordingly.
2021-09-23 02:22:38 -04:00
Pysis
5c37ceaa97 Re-enable logging feature with convenience
It seemed useful as I was having issues while using the program normal, and since it was already developed.

Added brand new gitignore file ignoring IDE cache and build result files.
Updated README with additional development instructions so the project can be built and work more immediately once opening.
Added new setting/preset `LOGGING` with a checkbox on the settings page.  Kept the overall dialog size by placing it near the bottom off to the right side from the install driver button for now.
Also fixed the tab order for all of those elements.
Added the usual element id unique at least to the 1 tab, removing a typo for another while I was in that same file, along with the relevant init code and user action handler for controlling the checkbox's state.

Had to initialize the `TegraRcm` object earlier in the dialog class and have the logging state properly initialized since there were `AppendLog` method calls early in program execution.

Updated the project tooling to 2019 (v142).
Swore the library file was being used before but I only found the include paths later on, so added that additional dependency so the program would build finding the external function references.
2021-09-23 01:09:36 -04:00
eliboa
1786276e52
Update README.md 2021-02-11 21:42:18 +01:00
eliboa
3be31123e9
Update README.md 2020-11-19 11:49:16 +01:00
eliboa
7b60923460
Update README.md 2020-07-21 17:16:23 +02:00
eliboa
2f00e5264b
Badges 2020-07-17 22:38:26 +02:00
eliboa
6e4d3a3906
Update README.md 2020-05-01 01:44:52 +02:00
eliboa
b115ecadb2
Create FUNDING.yml 2020-02-29 09:33:27 +01:00
eliboa
781da57c4e
Update README.md 2019-07-25 23:41:40 +02:00
eliboa
27f82da96a
Update README.md 2019-07-09 16:48:49 +02:00
eliboa
42658d7acb Merge branch 'master' of https://github.com/eliboa/TegraRcmGUI 2019-07-02 19:58:56 +02:00
eliboa
ce2d05edd4 v2.6 2019-07-02 19:58:02 +02:00
eliboa
5ce7782fab Remove submodule 2019-07-02 16:35:19 +02:00
eliboa
1467953323 Added biskeydump as submodule 2019-07-02 16:26:45 +02:00
eliboa
6e20afa898 Revert "Added biskeydump as submodule"
This reverts commit d506aa091c.
2019-07-02 16:16:04 +02:00
eliboa
d506aa091c Added biskeydump as submodule 2019-07-02 16:07:04 +02:00
eliboa
fb2e609b6e
Update README.md 2019-06-07 10:23:32 +02:00
eliboa
638f85281c
Update README.md 2019-03-10 23:49:46 +01:00
eliboa
730afcd0a4
Update README.md 2019-03-09 10:49:27 +01:00
eliboa
952fb4ec83
Update README.md 2019-02-03 00:05:01 +01:00
eliboa
cd9d69da30 Merge branch 'master' of https://github.com/eliboa/TegraRcmGUI 2019-02-02 23:26:48 +01:00
eliboa
83b771a186 V2.5 :
- TegraRcmSmash updated to v1.2.1-3
- memloader updated to v3
- Added rajkosto's UMS samples to mount eMMC partitions
- biskeydump v7 added : dump BIS keys for eMMC content decryption
- Added logging console
- Fixed #22 : enter problem
2019-02-02 23:25:26 +01:00
eliboa
1fc3004d41
Update README.md 2018-10-07 12:04:43 +02:00
eliboa
076f041175 init 2018-09-30 15:13:48 +02:00
eliboa
b324d94931
Update README.md 2018-09-12 00:15:01 +02:00
eliboa
65f1d80cda Fixed : RC=-50 bug (at last, hope so :\) 2018-09-11 21:31:12 +02:00
eliboa
74fa514608 minor fixes 2018-09-10 18:42:11 +02:00
eliboa
ad20c28501 Merge remote-tracking branch 'refs/remotes/origin/master' 2018-09-10 17:36:47 +02:00
eliboa
9c17f65208 Fixed : RC=-50 after injection (when app is launched at Win StartUp)
Added : Auto kill existing app process(es)
Added : Clean remaining entry keys from regestry (< v2.4)
2018-09-10 17:34:49 +02:00
eliboa
56f3e05586 Fixed : RC=-50 when injecting when app is launched at Win startup
Added : Auto kill existing app process(es)
Added : Clean remaining keys from regestry (<v2.4)
2018-09-10 17:24:39 +02:00
eliboa
9600f0d081 Merge remote-tracking branch 'refs/remotes/origin/master' 2018-09-09 17:52:50 +02:00
eliboa
739bbd3fc9 memloader v2 2018-09-09 17:48:52 +02:00
eliboa
cfa0dc0eb4
Update README.md 2018-09-08 10:37:39 +02:00
eliboa
3e41738d4b
Update README.md 2018-07-29 12:56:58 +02:00
eliboa
82434a0b96
Update README.md 2018-07-25 23:11:12 +02:00
eliboa
b34f976b22
Update README.md 2018-07-25 23:10:09 +02:00
eliboa
5e53cb8898
Update README.md 2018-07-25 22:59:46 +02:00
eliboa
55ed268530
Create LICENSE 2018-07-25 22:48:55 +02:00
eliboa
374c55e12f
Update README.md 2018-07-25 17:30:04 +02:00
eliboa
763ddd3473 Added : trigger autoinject option from tray context menu 2018-07-24 21:54:19 +02:00
eliboa
7b9b222148 Added : option to run app at Windows startup 2018-07-24 20:38:30 +02:00
eliboa
2516e8192d Use relative paths for favorites 2018-07-23 20:37:54 +02:00
eliboa
c45f13e083 Fix : UMS Tool title align 2018-06-29 21:59:39 +02:00
eliboa
20b22c90f0 Fixed : non utf-8 in directory path & filenames 2018-06-29 21:49:00 +02:00
43 changed files with 1825 additions and 447 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.vs
Output

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "TegraRcmGUI/tools/src/biskeydump"]
path = TegraRcmGUI/tools/src/biskeydump
url = https://github.com/eliboa/biskeydump

339
LICENSE Normal file
View file

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) 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
this service 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 make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. 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.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
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
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the 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 a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE 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.
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
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 2 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, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision 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, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This 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.

View file

@ -1,26 +1,59 @@
# TegraRcmGUI
A simple C++ GUI for [TegraRcmSmash](https://github.com/rajkosto/TegraRcmSmash) by [rajkosto](https://github.com/rajkosto). (payload loader for Nintendo Switch)
![Png](https://img.shields.io/badge/platform-windows-lightgrey)
![Png](https://img.shields.io/badge/latest%20stable%20release-2.6-yellow)
![GitHub](https://img.shields.io/github/license/eliboa/TegraRcmGUI)
![GitHub All Releases](https://img.shields.io/github/downloads/eliboa/TegraRcmGUI/total)
![GitHub repo size](https://img.shields.io/github/repo-size/eliboa/TegraRcmGUI)
![GitHub issues](https://img.shields.io/github/issues/eliboa/TegraRcmGUI)
## Important notice
This application is just a GUI for the command line program ["TegraRcmSmash"](https://github.com/rajkosto/TegraRcmSmash) (all credits goes to @rajkosto & @ktemkin).
Please, *DO NOT* report issue on TegraRcmSmash's repo, report issue [here](https://github.com/eliboa/TegraRcmGUI/issues) *FIRST*.
# TegraRcmGUI
C++ GUI for [TegraRcmSmash](https://github.com/rajkosto/TegraRcmSmash) by [rajkosto](https://github.com/rajkosto) (Fusée Gelée exploit for Nintendo Switch)
The RCM exploit only works on "unpatched" units, i.e manufactured before July 2018. To check if your Switch is patched, use https://ismyswitchpatched.com/
## Features
- Inject payloads, such as CFW loaders
- Manage favorites ***!new v2.0!***
- Run Linux on your switch
- Mount device as USB mass storage (hold power button down for 10sec to exit)
- Auto inject option : automatically inject payload after selection or/and when the Switch is plugged in RCM mode (does not apply at startup)
- Minimize app to tray & tray icon context menu ***!new v2.0!***
- Inject payloads
- Manage favorites
- Run Linux on your switch (ShofEL2)
- Mount device as USB mass storage (read/write from/to SD card & NAND partitions, hold power button down for 5sec to exit)
- Dump BIS keys for eMMC content decryption (biskeydump by rajkosto)
- Option - "Auto inject" : automatically inject payload after selection or/and when the Switch is plugged in RCM mode
- Option - Minimize app to tray & tray icon's context menu
- Option - Run app at Windows startup
- Install APX device driver (if needed)
![Png](http://splatoon.eu/tuto_switch/TegraRcmGUI_v2.1.png)
![Png](https://www.eliboa.com/TegraRcmGUI_v2.5.png)
## Download
[Latest release](https://github.com/eliboa/TegraRcmGUI/releases) (Windows)
[Latest release](https://github.com/eliboa/TegraRcmGUI/releases/latest) (Windows)
## Important notice
This UI is **Windows-only**.
For other platforms, you can use :
- [Fusée Launcher](https://github.com/Cease-and-DeSwitch/fusee-launcher) (GNU/Linux)
- [NXBoot](https://mologie.github.io/nxboot/) (OS X, iOS)
- [JTegraNX](https://github.com/dylwedma11748/JTegraNX) (Windows, OS X, GNU/Linux)
- [NXLoader](https://github.com/DavidBuchanan314/NXLoader) (Android)
- [Web Fusée Launcher](https://fusee-gelee.firebaseapp.com/) (Cross-platform, only works with Chrome)
## Issue / Suggestion
Please open new [issue](https://github.com/eliboa/TegraRcmGUI/issues) to report a bug or submit a suggestion.
## Development
Install the [libusbk dev kit](https://sourceforge.net/projects/libusbk/) using the setup program, then create an environment variable `LIBUSBK_DIR` with the installation path as the value.
## How to backup/restore your Nintendo Switch's NAND ?
1) Use [memloader](https://github.com/rajkosto/memloader) v3 to mount eMMC on your computer
2) Download and open [NxNandManager](https://github.com/eliboa/NxNandManager). Select "File" then "Open drive".
3) Select the mounted drive. You can now perform backup/restore operations.
![Png](https://www.eliboa.com/NxNandManager_v1.1_howto_open_drive.png)
## Credits
- [Kate Temkin](https://github.com/ktemkin) / Fusée Launcher
- [Rajkosto](https://github.com/rajkosto) / TegraRcmSmash (Fusée Launcher reimplementation for Windows), momeloader, SD tool
- [fail0verflow](https://github.com/fail0verflow) / ShofEL2 (Boot stack for no-modification, universal code execution and Linux on the Nintendo Switch)
- [Rajkosto](https://github.com/rajkosto) / [TegraRcmSmash](https://github.com/rajkosto/TegraRcmSmash) (Fusée Launcher reimplementation for Windows), [memloader](https://github.com/rajkosto/memloader), SD tool, [biskeydump](https://github.com/rajkosto/biskeydump)
- [Kate Temkin](https://github.com/ktemkin) / [Fusée Launcher](https://github.com/Cease-and-DeSwitch/fusee-launcher)
- [fail0verflow](https://github.com/fail0verflow) / [ShofEL2](https://github.com/fail0verflow/shofel2) (Boot stack for no-modification, universal code execution and Linux on the Nintendo Switch)
- [SciresM](https://github.com/SciresM) / [Atmosphere](https://github.com/Atmosphere-NX/Atmosphere)
- [CTCaer](https://github.com/CTCaer/hekate) / [Hekate](https://github.com/CTCaer/hekate)
- [Reisyukaku](https://github.com/Reisyukaku/) / [ReiNX](https://github.com/Reisyukaku/ReiNX)

40
TegraRcmGUI.sln Normal file
View file

@ -0,0 +1,40 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.9
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TegraRcmGUI", "TegraRcmGUI\TegraRcmGUI.vcxproj", "{2C091C5B-378F-44D0-91F2-53489BA7B83C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
Static Debug|x64 = Static Debug|x64
Static Debug|x86 = Static Debug|x86
Static Release|x64 = Static Release|x64
Static Release|x86 = Static Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x64.ActiveCfg = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x64.Build.0 = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x86.ActiveCfg = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x86.Build.0 = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x64.ActiveCfg = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x64.Build.0 = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x86.ActiveCfg = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x86.Build.0 = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x64.ActiveCfg = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x64.Build.0 = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x86.ActiveCfg = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x86.Build.0 = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x64.ActiveCfg = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x64.Build.0 = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x86.ActiveCfg = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -107,21 +107,25 @@ BOOL DialogTab01::OnInitDialog()
for (int i = 0; i < m_TegraRcm->Favorites.GetCount(); i++)
{
CListBox*pListBox = (CListBox*)GetDlgItem(IDC_LIST1);
int nIndex = m_TegraRcm->Favorites[i].ReverseFind(_T('\\'));
CString fav = m_TegraRcm->Favorites[i];
int nIndex = fav.ReverseFind(_T('\\'));
CString csFilename, csPath, Item;
if (nIndex > 0)
{
CString csFilename, csPath, Item;
csFilename = m_TegraRcm->Favorites[i].Right(m_TegraRcm->Favorites[i].GetLength() - nIndex - 1);
csPath = m_TegraRcm->Favorites[i].Left(nIndex);
csFilename = fav.Right(fav.GetLength() - nIndex - 1);
csPath = fav.Left(nIndex);
Item = csFilename + _T(" (") + csPath + _T(")");
pListBox->AddString(_tcsdup(Item));
}
else
{
Item = fav;
}
pListBox->AddString(_tcsdup(Item));
wstring wcsPath(csPath);
string scsPath(wcsPath.begin(), wcsPath.end());
m_TegraRcm->AppendLog("Add favorites to listbox");
m_TegraRcm->AppendLog(scsPath);
}
wstring wcsPath(csPath);
string scsPath(wcsPath.begin(), wcsPath.end());
m_TegraRcm->AppendLog("Add favorites to listbox");
m_TegraRcm->AppendLog(scsPath);
}
CFont* pFont = GetFont();
@ -138,12 +142,12 @@ BOOL DialogTab01::OnInitDialog()
BEGIN_MESSAGE_MAP(DialogTab01, CDialog)
ON_BN_CLICKED(IDC_BROWSE, &DialogTab01::OnBnClickedBrowse)
ON_EN_CHANGE(PAYLOAD_PATH, &CTegraRcmGUIDlg::OnEnChangePath)
ON_BN_CLICKED(IDC_INJECT, &DialogTab01::InjectPayload)
ON_BN_CLICKED(ID_ADD_FAV, &DialogTab01::OnBnClickedAddFav)
ON_BN_CLICKED(ID_DEL_FAV, &DialogTab01::OnBnClickedDelFav)
ON_LBN_DBLCLK(IDC_LIST1, &DialogTab01::OnDblclkList1)
ON_LBN_SELCHANGE(IDC_LIST1, &DialogTab01::OnLbnSelchangeList1)
ON_MESSAGE(DM_GETDEFID, OnGetDefID)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
@ -242,6 +246,7 @@ void DialogTab01::InjectPayload()
{
m_TegraRcm->BitmapDisplay(LOADED);
m_TegraRcm->SendUserMessage("Payload injected !", VALID);
m_TegraRcm->AppendLogBox(TEXT("Payload successfully injected\r\n"));
m_TegraRcm->WAITING_RECONNECT = TRUE;
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Payload injected"), TEXT(" "), 1000, NIIF_INFO);
}
@ -251,6 +256,10 @@ void DialogTab01::InjectPayload()
string s = "Error while injecting payload (RC=" + std::to_string(rc) + ")";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Error"), TEXT("Error while injecting payload"), 1000, NIIF_ERROR);
m_TegraRcm->SendUserMessage(s.c_str(), INVALID);
CString rc_str;
rc_str.Format(L"%d", rc);
m_TegraRcm->AppendLogBox(TEXT("Error while injecting payload (RC=") + rc_str + TEXT(")\r\n"));
}
}
@ -291,6 +300,7 @@ void DialogTab01::OnBnClickedAddFav()
m_TegraRcm->SaveFavorites();
m_TegraRcm->SendUserMessage("Favorite added", VALID);
m_TegraRcm->AppendLogBox(TEXT("New favorite added\r\n"));
return;
}
@ -306,6 +316,8 @@ void DialogTab01::OnBnClickedDelFav()
m_TegraRcm->Favorites.RemoveAt(i);
m_TegraRcm->SaveFavorites();
m_TegraRcm->SendUserMessage("Favorite removed", VALID);
m_TegraRcm->AppendLogBox(TEXT("Favorite removed\r\n"));
}
return;
}
@ -353,3 +365,7 @@ HBRUSH DialogTab01::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
}
return hbr;
}
LRESULT DialogTab01::OnGetDefID(WPARAM wp, LPARAM lp)
{
return MAKELONG(0, DC_HASDEFID);
}

View file

@ -2,6 +2,7 @@
#include <string>
#include "TegraRcmGUIDlg.h"
#include "TegraRcm.h"
#include "afxole.h"
// DialogTab01 dialog
@ -19,7 +20,7 @@ public:
#endif
TCHAR* PAYLOAD_FILE;
BOOL PREVENT_AUTOINJECT = TRUE;
BOOL DELAY_AUTOINJECT = FALSE;
BOOL DELAY_AUTOINJECT = TRUE;
CArray <CString, CString> m_ListBox;
int m_SelectedItem = -1;
CFont m_BoldFont;
@ -38,4 +39,6 @@ public:
afx_msg void OnDblclkList1();
afx_msg void OnLbnSelchangeList1();
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
COleDropTarget FileDropTarget;
afx_msg LRESULT OnGetDefID(WPARAM wp, LPARAM lp);
};

View file

@ -29,7 +29,8 @@ SOFTWARE.
#include "TegraRcmGUI.h"
#include "afxdialogex.h"
#include "DialogTab02.h"
#include <stdlib.h>
#include <codecvt>
using namespace std;
@ -58,6 +59,7 @@ BEGIN_MESSAGE_MAP(DialogTab02, CDialogEx)
ON_BN_CLICKED(IDC_SHOFEL2, &DialogTab02::OnBnClickedShofel2)
// ON_WM_CTLCOLOR()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_DUMP_BISKEY, &DialogTab02::OnBnClickedDumpBiskey)
END_MESSAGE_MAP()
@ -92,6 +94,16 @@ BOOL DialogTab02::OnInitDialog()
);
pBtn->SetIcon(hIcn);
pBtn = (CButton*)GetDlgItem(IDC_DUMP_BISKEY);
pBtn->ModifyStyle(0, BS_ICON);
hIcn = (HICON)LoadImage(
AfxGetApp()->m_hInstance,
MAKEINTRESOURCE(ID_KEYS_ICON),
IMAGE_ICON,
height, height, // use actual size
LR_DEFAULTCOLOR
);
pBtn->SetIcon(hIcn);
CFont* pFont = GetFont();
LOGFONT lf;
@ -99,21 +111,57 @@ BOOL DialogTab02::OnInitDialog()
lf.lfWeight = FW_BOLD;
m_BoldFont.CreateFontIndirect(&lf);
CComboBox* pmyComboBox = (CComboBox*)GetDlgItem(ID_UMS_COMBO);
pmyComboBox->AddString(TEXT("eMMC BOOT0 (DANGEROUS)"));
pmyComboBox->AddString(TEXT("eMMC BOOT1 (DANGEROUS)"));
pmyComboBox->AddString(TEXT("eMMC rawNAND (DANGEROUS)"));
pmyComboBox->AddString(TEXT("MMC - SD Card"));
pmyComboBox->SetCurSel(3);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void DialogTab02::OnBnClickedMountSd()
{
CComboBox* pmyComboBox = (CComboBox*)GetDlgItem(ID_UMS_COMBO);
if (pmyComboBox->GetCurSel() < 3) {
CString message = _T("-----> WARNING <-----\nYou are about to mount internal storage of your Nintendo Switch\nBE VERY CAREFUL ! Do not format or write to your NAND partitions if you don't know what you're doing.\nTHIS COULD BRICK YOUR CONSOLE !!!\n\nAre you really sure you want to continue ?");
const int result = MessageBox(message, _T("BEWARE & WARNING"), MB_YESNO | MB_ICONWARNING);
if (result != IDYES) {
m_TegraRcm->AppendLogBox(TEXT("Mount NAND partition ABORTED\r\n"));
return;
}
}
m_TegraRcm->BitmapDisplay(LOADING);
GetParent()->UpdateWindow();
string s;
TCHAR args[] = TEXT("memloader\\memloader_usb.bin -r --dataini=memloader\\ums_sd.ini");
int rc = m_TegraRcm->Smasher(args);
if (rc < 0)
TCHAR args[256];
switch (pmyComboBox->GetCurSel())
{
case 0:
_tcscpy_s(args, 255, TEXT(".\\tools\\memloader\\memloader_usb.bin -r --dataini=.\\tools\\memloader\\ums_boot0.ini"));
break;
case 1:
_tcscpy_s(args, 255, TEXT(".\\tools\\memloader\\memloader_usb.bin -r --dataini=.\\tools\\memloader\\ums_boot1.ini"));
break;
case 2:
_tcscpy_s(args, 255, TEXT(".\\tools\\memloader\\memloader_usb.bin -r --dataini=.\\tools\\memloader\\ums_emmc.ini"));
break;
default:
_tcscpy_s(args, 255, TEXT(".\\tools\\memloader\\memloader_usb.bin -r --dataini=.\\tools\\memloader\\ums_sd.ini"));
break;
}
int rc = m_TegraRcm->Smasher(args, FALSE);
if (rc < -10)
{
m_TegraRcm->BitmapDisplay(LOAD_ERROR);
s = "Error while injecting payload (RC=" + std::to_string(rc) + ")";
s = "Error while injecting UMS Tool (RC=" + std::to_string(rc) + ")";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Error"), TEXT("Error while injecting payload"), 1000, NIIF_ERROR);
}
else
@ -122,8 +170,10 @@ void DialogTab02::OnBnClickedMountSd()
s = "UMS Tool injected";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("UMS Tool injected"), TEXT(" "), 1000, NIIF_INFO);
}
CA2T wt(s.c_str());
GetParent()->SetDlgItemText(INFO_LABEL, wt);
//CA2T wt(s.c_str());
//GetParent()->SetDlgItemText(INFO_LABEL, wt);
CString ss(s.c_str());
m_TegraRcm->AppendLogBox(ss + TEXT("\r\n"));
}
@ -132,8 +182,8 @@ void DialogTab02::OnBnClickedShofel2()
TCHAR *exe_dir = m_TegraRcm->GetAbsolutePath(TEXT(""), CSIDL_APPDATA);
string s;
TCHAR *COREBOOT_FILE = m_TegraRcm->GetAbsolutePath(TEXT("shofel2\\coreboot\\coreboot.rom"), CSIDL_APPDATA);
TCHAR *PAYLOAD = m_TegraRcm->GetAbsolutePath(TEXT("shofel2\\coreboot\\cbfs.bin"), CSIDL_APPDATA);
TCHAR *COREBOOT_FILE = m_TegraRcm->GetAbsolutePath(TEXT("tools\\shofel2\\coreboot\\coreboot.rom"), CSIDL_APPDATA);
TCHAR *PAYLOAD = m_TegraRcm->GetAbsolutePath(TEXT("tools\\shofel2\\coreboot\\cbfs.bin"), CSIDL_APPDATA);
CString COREBOOT_FILE2 = COREBOOT_FILE;
CString COREBOOT = _T("CBFS+") + COREBOOT_FILE2;
@ -143,7 +193,9 @@ void DialogTab02::OnBnClickedShofel2()
BOOL payload_exists = infile2.good();
if (!coreboot_exists || !payload_exists) {
GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Linux coreboot not found in \\shofel2 dir"));
//GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Linux coreboot not found in \\shofel2 dir"));
m_TegraRcm->AppendLogBox(TEXT("Linux coreboot not found in \\shofel2 di\r\n"));
CString message = _T("Kernel not found in shofel2 directory. Do you want to automatically download arch linux kernel from SoulCipher repo ?");
const int result = MessageBox(message, _T("Kernel not found"), MB_YESNOCANCEL | MB_ICONQUESTION);
if (result == IDYES)
@ -152,34 +204,39 @@ void DialogTab02::OnBnClickedShofel2()
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
TCHAR *download_script = m_TegraRcm->GetAbsolutePath(TEXT("shofel2\\download.bat"), CSIDL_APPDATA);
TCHAR *download_script = m_TegraRcm->GetAbsolutePath(TEXT("tools\\shofel2\\download.bat"), CSIDL_APPDATA);
BOOL bRet = CreateProcess(download_script, NULL, NULL, NULL, FALSE, 0, NULL, exe_dir, &si, &pif);
}
return; // TO-DO : Remove return for coreboot injection after download
}
m_TegraRcm->BitmapDisplay(LOADING);
GetParent()->UpdateWindow();
GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Loading coreboot. Please wait."));
//GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Loading coreboot. Please wait."));
m_TegraRcm->AppendLogBox(TEXT("Linux coreboot not found in \\shofel2 di\r\n"));
//int rc = device.SmashMain(5, args);
TCHAR cmd[MAX_PATH] = TEXT("--relocator= \"");
TCHAR cmd[4096] = TEXT("--relocator= \"");
lstrcat(cmd, _tcsdup(PAYLOAD));
lstrcat(cmd, TEXT("\" \"CBFS:"));
lstrcat(cmd, _tcsdup(COREBOOT_FILE));
lstrcat(cmd, TEXT("\""));
int rc = m_TegraRcm->Smasher(cmd);
int rc = m_TegraRcm->Smasher(cmd, FALSE);
int test = 1;
if (rc >= 0 || rc < -7)
{
GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Coreboot injected. Waiting 5s for device..."));
//GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Coreboot injected. Waiting 5s for device..."));
m_TegraRcm->AppendLogBox(TEXT("Coreboot injected. Waiting 5s for device...\r\n"));
Sleep(5000);
PROCESS_INFORMATION pif;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
TCHAR *imx_script = m_TegraRcm->GetAbsolutePath(TEXT("shofel2\\imx_usb.bat"), CSIDL_APPDATA);
GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Loading coreboot... Please wait."));
TCHAR *imx_script = m_TegraRcm->GetAbsolutePath(TEXT("tools\\shofel2\\imx_usb.bat"), CSIDL_APPDATA);
//GetParent()->SetDlgItemText(INFO_LABEL, TEXT("Loading coreboot... Please wait."));
m_TegraRcm->AppendLogBox(TEXT("Loading coreboot... Please wait\r\n"));
BOOL ret = CreateProcess(imx_script, NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, exe_dir, &si, &pif);
int rc = -50;
if (NULL != ret)
@ -200,21 +257,27 @@ void DialogTab02::OnBnClickedShofel2()
m_TegraRcm->BitmapDisplay(LOADED);
s = "\nCoreboot loaded !";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Coreboot loaded "), TEXT(" "), 1000, NIIF_INFO);
}
else
{
m_TegraRcm->BitmapDisplay(LOAD_ERROR);
s = "Error while loading imx_usb.exe";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Error"), TEXT("Error while loading imx_usb.exe"), 1000, NIIF_ERROR);
}
}
else
{
s = "Error while injecting payload. (RC=" + std::to_string(rc) + ")";
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Error"), TEXT("Error while injecting payload"), 1000, NIIF_ERROR);
}
CA2T wt2(s.c_str());
GetParent()->SetDlgItemText(INFO_LABEL, wt2);
//CA2T wt2(s.c_str());
//GetParent()->SetDlgItemText(INFO_LABEL, wt2);
CString ss(s.c_str());
m_TegraRcm->AppendLogBox(ss + TEXT("\r\n"));
}
HBRUSH DialogTab02::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
@ -225,8 +288,98 @@ HBRUSH DialogTab02::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
case ID_UMSTOOL_TITLE:
case ID_LINUX_TITLE:
case ID_BISKEY_TITLE:
pDC->SelectObject(&m_BoldFont);
break;
}
return hbr;
}
void DialogTab02::OnBnClickedDumpBiskey()
{
m_TegraRcm->BitmapDisplay(LOADING);
GetParent()->UpdateWindow();
TCHAR args[] = TEXT("-w tools\\biskeydump_usb.bin BOOT:0x0");
int rc = m_TegraRcm->Smasher(args);
BOOL keyFound = FALSE;
TCHAR *rfile = m_TegraRcm->GetAbsolutePath(TEXT("out.log"), CSIDL_APPDATA);
CString Cline;
std::wifstream fin(rfile, std::ios::binary);
fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
CString Filename;
for (wchar_t c; fin.get(c); ) {
CString Cchar(c);
if (Cchar == TEXT("\n")) {
if (Cline.Find(TEXT("HWI")) != -1 ||
Cline.Find(TEXT("SBK")) != -1 ||
Cline.Find(TEXT("TSEC KEY")) != -1 ||
Cline.Find(TEXT("BIS KEY")) != -1) {
if (!keyFound)
{
keyFound = TRUE;
CString szFilter;
szFilter = "TXT files (*.txt)|*.txt|All files (*.*)|*.*||";
CFileDialog FileOpenDialog(
FALSE,
NULL,
TEXT("BIS_keys.txt"),
OFN_HIDEREADONLY,
szFilter,
AfxGetMainWnd());
if (FileOpenDialog.DoModal() == IDOK)
{
CFile File;
Filename = FileOpenDialog.GetPathName();
remove(CT2A(Filename));
}
else {
return;
}
}
CT2CA pszConvertedAnsiString(Cline + _T('\n'));
std::string outLine = pszConvertedAnsiString;
fstream outFile;
outFile.open(Filename, fstream::in | fstream::out | fstream::app);
outFile << outLine;
outFile.close();
}
Cline.Empty();
}
else if (Cchar != TEXT("\r") && Cchar != TEXT("")) {
Cline.Append(Cchar);
}
}
fin.close();
CString s;
if (!keyFound)
{
m_TegraRcm->BitmapDisplay(LOAD_ERROR);
s.Append(TEXT("Error while retrieving BIS keys"));
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(TEXT("Error"), s, 1000, NIIF_ERROR);
s.Append(TEXT("\r\n"));
}
else
{
m_TegraRcm->BitmapDisplay(LOADED);
CString loc(Filename);
s.Append(TEXT("BIS keys saved to : "));
s.Append(loc);
if (!m_TegraRcm->CmdShow) m_TegraRcm->ShowTrayIconBalloon(s, TEXT(" "), 1000, NIIF_INFO);
s.Append(TEXT("\r\n"));
}
m_TegraRcm->AppendLogBox(s);
}

View file

@ -4,6 +4,8 @@
#include "TegraRcm.h"
// DialogTab02 dialog
class DialogTab02 :
@ -33,4 +35,5 @@ public:
// HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg void OnBnClickedDumpBiskey();
};

View file

@ -1,31 +1,3 @@
/*
DialogTab03.cpp
MIT License
Copyright(c) 2018 eliboa
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
//
#include "stdafx.h"
#include "TegraRcmGUI.h"
#include "DialogTab03.h"
@ -55,6 +27,7 @@ void DialogTab03::DoDataExchange(CDataExchange* pDX)
BOOL DialogTab03::OnInitDialog()
{
CDialog::OnInitDialog();
CleanRegestry();
string value = m_TegraRcm->GetPreset("AUTO_INJECT");
if (value == "TRUE")
@ -72,6 +45,26 @@ BOOL DialogTab03::OnInitDialog()
checkbox->SetCheck(BST_CHECKED);
}
value = m_TegraRcm->GetPreset("LOGGING");
if (value == "TRUE")
{
m_TegraRcm->LOGGING_CURR = TRUE;
CMFCButton* checkbox = (CMFCButton*)GetDlgItem(LOGGING);
checkbox->SetCheck(BST_CHECKED);
}
TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
PathAppend(szPath, _T("\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\TegraRcmGUI.lnk"));
std::ifstream infile(szPath);
if (infile.good()) {
infile.close();
CMFCButton*checkbox = (CMFCButton*)GetDlgItem(RUN_WINSTART);
checkbox->SetCheck(BST_CHECKED);
}
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
@ -80,6 +73,9 @@ BEGIN_MESSAGE_MAP(DialogTab03, CDialogEx)
ON_BN_CLICKED(AUTO_INJECT, &DialogTab03::OnClickedAutoInject)
ON_BN_CLICKED(MIN_TO_TRAY, &DialogTab03::OnClickedMinToTray)
ON_BN_CLICKED(ID_INSTALL_DRIVER, &DialogTab03::OnBnClickedInstallDriver)
ON_BN_CLICKED(RUN_WINSTART, &DialogTab03::OnBnClickedWinstart)
ON_BN_CLICKED(LOGGING, &DialogTab03::OnClickedLogging)
//ON_BN_CLICKED(IDC_BUTTON2, &DialogTab03::OnBnClickedButton2)
END_MESSAGE_MAP()
@ -126,8 +122,133 @@ void DialogTab03::OnClickedMinToTray()
}
void DialogTab03::OnClickedLogging()
{
// Get Minimize to tray checkbox value (checked, unchecked)
CButton* m_ctlCheck = (CButton*)GetDlgItem(LOGGING);
BOOL IsCheckChecked = (m_ctlCheck->GetCheck() == 1) ? true : false;
if (m_TegraRcm->LOGGING_CURR != IsCheckChecked)
{
if (IsCheckChecked) m_TegraRcm->SetPreset("LOGGING", "TRUE");
else m_TegraRcm->SetPreset("LOGGING", "FALSE");
m_TegraRcm->LOGGING_CURR = IsCheckChecked;
}
}
void DialogTab03::OnBnClickedInstallDriver()
{
m_TegraRcm->InstallDriver();
}
void DialogTab03::OnBnClickedWinstart()
{
// Init
HKEY hKey;
const std::string key = "TegraRcmGUI";
std::vector<char> buffer;
// Get checkbox value (checked, unchecked)
CButton *m_ctlCheck = (CButton*)GetDlgItem(RUN_WINSTART);
BOOL IsCheckChecked = (m_ctlCheck->GetCheck() == 1) ? true : false;
// Get application absolute path
TCHAR szPath[_MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
// Remove shortcut
PathAppend(szPath, _T("\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\TegraRcmGUI.lnk"));
if(remove(CW2A(szPath)) == 0) m_TegraRcm->AppendLogBox(TEXT("Winstart shortcut REMOVED\r\n"));
}
// Create new shortcut
if (IsCheckChecked) {
CreateLink();
m_TegraRcm->AppendLogBox(TEXT("Winstart shortcut ADDED\r\n"));
}
}
void DialogTab03::CreateLink()
{
TCHAR szAppPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szAppPath, _MAX_PATH));
TCHAR szPath[_MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
PathAppend(szPath, _T("\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\TegraRcmGUI.lnk"));
}
CoInitializeEx(NULL, 0);
HRESULT hres = 0;
IShellLink* psl;
if (SUCCEEDED(hres)) {
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
// Set the path to the shortcut target and add the description.
//PathAppend(szPath, _T("\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\TegraRcmGUI.lnk"));
psl->SetPath(szAppPath);
psl->SetArguments(_T("/autostart"));
psl->SetDescription(L"TegraRcmGUI");
psl->SetIconLocation(szAppPath, 0);
CString csPath, csPathf(szAppPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
psl->SetWorkingDirectory(csPath);
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres)) {
hres = ppf->Save(szPath, TRUE);
ppf->Release();
}
psl->Release();
}
}
CoUninitialize();
}
void DialogTab03::CleanRegestry() {
HKEY hKey;
const std::string key = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
const std::string subkey = "TegraRcmGUI";
// Open Run Registry location
LONG lnRes = RegOpenKeyExA(HKEY_CURRENT_USER,
key.c_str(), 0, KEY_READ, &hKey);
if (ERROR_SUCCESS == lnRes)
{
lnRes = RegQueryValueExA(hKey, subkey.c_str(), NULL, NULL, NULL, NULL);
if (lnRes != ERROR_FILE_NOT_FOUND)
{
//Remove regestry value
lnRes = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),
0L, KEY_WRITE,
&hKey);
if (lnRes != ERROR_FILE_NOT_FOUND)
{
//Remove regestry value
lnRes = RegDeleteValueA(hKey, subkey.c_str());
// Create new shortcut
CreateLink();
}
}
}
}
/*
void DialogTab03::OnBnClickedButton2()
{
m_TegraRcm->SetLocale();
}
*/

View file

@ -3,6 +3,19 @@
#include "TegraRcmGUIDlg.h"
#include "TegraRcm.h"
#include "stdafx.h"
#include <Windows.h>
#include <shlobj.h>
#include <winnls.h>
#include <shobjidl.h>
#include <objbase.h>
#include <objidl.h>
#include <shlguid.h>
#include <atlbase.h>
#include <atlconv.h>
// DialogTab03 dialog
class DialogTab03 : public CDialogEx
@ -30,4 +43,9 @@ public:
afx_msg void OnClickedAutoInject();
afx_msg void OnClickedMinToTray();
afx_msg void OnBnClickedInstallDriver();
afx_msg void OnBnClickedWinstart();
afx_msg void OnClickedLogging();
void CreateLink();
afx_msg void CleanRegestry();
};

View file

@ -24,9 +24,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <stdlib.h>
#include "stdafx.h"
#include "TegraRcm.h"
#include <sstream>
#include <fstream>
#include <codecvt>
using namespace std;
@ -34,8 +37,9 @@ TegraRcm::TegraRcm(CDialog* pParent /*=NULL*/)
{
m_Parent = pParent;
m_hWnd = AfxGetMainWnd()->GetSafeHwnd();
this->LOGGING_CURR = GetPreset("LOGGING") == "TRUE";
GetFavorites();
SendUserMessage("Waiting for device in RCM mode");
//SendUserMessage("Waiting for device in RCM mode");
}
TegraRcm::~TegraRcm()
@ -139,6 +143,12 @@ void TegraRcm::ShowContextMenu(HWND hWnd)
HMENU hMenu = CreatePopupMenu();
if (hMenu)
{
CString autoinjectLb;
if (AUTOINJECT_CURR) autoinjectLb = _T("Auto inject (On)");
else autoinjectLb = _T("Auto inject (Off)");
InsertMenu(hMenu, -1, MF_BYPOSITION, SWM_AUTOINJECT, autoinjectLb);
if (m_RC == 0)
{
@ -219,6 +229,7 @@ void TegraRcm::ShowContextMenu(HWND hWnd)
mii.dwTypeData = _T("Favorites");
CString csPathf, csFilename, payload;
m_Ctrltb1->GetDlgItem(PAYLOAD_PATH)->GetWindowTextW(csPathf);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0)
@ -249,7 +260,7 @@ void TegraRcm::ShowContextMenu(HWND hWnd)
DestroyMenu(hMenu);
}
}
LRESULT TegraRcm::OnTrayIconEvent(UINT wParam, LPARAM lParam)
LRESULT TegraRcm::OnTrayIconEvent(WPARAM wParam, LPARAM lParam)
{
if ((UINT)wParam != ID_SYSTEMTRAY)
{
@ -296,6 +307,89 @@ LRESULT TegraRcm::OnTrayIconEvent(UINT wParam, LPARAM lParam)
return ERROR_SUCCESS;
}
void TegraRcm::SetLocale()
{
TCHAR *rfile = GetAbsolutePath(TEXT("locale\\french.txt"), CSIDL_APPDATA);
std::wifstream wif(rfile);
wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
if (wif.is_open())
{
wif.seekg(0, std::ios::beg);
std::wstring wline;
std::wstring stringName;
std::wstring value;
std::wstring delimiter = L"=";
while (wif.good())
{
std::getline(wif, wline);
if (!wif.eof())
{
if (wline.find(delimiter) != std::string::npos) {
stringName = wline.substr(0, wline.find(delimiter));
value = wline.substr(wline.find(delimiter) + 1, wline.length() + 1);
CString value2 = value.c_str();
value2.Replace(_T('#'), '\n');
int intValue = stoi(stringName.c_str());;
if (intValue > 0) {
//TCITEM tcItem1;
//tcItem1.mask = TCIF_TEXT;
//tcItem1.pszText = _T("Test");
//AfxGetMainWnd()->m_tbCtrl->
//m_tbCtrl.InsertItem(0, &tcItem1);
//m_Ctrltb1->SetWindowText(_T("test"));
if (m_Ctrltb1->GetDlgItem(intValue)) {
m_Ctrltb1->SetDlgItemText(intValue, value2);
}
if (m_Ctrltb2->GetDlgItem(intValue)) {
m_Ctrltb2->SetDlgItemText(intValue, value2);
}
if (m_Ctrltb3->GetDlgItem(intValue)) {
m_Ctrltb3->SetDlgItemText(intValue, value2);
}
}
}
}
}
wif.close();
}
}
void TegraRcm::AppendLogBox(CString line) {
CEdit* pBox = (CEdit*)AfxGetMainWnd()->GetDlgItem(IDC_LOG_BOX);
CString Content;
pBox->GetWindowText(Content);
Content.Append(line);
AfxGetMainWnd()->SetDlgItemText(IDC_LOG_BOX, Content);
pBox->LineScroll(pBox->GetLineCount());
AfxGetMainWnd()->UpdateWindow();
}
void TegraRcm::UpdateLogBox() {
TCHAR *rfile = GetAbsolutePath(TEXT("out.log"), CSIDL_APPDATA);
CString Cline;
std::wifstream fin(rfile, std::ios::binary);
fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
for (wchar_t c; fin.get(c); ) {
CString Cchar(c);
if (Cchar == TEXT("\n")) {
Cline.Append(TEXT("\r\n"));
AppendLogBox(Cline);
Cline.Empty();
}
else if(Cchar != TEXT("\r")) {
Cline.Append(Cchar);
}
}
fin.close();
}
//
// Presets functions
@ -303,10 +397,10 @@ LRESULT TegraRcm::OnTrayIconEvent(UINT wParam, LPARAM lParam)
string TegraRcm::GetPreset(string param)
{
TCHAR *rfile = GetAbsolutePath(TEXT("presets.conf"), CSIDL_APPDATA);
CT2A rfile_c(rfile, CP_UTF8);
TRACE(_T("UTF8: %S\n"), rfile_c.m_psz);
//CT2A rfile_c(rfile, CP_UTF8);
//TRACE(_T("UTF8: %S\n"), rfile_c.m_psz);
ifstream readFile(rfile_c);
ifstream readFile(rfile);
string readout;
string search = param + "=";
std::string value = "";
@ -326,14 +420,9 @@ void TegraRcm::SetPreset(string param, string value)
{
TCHAR *rfile = GetAbsolutePath(TEXT("presets.conf"), CSIDL_APPDATA);
TCHAR *wfile = GetAbsolutePath(TEXT("presets.conf.tmp"), CSIDL_APPDATA);
CT2A rfile_c(rfile, CP_UTF8);
TRACE(_T("UTF8: %S\n"), rfile_c.m_psz);
CT2A wfile_c(wfile, CP_UTF8);
TRACE(_T("UTF8: %S\n"), wfile_c.m_psz);
// Replace or create preset in file
ofstream outFile(wfile_c);
ifstream readFile(rfile_c);
ofstream outFile(wfile);
ifstream readFile(rfile);
string readout;
string search = param + "=";
string replace = search + value + "\n";
@ -352,23 +441,25 @@ void TegraRcm::SetPreset(string param, string value)
}
outFile.close();
readFile.close();
remove(rfile_c);
rename(wfile_c, rfile_c);
remove(CT2A(rfile));
rename(CT2A(wfile), CT2A(rfile));
CString paramStr(param.c_str()), valueStr(value.c_str());
AppendLogBox(TEXT("Preset \"") + paramStr + TEXT("\" set to : ") + valueStr + TEXT("\r\n"));
}
void TegraRcm::GetFavorites()
{
Favorites.RemoveAll();
TCHAR *rfile = GetAbsolutePath(TEXT("favorites.conf"), CSIDL_APPDATA);
CT2A rfile_c(rfile, CP_UTF8);
TRACE(_T("UTF8: %S\n"), rfile_c.m_psz);
string readout;
AppendLog("Reading favorites.conf");
wstring wfilename(rfile);
string filename(wfilename.begin(), wfilename.end());
AppendLog(filename);
ifstream readFile(rfile_c);
ifstream readFile(rfile);
if (readFile.is_open()) {
AppendLog("Reading values from favorites.conf");
while (getline(readFile, readout)) {
@ -377,6 +468,27 @@ void TegraRcm::GetFavorites()
string sfav(wfav.begin(), wfav.end());
AppendLog("Append new favorite : ");
AppendLog(sfav);
// For relative path
int nIndex = fav.ReverseFind(_T(':'));
if (nIndex <= 0)
{
// Get current directory
CString csPath;
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
csPath.Append(_T("\\"));
csPath.Append(fav);
fav = csPath;
// Get absolute path
TCHAR buffer[4096] = TEXT("");
GetFullPathName(fav, 4096, buffer, NULL);
fav = buffer;
}
Favorites.Add(fav);
}
}
@ -386,6 +498,28 @@ void TegraRcm::GetFavorites()
}
void TegraRcm::AddFavorite(CString value)
{
// Get current directory
CString csPath;
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
CT2A pPath(csPath.GetBuffer(csPath.GetLength()));
CT2A pvalue(value.GetBuffer(value.GetLength()));
char* rvalue = GetRelativeFilename(pPath, pvalue);
value = rvalue;
/*
if (value.Find(csPath) != -1)
{
csPath.Append(_T("\\"));
value.Replace(csPath, _T(""));
}
*/
CString CoutLine(value + _T('\n'));
CT2CA pszConvertedAnsiString(CoutLine);
std::string outLine = pszConvertedAnsiString;
@ -393,13 +527,12 @@ void TegraRcm::AddFavorite(CString value)
outFile.open(GetAbsolutePath(TEXT("favorites.conf"), CSIDL_APPDATA), fstream::in | fstream::out | fstream::app);
outFile << outLine;
outFile.close();
}
void TegraRcm::SaveFavorites()
{
TCHAR *rfile = GetAbsolutePath(TEXT("favorites.conf"), CSIDL_APPDATA);
CT2A rfile_c(rfile, CP_UTF8);
TRACE(_T("UTF8: %S\n"), rfile_c.m_psz);
remove(rfile_c);
remove(CT2A(rfile));
for (int i = 0; i < Favorites.GetCount(); i++)
{
AddFavorite(Favorites[i]);
@ -411,8 +544,7 @@ void TegraRcm::SaveFavorites()
void TegraRcm::AppendLog(string message)
{
// DISABLED
return;
if (!this->LOGGING_CURR) return;
// Get time
@ -451,8 +583,13 @@ void TegraRcm::SendUserMessage(string message, int type)
LabelColor = RGB(0, 0, 0);
break;
}
AfxGetMainWnd()->SetDlgItemText(INFO_LABEL, wmessage);
//AfxGetMainWnd()->SetDlgItemText(INFO_LABEL, wmessage);
AppendLog(message);
/*
CString msgStr(message.c_str());
msgStr.Append(TEXT("\r\n"));
AppendLogBox(msgStr);
*/
}
@ -567,7 +704,6 @@ void TegraRcm::BitmapDisplay(int IMG)
//
void TegraRcm::LookUp()
{
// Exit when PAUSE_LKP_DEVICE flag is TRUE
if (PAUSE_LKP_DEVICE) return;
@ -582,7 +718,9 @@ void TegraRcm::LookUp()
m_Ctrltb1->GetDlgItem(IDC_INJECT)->EnableWindow(TRUE);
m_Ctrltb2->GetDlgItem(IDC_SHOFEL2)->EnableWindow(TRUE);
m_Ctrltb2->GetDlgItem(IDC_MOUNT_SD)->EnableWindow(TRUE);
m_Ctrltb2->GetDlgItem(IDC_DUMP_BISKEY)->EnableWindow(TRUE);
m_Ctrltb3->GetDlgItem(ID_INSTALL_DRIVER)->EnableWindow(FALSE);
}
// RCM Status = "USB Driver KO"
@ -591,6 +729,7 @@ void TegraRcm::LookUp()
m_Ctrltb1->GetDlgItem(IDC_INJECT)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_SHOFEL2)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_MOUNT_SD)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_DUMP_BISKEY)->EnableWindow(FALSE);
m_Ctrltb3->GetDlgItem(ID_INSTALL_DRIVER)->EnableWindow(TRUE);
}
// RCM Status = "RCM not detected"
@ -599,13 +738,14 @@ void TegraRcm::LookUp()
m_Ctrltb1->GetDlgItem(IDC_INJECT)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_SHOFEL2)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_MOUNT_SD)->EnableWindow(FALSE);
m_Ctrltb2->GetDlgItem(IDC_DUMP_BISKEY)->EnableWindow(FALSE);
m_Ctrltb3->GetDlgItem(ID_INSTALL_DRIVER)->EnableWindow(TRUE);
// Delay Auto inject if needed
if (AUTOINJECT_CURR) DELAY_AUTOINJECT = TRUE;
}
// On change RCM status
if (rc != m_RC)
if (rc != m_RC || m_RC == -99)
{
m_RC = rc;
//CStatic*pCtrl0 = (CStatic*) m_Parent->GetDlgItem(RCM_PIC_4);
@ -614,13 +754,20 @@ void TegraRcm::LookUp()
// Status changed to "RCM Detected"
if (rc == 0)
{
AppendLogBox(TEXT("RCM Device detected\r\n"));
BitmapDisplay(RCM_DETECTED);
CString file;
m_Ctrltb1->GetDlgItem(PAYLOAD_PATH)->GetWindowTextW(file);
// Trigger auto inject if payload injection scheduled
if (!FIRST_LOOKUP && DELAY_AUTOINJECT && file.GetLength() > 0)
//if (!FIRST_LOOKUP && DELAY_AUTOINJECT && file.GetLength() > 0)
if (FIRST_LOOKUP) {
if(AUTOINJECT_CURR) DELAY_AUTOINJECT = TRUE;
else DELAY_AUTOINJECT = FALSE;
}
if (DELAY_AUTOINJECT && file.GetLength() > 0 && AUTOINJECT_CURR)
{
BitmapDisplay(LOADING);
@ -633,7 +780,8 @@ void TegraRcm::LookUp()
if (rc >= 0)
{
BitmapDisplay(LOADED);
SendUserMessage("Payload injected !", VALID);
//SendUserMessage("Payload injected !", VALID);
AppendLogBox(TEXT("Payload successfully injected\r\n"));
if (!CmdShow) ShowTrayIconBalloon(TEXT("Payload injected"), TEXT(" "), 1000, NIIF_INFO);
WAITING_RECONNECT = TRUE;
}
@ -641,15 +789,19 @@ void TegraRcm::LookUp()
{
BitmapDisplay(LOAD_ERROR);
string s = "Error while injecting payload (RC=" + std::to_string(rc) + ")";
CString error = TEXT("Error while injecting payload");
CString rc_str;
rc_str.Format(L"%d", rc);
CString error = TEXT("Error while injecting payload (RC=") + rc_str + TEXT(")");
if (!CmdShow) ShowTrayIconBalloon(TEXT("Error"), error, 1000, NIIF_ERROR);
SendUserMessage(s.c_str(), INVALID);
//SendUserMessage(s.c_str(), INVALID);
AppendLogBox(error);
}
DELAY_AUTOINJECT = FALSE;
}
else
{
SendUserMessage("Waiting for user action");
SendUserMessage(labels[20].name);
}
}
// Status changed to "RCM not detected" or "USB driver KO"
@ -659,6 +811,7 @@ void TegraRcm::LookUp()
if (rc > -5)
{
BitmapDisplay(DRIVER_KO);
AppendLogBox(TEXT("RCM device detected but APX driver is not installed\r\n"));
InstallDriver();
}
else
@ -666,12 +819,15 @@ void TegraRcm::LookUp()
if (LookForAPXDevice())
{
BitmapDisplay(DRIVER_KO);
AppendLogBox(TEXT("RCM device detected but APX driver is not installed\r\n"));
InstallDriver();
}
else
{
BitmapDisplay(RCM_NOT_DETECTED);
if (FIRST_LOOKUP) SendUserMessage("Waiting for device in RCM mode");;
if (!FIRST_LOOKUP) AppendLogBox(TEXT("RCM device disconnected\r\n"));
else AppendLogBox(TEXT("No RCM device detected\r\n"));
if (FIRST_LOOKUP) SendUserMessage(labels[21].name);
}
}
}
@ -688,7 +844,7 @@ void TegraRcm::LookUp()
//
// Smasher => TegraRcmSmash.exe calls
//
int TegraRcm::Smasher(TCHAR args[])
int TegraRcm::Smasher(TCHAR args[4096], BOOL bInheritHandles)
{
if (WAITING_RECONNECT)
{
@ -702,11 +858,28 @@ int TegraRcm::Smasher(TCHAR args[])
}
WAITING_RECONNECT = FALSE;
}
// This should fix RC-50 issue, ! At last.
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
CString csPath2(csPath);
csPath.Append(TEXT(".\\TegraRcmSmash.exe "));
TCHAR cmd[4096];
_tcscpy_s(cmd, 4095, csPath);
lstrcat(cmd, args);
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
TCHAR *rfile = GetAbsolutePath(TEXT("out.log"), CSIDL_APPDATA);
remove(CT2A(rfile));
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL ret = FALSE;
@ -716,9 +889,24 @@ int TegraRcm::Smasher(TCHAR args[])
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = NULL;
TCHAR cmd[MAX_PATH] = TEXT(".\\TegraRcmSmash.exe ");
lstrcat(cmd, args);
ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if (bInheritHandles) {
HANDLE h = CreateFile(rfile,
GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
&sa,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
si.hStdError = h;
si.hStdOutput = h;
}
CString argsStr(args);
CString msgStr(TEXT("Invoking TegraRcmSmash.exe with args : ") + argsStr + TEXT("\r\n"));
AppendLogBox(msgStr);
ret = CreateProcess(NULL, cmd, NULL, NULL, bInheritHandles, flags, NULL, NULL, &si, &pi);
int rc = -50;
if (NULL != ret)
{
@ -726,10 +914,17 @@ int TegraRcm::Smasher(TCHAR args[])
DWORD exit_code;
if (FALSE != GetExitCodeProcess(pi.hProcess, &exit_code))
{
AppendLog("GetExitCodeProcess != FALSE");
if (STILL_ACTIVE != exit_code)
{
rc = exit_code;
}
else
{
rc = -52;
AppendLog("RC = -52");
}
}
else
{
@ -738,6 +933,27 @@ int TegraRcm::Smasher(TCHAR args[])
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
else {
int lastErrorCode = GetLastError();
LPWSTR lpMsgBuf = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
lastErrorCode,
0,
(LPWSTR)&lpMsgBuf,
0,
NULL);
std::string MyString = CW2A(lpMsgBuf);
std::string intStr = std::to_string(lastErrorCode);
//AppendLog(intStr);
//AppendLog(MyString);
CString CLogBuf(lpMsgBuf);
msgStr = TEXT("Error : ") + CLogBuf + TEXT("\r\n");
}
if (bInheritHandles) {
UpdateLogBox();
}
return rc;
}
//
@ -766,33 +982,215 @@ ULONGLONG TegraRcm::GetDllVersion(LPCTSTR lpszDllName)
}
return ullVersion;
}
void TegraRcm::KillRunningProcess(CString process) {
CString compare;
DWORD processID;
DWORD currentProcessID = GetCurrentProcessId();
bool procRunning = false;
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
procRunning = false;
}
else {
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32)) { // Gets first running process
if (pe32.szExeFile == process) {
procRunning = true;
}
else {
// loop through all running processes looking for process
while (Process32Next(hProcessSnap, &pe32)) {
// Set to an AnsiString instead of Char[] to make compare easier
compare = pe32.szExeFile;
processID = pe32.th32ProcessID;
if (compare == process && processID != currentProcessID) {
// if found process is running, set to true and break from loop
procRunning = true;
HWND hProcess = find_main_window(processID);
SendMessage(hProcess, WM_CLOSE, 0, 0);
DWORD err = GetLastError();
int test = 1;
//break;
}
}
}
// clean the snapshot object
CloseHandle(hProcessSnap);
}
}
}
struct handle_data {
unsigned long process_id;
HWND window_handle;
};
BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam)
{
handle_data& data = *(handle_data*)lParam;
unsigned long process_id = 0;
GetWindowThreadProcessId(handle, &process_id);
if (data.process_id != process_id)
return TRUE;
data.window_handle = handle;
return FALSE;
}
HWND TegraRcm::find_main_window(unsigned long process_id)
{
handle_data data;
data.process_id = process_id;
data.window_handle = 0;
EnumWindows(enum_windows_callback, (LPARAM)&data);
return data.window_handle;
}
TCHAR* TegraRcm::GetAbsolutePath(TCHAR* relative_path, DWORD dwFlags)
{
/*
// Get current directory
CString csPath;
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
CString csPath2;
csPath2 = csPath;
csPath2 += TEXT("\\");
csPath2 += relative_path;
return _tcsdup(csPath2);
*/
// USE THIS INSTEAD TO BUILD FOR MSI PACKAGER
//
//
BOOL PORTABLE = TRUE;
//
//
TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, dwFlags, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
if (dwFlags == CSIDL_APPDATA) PathAppend(szPath, _T("\\TegraRcmGUI"));
PathAppend(szPath, relative_path);
return _tcsdup(szPath);
if (PORTABLE) {
// Get current directory
CString csPath;
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
CString csPath2;
csPath2 = csPath;
csPath2 += TEXT("\\");
csPath2 += relative_path;
return _tcsdup(csPath2);
}
else
{
// USE THIS INSTEAD TO BUILD FOR MSI PACKAGER
TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, dwFlags, NULL, SHGFP_TYPE_CURRENT, szPath)))
{
if (dwFlags == CSIDL_APPDATA) PathAppend(szPath, _T("\\TegraRcmGUI"));
PathAppend(szPath, relative_path);
return _tcsdup(szPath);
}
return _T("");
}
return _T("");
}
// GetRelativeFilename(), by Rob Fisher.
// rfisher@iee.org
// http://come.to/robfisher
// defines
#define MAX_FILENAME_LEN 512
// The number of characters at the start of an absolute filename. e.g. in DOS,
// absolute filenames start with "X:\" so this value should be 3, in UNIX they start
// with "\" so this value should be 1.
#define ABSOLUTE_NAME_START 3
// set this to '\\' for DOS or '/' for UNIX
#define SLASH '\\'
// Given the absolute current directory and an absolute file name, returns a relative file name.
// For example, if the current directory is C:\foo\bar and the filename C:\foo\whee\text.txt is given,
// GetRelativeFilename will return ..\whee\text.txt.
char* TegraRcm::GetRelativeFilename(char *currentDirectory, char *absoluteFilename)
{
// declarations - put here so this should work in a C compiler
int afMarker = 0, rfMarker = 0;
int cdLen = 0, afLen = 0;
int i = 0;
int levels = 0;
static char relativeFilename[MAX_FILENAME_LEN + 1];
cdLen = strlen(currentDirectory);
afLen = strlen(absoluteFilename);
// make sure the names are not too long or too short
if (cdLen > MAX_FILENAME_LEN || cdLen < ABSOLUTE_NAME_START + 1 ||
afLen > MAX_FILENAME_LEN || afLen < ABSOLUTE_NAME_START + 1)
{
return NULL;
}
// Handle DOS names that are on different drives:
if (currentDirectory[0] != absoluteFilename[0])
{
// not on the same drive, so only absolute filename will do
strcpy_s(relativeFilename, MAX_FILENAME_LEN, absoluteFilename);
return relativeFilename;
}
// they are on the same drive, find out how much of the current directory
// is in the absolute filename
i = ABSOLUTE_NAME_START;
while (i < afLen && i < cdLen && currentDirectory[i] == absoluteFilename[i])
{
i++;
}
if (i == cdLen && (absoluteFilename[i] == SLASH || absoluteFilename[i - 1] == SLASH))
{
// the whole current directory name is in the file name,
// so we just trim off the current directory name to get the
// current file name.
if (absoluteFilename[i] == SLASH)
{
// a directory name might have a trailing slash but a relative
// file name should not have a leading one...
i++;
}
strcpy_s(relativeFilename, MAX_FILENAME_LEN, &absoluteFilename[i]);
return relativeFilename;
}
// The file is not in a child directory of the current directory, so we
// need to step back the appropriate number of parent directories by
// using "..\"s. First find out how many levels deeper we are than the
// common directory
afMarker = i;
levels = 1;
// count the number of directory levels we have to go up to get to the
// common directory
while (i < cdLen)
{
i++;
if (currentDirectory[i] == SLASH)
{
// make sure it's not a trailing slash
i++;
if (currentDirectory[i] != '\0')
{
levels++;
}
}
}
// move the absolute filename marker back to the start of the directory name
// that it has stopped in.
while (afMarker > 0 && absoluteFilename[afMarker - 1] != SLASH)
{
afMarker--;
}
// check that the result will not be too long
if (levels * 3 + afLen - afMarker > MAX_FILENAME_LEN)
{
return NULL;
}
// add the appropriate number of "..\"s.
rfMarker = 0;
for (i = 0; i < levels; i++)
{
relativeFilename[rfMarker++] = '.';
relativeFilename[rfMarker++] = '.';
relativeFilename[rfMarker++] = SLASH;
}
// copy the rest of the filename into the result string
strcpy_s(&relativeFilename[rfMarker], MAX_FILENAME_LEN, &absoluteFilename[afMarker]);
return relativeFilename;
}

View file

@ -16,6 +16,8 @@
#include <stdio.h>
#include <Strsafe.h>
#include "afxcmn.h"
#include <tlhelp32.h>
#pragma comment (lib, "setupapi.lib")
class TegraRcm
@ -23,11 +25,15 @@ class TegraRcm
public:
TegraRcm(CDialog* pParent = NULL);
~TegraRcm();
public:
void InitCtrltbDlgs(CDialog* pCtrltb1, CDialog* pCtrltb2, CDialog* pCtrltb3);
int GetRcmStatus();
ULONGLONG GetDllVersion(LPCTSTR lpszDllName);
TCHAR* GetAbsolutePath(TCHAR* relative_path, DWORD dwFlags);
void SetLocale();
void AppendLogBox(CString line);
void UpdateLogBox();
string GetPreset(string param);
void InstallDriver();
BOOL LookForAPXDevice();
@ -39,8 +45,13 @@ public:
void SaveFavorites();
void BitmapDisplay(int IMG);
void LookUp();
int Smasher(TCHAR args[]);
int Smasher(TCHAR args[], BOOL bInheritHandles = TRUE);
char* GetRelativeFilename(char *currentDirectory, char *absoluteFilename);
void KillRunningProcess(CString process);
HWND find_main_window(unsigned long process_id);
BOOL CmdShow = TRUE;
// Notify Icon
NOTIFYICONDATA m_NID;
@ -53,14 +64,15 @@ public:
BOOL SetTrayIcon(WORD wIconID);
void ShowContextMenu(HWND hWnd);
BOOL DestroyTrayIcon();
LRESULT OnTrayIconEvent(UINT wParam, LPARAM lParam);
LRESULT OnTrayIconEvent(WPARAM wParam, LPARAM lParam);
BOOL PAUSE_LKP_DEVICE = FALSE;
BOOL AUTOINJECT_CURR = FALSE;
BOOL DELAY_AUTOINJECT = FALSE;
BOOL DELAY_AUTOINJECT = TRUE;
BOOL WAITING_RECONNECT = FALSE;
BOOL ASK_FOR_DRIVER = FALSE;
BOOL MIN_TO_TRAY_CURR = FALSE;
BOOL LOGGING_CURR = FALSE;
CString csPath;
COLORREF LabelColor = RGB(0, 0, 0);
@ -75,6 +87,38 @@ public:
CDialog* m_Ctrltb1;
CDialog* m_Ctrltb2;
CDialog* m_Ctrltb3;
struct Label {
int uid;
string name;
};
Label labels[23] = {
{ 0, "TegraRcmGUI"},
{ 1, "No file selected" },
{ 2, "File doesn't exist" },
{ 3, "Injecting payload..." },
{ 4, "Payload injected !" },
{ 5, "Error while injecting payload" },
{ 6, "Favorite already exists" },
{ 7, "Favorite added" },
{ 8, "Favorite removed" },
{ 9, "UMS Tool injected" },
{ 10, "Linux coreboot not found in \\shofel2 dir" },
{ 11, "Kernel not found in shofel2 directory. Do you want to automatically download arch linux kernel from SoulCipher repo ?" },
{ 12, "Kernel not found" },
{ 13, "Loading coreboot. Please wait." },
{ 14, "Coreboot injected. Waiting 5s for device..." },
{ 15, "Coreboot loaded " },
{ 16, "Error" },
{ 17, "Error while loading imx_usb.exe" },
{ 18, "APX device driver is missing. Do you want to install it now ?" },
{ 19, "APX driver not found !" },
{ 20, "Waiting for user action" },
{ 21, "Waiting for device in RCM mode" },
{ 22, "Payload already injected. Are you sure you want to overwrite the stack again ?" }
};
private:
HWND m_hWnd;
TegraRcmSmash m_Device;

View file

@ -78,7 +78,10 @@ BOOL CTegraRcmGUIApp::InitInstance()
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// Get command line args
CCustomCommandLineInfo oInfo;
ParseCommandLine(oInfo);
AfxEnableControlContainer();
@ -93,12 +96,14 @@ BOOL CTegraRcmGUIApp::InitInstance()
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
CTegraRcmGUIDlg dlg;
if (oInfo.IsAutostart()) {
dlg.AUTOSTART = TRUE;
}
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
// TODO
}
else if (nResponse == IDCANCEL)
{
@ -121,5 +126,4 @@ int CTegraRcmGUIApp::Run()
{
int rc = 0;
return 0;
}
}

View file

@ -30,4 +30,24 @@ public:
DECLARE_MESSAGE_MAP()
};
class CCustomCommandLineInfo : public CCommandLineInfo
{
public:
CCustomCommandLineInfo()
{
m_bAutostart = FALSE;
}
BOOL m_bAutostart;
public:
BOOL IsAutostart() { return m_bAutostart; };
virtual void ParseParam(LPCTSTR pszParam, BOOL bFlag, BOOL bLast)
{
if (0 == wcscmp(pszParam, L"autostart"))
{
m_bAutostart = TRUE;
}
}
};
extern CTegraRcmGUIApp theApp;

Binary file not shown.

View file

@ -0,0 +1,40 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TegraRcmGUI", "TegraRcmGUI.vcxproj", "{2C091C5B-378F-44D0-91F2-53489BA7B83C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
Static Debug|x64 = Static Debug|x64
Static Debug|x86 = Static Debug|x86
Static Release|x64 = Static Release|x64
Static Release|x86 = Static Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x64.ActiveCfg = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x64.Build.0 = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x86.ActiveCfg = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Debug|x86.Build.0 = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x64.ActiveCfg = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x64.Build.0 = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x86.ActiveCfg = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Release|x86.Build.0 = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x64.ActiveCfg = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x64.Build.0 = Debug|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x86.ActiveCfg = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Debug|x86.Build.0 = Debug|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x64.ActiveCfg = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x64.Build.0 = Release|x64
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x86.ActiveCfg = Release|Win32
{2C091C5B-378F-44D0-91F2-53489BA7B83C}.Static Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -1,285 +1,292 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2C091C5B-378F-44D0-91F2-53489BA7B83C}</ProjectGuid>
<RootNamespace>TegraRcmGUI</RootNamespace>
<Keyword>MFCProj</Keyword>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>false</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>Version.lib;libusbK.lib</AdditionalDependencies>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="DialogTab01.h" />
<ClInclude Include="DialogTab02.h" />
<ClInclude Include="DialogTab03.h" />
<ClInclude Include="libusbk_int.h" />
<ClInclude Include="MyTabCtrl.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="res\BitmapPicture.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="TegraRcm.h" />
<ClInclude Include="TegraRcmGUI.h" />
<ClInclude Include="TegraRcmGUIDlg.h" />
<ClInclude Include="TegraRcmSmash.h" />
<ClInclude Include="Types.h" />
<ClInclude Include="Win32Def.h" />
<ClInclude Include="WinHandle.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="DialogTab01.cpp" />
<ClCompile Include="DialogTab02.cpp" />
<ClCompile Include="DialogTab03.cpp" />
<ClCompile Include="MyTabCtrl.cpp" />
<ClCompile Include="res\BitmapPicture.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="TegraRcm.cpp" />
<ClCompile Include="TegraRcmGUI.cpp" />
<ClCompile Include="TegraRcmGUIDlg.cpp" />
<ClCompile Include="TegraRcmSmash.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="TegraRcmGUI.rc">
<DeploymentContent>false</DeploymentContent>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\TegraRcmGUI.rc2" />
</ItemGroup>
<ItemGroup>
<Image Include="..\..\..\..\..\..\Visual Studio 2015\Projects\TegraRcmGUI\TegraRcmGUI\res\TegraRcmGUI.ico" />
<Image Include="res\add.ico" />
<Image Include="res\bitmap2.bmp" />
<Image Include="res\browse.ico" />
<Image Include="res\delete.ico" />
<Image Include="res\driver_ko.bmp" />
<Image Include="res\driver_ko_2.bmp" />
<Image Include="res\error.bmp" />
<Image Include="res\error_2.bmp" />
<Image Include="res\icon1.ico" />
<Image Include="res\init_log.bmp" />
<Image Include="res\init_logo.bmp" />
<Image Include="res\init_logo_2.bmp" />
<Image Include="res\linux_icon.ico" />
<Image Include="res\loaded.bmp" />
<Image Include="res\loaded_2.bmp" />
<Image Include="res\loading.bmp" />
<Image Include="res\loading_2.bmp" />
<Image Include="res\rcm_detected.bmp" />
<Image Include="res\rcm_detected_2.bmp" />
<Image Include="res\rcm_undetected.bmp" />
<Image Include="res\rcm_undetected_2.bmp" />
<Image Include="res\status.ico" />
<Image Include="res\TegraRcmGUI.ico" />
<Image Include="res\tray_ico_connected.ico" />
<Image Include="res\tray_ico_not_connected.ico" />
<Image Include="res\usb_icon.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="TegraRcmGUI.rc" />
</VisualStudio>
</ProjectExtensions>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2C091C5B-378F-44D0-91F2-53489BA7B83C}</ProjectGuid>
<RootNamespace>TegraRcmGUI</RootNamespace>
<Keyword>MFCProj</Keyword>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>false</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
<PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)\Output\$(Platform)\$(Configuration)\</OutDir>
<IntDir>Output\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)\Output\$(Platform)\$(Configuration)\</OutDir>
<IntDir>Output\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
<UACExecutionLevel>AsInvoker</UACExecutionLevel>
<EnableUAC>true</EnableUAC>
<UACUIAccess>false</UACUIAccess>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(LIBUSBK_DIR)\includes\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(LIBUSBK_DIR)\bin\lib\$(PlatformShortName.Replace('x64','amd64'))\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Version.lib;libusbK.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="DialogTab01.h" />
<ClInclude Include="DialogTab02.h" />
<ClInclude Include="DialogTab03.h" />
<ClInclude Include="libusbk_int.h" />
<ClInclude Include="MyTabCtrl.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="res\BitmapPicture.h" />
<ClInclude Include="ScopeGuard.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="TegraRcm.h" />
<ClInclude Include="TegraRcmGUI.h" />
<ClInclude Include="TegraRcmGUIDlg.h" />
<ClInclude Include="TegraRcmSmash.h" />
<ClInclude Include="Types.h" />
<ClInclude Include="Win32Def.h" />
<ClInclude Include="WinHandle.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="DialogTab01.cpp" />
<ClCompile Include="DialogTab02.cpp" />
<ClCompile Include="DialogTab03.cpp" />
<ClCompile Include="MyTabCtrl.cpp" />
<ClCompile Include="res\BitmapPicture.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="TegraRcm.cpp" />
<ClCompile Include="TegraRcmGUI.cpp" />
<ClCompile Include="TegraRcmGUIDlg.cpp" />
<ClCompile Include="TegraRcmSmash.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="TegraRcmGUI.rc">
<DeploymentContent>false</DeploymentContent>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\TegraRcmGUI.rc2" />
</ItemGroup>
<ItemGroup>
<Image Include="..\..\..\..\..\..\Visual Studio 2015\Projects\TegraRcmGUI\TegraRcmGUI\res\TegraRcmGUI.ico" />
<Image Include="res\add.ico" />
<Image Include="res\bitmap2.bmp" />
<Image Include="res\browse.ico" />
<Image Include="res\bunch-of-keys.ico" />
<Image Include="res\delete.ico" />
<Image Include="res\driver_ko.bmp" />
<Image Include="res\driver_ko_2.bmp" />
<Image Include="res\error.bmp" />
<Image Include="res\error_2.bmp" />
<Image Include="res\icon1.ico" />
<Image Include="res\init_log.bmp" />
<Image Include="res\init_logo.bmp" />
<Image Include="res\init_logo_2.bmp" />
<Image Include="res\linux_icon.ico" />
<Image Include="res\loaded.bmp" />
<Image Include="res\loaded_2.bmp" />
<Image Include="res\loading.bmp" />
<Image Include="res\loading_2.bmp" />
<Image Include="res\rcm_detected.bmp" />
<Image Include="res\rcm_detected_2.bmp" />
<Image Include="res\rcm_undetected.bmp" />
<Image Include="res\rcm_undetected_2.bmp" />
<Image Include="res\status.ico" />
<Image Include="res\TegraRcmGUI.ico" />
<Image Include="res\tray_ico_connected.ico" />
<Image Include="res\tray_ico_not_connected.ico" />
<Image Include="res\usb_icon.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="TegraRcmGUI.rc" />
</VisualStudio>
</ProjectExtensions>
</Project>

View file

@ -194,5 +194,8 @@
<Image Include="res\init_logo_2.bmp">
<Filter>Resource Files</Filter>
</Image>
<Image Include="res\bunch-of-keys.ico">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project>

View file

@ -92,6 +92,8 @@ BEGIN_MESSAGE_MAP(CTegraRcmGUIDlg, CDialog)
ON_COMMAND(SWM_FAV08, InjectFav08Command)
ON_COMMAND(SWM_FAV09, InjectFav09Command)
ON_COMMAND(SWM_FAV10, InjectFav10Command)
ON_COMMAND(SWM_AUTOINJECT, AutoInjectCommand)
ON_MESSAGE(WM_QUERYENDSESSION, OnQueryEndSession)
END_MESSAGE_MAP()
//
@ -99,6 +101,10 @@ END_MESSAGE_MAP()
//
BOOL CTegraRcmGUIDlg::OnInitDialog()
{
m_TegraRcm = new TegraRcm(this);
m_TegraRcm->AppendLog("new TegraRcm()");
CDialog::OnInitDialog();
// Accessibility
@ -108,18 +114,20 @@ BOOL CTegraRcmGUIDlg::OnInitDialog()
TCHAR szPath[_MAX_PATH];
VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szPath, _MAX_PATH));
CString csPathf(szPath);
CT2CA pszConvertedAnsiString(csPathf);
std::string strStd(pszConvertedAnsiString);
m_TegraRcm->AppendLog("Module filename is : ");
m_TegraRcm->AppendLog(strStd);
int nIndex = csPathf.ReverseFind(_T('\\'));
if (nIndex > 0) csPath = csPathf.Left(nIndex);
else csPath.Empty();
// Initialize bitmap
CRect rc;
AfxGetMainWnd()->GetWindowRect(rc);
int width = rc.Width();
int fontSize = width * 0.031;
if (width < 400)
{
RCM_BITMAP0.SetBitmap(INIT_LOGO_2);
@ -140,6 +148,26 @@ BOOL CTegraRcmGUIDlg::OnInitDialog()
RCM_BITMAP5.SetBitmap(LOADED);
RCM_BITMAP6.SetBitmap(LOAD_ERROR);
}
// Log Box
LOGFONT lf;
/*
CEdit* pBox = (CEdit*)AfxGetMainWnd()->GetDlgItem(IDC_LOG_BOX);
CFont* old = pBox->GetFont();
old->GetLogFont(&lf);
CFont newfont;
newfont.CreateFont(lf.lfHeight + 30, 0, lf.lfEscapement, lf.lfOrientation, lf.lfWeight, lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily, lf.lfFaceName);
pBox->SetFont(&newfont);
*/
CEdit* pBox = (CEdit*)AfxGetMainWnd()->GetDlgItem(IDC_LOG_BOX);
CFont *myFont = new CFont();
myFont->CreateFont(fontSize, 0, 0, 0, FW_NORMAL, false, false,
0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
FIXED_PITCH | FF_MODERN, _T("Verdana"));
pBox->SetFont(myFont);
// Menu
@ -163,7 +191,9 @@ BOOL CTegraRcmGUIDlg::OnInitDialog()
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_TegraRcm = new TegraRcm(this);
// Kill other running process of app
m_TegraRcm->KillRunningProcess(TEXT("TegraRcmGUI.exe"));
m_tbCtrl.InitDialogs(m_TegraRcm);
TCITEM tcItem1;
@ -194,6 +224,8 @@ BOOL CTegraRcmGUIDlg::OnInitDialog()
// Start timer to check RCM status every second
CTegraRcmGUIDlg::StartTimer();
return TRUE;
}
void CTegraRcmGUIDlg::OnSysCommand(UINT nID, LPARAM lParam)
@ -210,18 +242,25 @@ HBRUSH CTegraRcmGUIDlg::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
/*
if (GetDlgItem(IDC_RAJKOSTO)->GetSafeHwnd() == pWnd->GetSafeHwnd() || GetDlgItem(SEPARATOR)->GetSafeHwnd() == pWnd->GetSafeHwnd())
{
pDC->SetTextColor(RGB(192, 192, 192));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
*/
if (GetDlgItem(INFO_LABEL)->GetSafeHwnd() == pWnd->GetSafeHwnd())
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_TegraRcm->LabelColor);
return (HBRUSH) CreateSolidBrush( WhiteRGB );
}
if (GetDlgItem(IDC_LOG_BOX)->GetSafeHwnd() == pWnd->GetSafeHwnd())
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)CreateSolidBrush(WhiteRGB);
}
if (GetDlgItem(IDC_STATUS_BG)->GetSafeHwnd() == pWnd->GetSafeHwnd())
{
return (HBRUSH)CreateSolidBrush(WhiteRGB);
@ -288,7 +327,7 @@ void CTegraRcmGUIDlg::OnClose()
PostQuitMessage(0);
}
LRESULT CTegraRcmGUIDlg::OnTrayIconEvent(UINT wParam, LPARAM lParam)
LRESULT CTegraRcmGUIDlg::OnTrayIconEvent(WPARAM wParam, LPARAM lParam)
{
return m_TegraRcm->OnTrayIconEvent(wParam, lParam);
}
@ -340,6 +379,8 @@ void CTegraRcmGUIDlg::MountCommand()
if (m_TegraRcm != NULL)
{
DialogTab02 *pt = (DialogTab02*)m_TegraRcm->m_Ctrltb2;
CComboBox* pmyComboBox = (CComboBox*)pt->GetDlgItem(ID_UMS_COMBO);
pmyComboBox->SetCurSel(3);
pt->OnBnClickedMountSd();
}
}
@ -365,6 +406,32 @@ void CTegraRcmGUIDlg::InjectFavCommand(int i)
}
}
void CTegraRcmGUIDlg::AutoInjectCommand()
{
if (m_TegraRcm != NULL)
{
DialogTab03 *pt = (DialogTab03*)m_TegraRcm->m_Ctrltb3;
if (m_TegraRcm->AUTOINJECT_CURR)
{
m_TegraRcm->AUTOINJECT_CURR = FALSE;
m_TegraRcm->SetPreset("AUTO_INJECT", "FALSE");
m_TegraRcm->DELAY_AUTOINJECT = FALSE;
CButton *m_ctlCheck = (CButton*)pt->GetDlgItem(AUTO_INJECT);
m_ctlCheck->SetCheck(BST_UNCHECKED);
}
else
{
m_TegraRcm->AUTOINJECT_CURR = TRUE;
m_TegraRcm->SetPreset("AUTO_INJECT", "TRUE");
m_TegraRcm->DELAY_AUTOINJECT = TRUE;
CButton *m_ctlCheck = (CButton*)pt->GetDlgItem(AUTO_INJECT);
m_ctlCheck->SetCheck(BST_CHECKED);
}
AfxGetMainWnd()->UpdateWindow();
pt->OnClickedAutoInject();
}
}
void CTegraRcmGUIDlg::StartTimer()
{
@ -379,16 +446,26 @@ void CTegraRcmGUIDlg::StopTimer()
KillTimer(ID_TIMER_MINUTE);
KillTimer(ID_TIMER_SECONDS);
}
void CTegraRcmGUIDlg::OnTimer(UINT nIDEvent)
void CTegraRcmGUIDlg::OnTimer(UINT_PTR nIDEvent)
{
// Each second
if (nIDEvent == ID_TIMER_SECONDS)
{
m_TegraRcm->LookUp();
}
// After first initDialog, hide window if min2tray option is enabled
if (AUTOSTART)
{
if (m_TegraRcm->MIN_TO_TRAY_CURR) HideWindowCommand();
AUTOSTART = FALSE;
}
}
void CTegraRcmGUIDlg::OnEnChangePath()
LRESULT CTegraRcmGUIDlg::OnQueryEndSession(WPARAM wParm, LPARAM lParm)
{
int test = 1;
// This is not useful, exit is not needed in that case
m_TegraRcm->AppendLog("OnEndSession");
PostMessage(WM_QUIT);
return TRUE;
}

View file

@ -26,7 +26,7 @@
#include "TegraRcm.h"
#include "DialogTab01.h"
#include "DialogTab02.h"
#include "DialogTab03.h"
#pragma comment (lib, "setupapi.lib")
@ -54,9 +54,10 @@ public:
int RCM_STATUS = -10;
BOOL WAITING_RECONNECT = FALSE;
BOOL PREVENT_AUTOINJECT = TRUE;
BOOL DELAY_AUTOINJECT = FALSE;
BOOL DELAY_AUTOINJECT = TRUE;
BOOL ASK_FOR_DRIVER = FALSE;
BOOL PAUSE_LKP_DEVICE = FALSE;
BOOL AUTOSTART = FALSE;
BOOL CmdShow;
COLORREF LabelColor = RGB(0, 0, 0);
COLORREF WhiteRGB = RGB(255, 255, 255);
@ -89,16 +90,17 @@ protected:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDestroy();
afx_msg LRESULT OnTrayIconEvent(UINT wParam, LPARAM lParam);
afx_msg LRESULT OnTrayIconEvent(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
afx_msg LRESULT OnQueryEndSession(WPARAM wParm, LPARAM lParm);
public:
void StartTimer();
void StopTimer();
void OnTimer(UINT nIDEvent);
void OnTimer(UINT_PTR nIDEvent);
int STATUS;
afx_msg void BitmapDisplay(int IMG);
afx_msg void OnEnChangePath();
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor);
void ShowWindowCommand();
void HideWindowCommand();
@ -117,9 +119,12 @@ public:
void InjectFav08Command();
void InjectFav09Command();
void InjectFav10Command();
void AutoInjectCommand();
CTegraRcmGUIDlg *m_pMainWnd = this;
private:
MyTabCtrl m_tbCtrl;
TegraRcm *m_TegraRcm;
public:
afx_msg void OnEnChangeLogBox();
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

View file

@ -0,0 +1,3 @@
cd shofel2
imx_usb.exe -c conf/
ping 127.0.0.1 -n 6 > nul

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,14 @@
[load:PH_0]
if=/u-boot.elf
skip=0x00010000
count=0x0006e13f
dst=0x80110000
[load:script]
if=ums_emmc_boot0.scr.img
dst=0x80100000
[boot:ENTRY]
pc=0x80110000
maxMemoryFreq=200
pwroffHoldTime=4

View file

@ -0,0 +1,14 @@
[load:PH_0]
if=/u-boot.elf
skip=0x00010000
count=0x0006e13f
dst=0x80110000
[load:script]
if=ums_emmc_boot1.scr.img
dst=0x80100000
[boot:ENTRY]
pc=0x80110000
maxMemoryFreq=-1600
pwroffHoldTime=4

View file

@ -0,0 +1,13 @@
[load:PH_0]
if=/u-boot.elf
skip=0x00010000
count=0x0006e13f
dst=0x80110000
[load:script]
if=ums_emmc.scr.img
dst=0x80100000
[boot:ENTRY]
pc=0x80110000
pwroffHoldTime=4

View file

@ -0,0 +1 @@
ums 1 mmc 0.0

Binary file not shown.

View file

@ -0,0 +1 @@
ums 1 mmc 0.1

Binary file not shown.

View file

@ -0,0 +1 @@
ums 1 mmc 0.2

Binary file not shown.

View file

@ -1,5 +1,5 @@
[load:PH_0]
if=u-boot.elf
if=/u-boot.elf
skip=0x00010000
count=0x0007c1bf
dst=0x80110000
@ -10,3 +10,4 @@ dst=0x80100000
[boot:ENTRY]
pc=0x80110000
pwroffHoldTime=4

Binary file not shown.

@ -0,0 +1 @@
Subproject commit ed57dd5032840ab7084bcd76e8b9408dd7245958